// Copyright (c) 2008 INRIA Sophia-Antipolis (France). // Aviv University (Israel). All rights reserved. // // This file is part of CGAL (www.cgal.org); you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public License as // published by the Free Software Foundation; either version 3 of the License, // or (at your option) any later version. // // Licensees holding a valid commercial license may use this file in // accordance with the commercial license agreement provided with the software. // // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. // // $URL$ // $Id$ // SPDX-License-Identifier: LGPL-3.0+ // // Author(s) : Sylvain Pion #ifndef CGAL_DIMENSION_H #define CGAL_DIMENSION_H #include #include #include #include #ifdef CGAL_EIGEN3_ENABLED #include #endif namespace CGAL { #ifdef CGAL_EIGEN3_ENABLED const int UNKNOWN_DIMENSION=Eigen::Dynamic; #elif defined CGAL_CXX11 const int UNKNOWN_DIMENSION=std::numeric_limits::max(); #else const int UNKNOWN_DIMENSION=(unsigned)-1/2; #endif // Check that dimension d1 is fine for a kernel of dimension d2. // If d2 is unknown, any d1 is fine. inline bool check_dimension_eq(int d1, int d2){ return d2==UNKNOWN_DIMENSION || d1==d2; } // These tag classes help dispatching functions based on a geometric dimension. template < int dim > struct Dimension_tag { static const int value = dim; }; struct Dynamic_dimension_tag {}; namespace internal { template < typename D > struct Dim_value { static const int value = D::value; }; template <> struct Dim_value {}; } // namespace internal // Ambient_dimension gives access to the dimension of the ambient space of an object. template < typename T, typename K = typename Kernel_traits::Kernel > struct Ambient_dimension : public internal::Dim_value< typename K::template Ambient_dimension::type > { typedef typename K::template Ambient_dimension::type type; }; // Feature_dimension gives access to the dimension of an object. template < typename T, typename K = typename Kernel_traits::Kernel > struct Feature_dimension : public internal::Dim_value< typename K::template Feature_dimension::type > { typedef typename K::template Feature_dimension::type type; }; // Change the dimension templatestruct Increment_dimension { typedef Dynamic_dimension_tag type; }; templatestruct Increment_dimension,i> { typedef Dimension_tag type; }; templatestruct Product_dimension { typedef Dynamic_dimension_tag type; }; templatestruct Product_dimension,Dimension_tag > { typedef Dimension_tag type; }; #ifdef CGAL_EIGEN3_ENABLED // Convert to Eigen's notion of dimension template struct Eigen_dimension { enum { value=Eigen::Dynamic }; }; template struct Eigen_dimension > { enum { value=d }; }; // and convert back template struct Dimension_eigen { typedef Dimension_tag type; }; template <> struct Dimension_eigen { typedef Dynamic_dimension_tag type; }; #endif } //namespace CGAL #endif // CGAL_DIMENSION_H