// Copyright (c) 2008 INRIA Sophia-Antipolis (France). // Aviv University (Israel). All rights reserved. // // This file is part of CGAL (www.cgal.org) // // $URL: https://github.com/CGAL/cgal/blob/v5.1/Kernel_23/include/CGAL/Dimension.h $ // $Id: Dimension.h e9d41d7 2020-04-21T10:03:00+02:00 Maxime Gimeno // SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial // // 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; #else const int UNKNOWN_DIMENSION=(std::numeric_limits::max)(); #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