// Copyright (c) 2007-2015 GeometryFactory (France). All rights reserved. // // $URL$ // $Id$ // SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial // // Author(s) : Andreas Fabri, Fernando Cacciola, Jane Tournois #ifndef CGAL_BOOST_GRAPH_NAMED_PARAMETERS_HELPERS_H #define CGAL_BOOST_GRAPH_NAMED_PARAMETERS_HELPERS_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace CGAL { // forward declarations to avoid dependency to Solver_interface template class Default_diagonalize_traits; class Eigen_svd; class Lapack_svd; struct Alpha_expansion_boost_adjacency_list_tag; // //helper classes template class property_map_selector { public: typedef typename graph_has_property::type Has_internal_pmap; typedef typename boost::mpl::if_c::type, typename boost::cgal_no_property::type >::type type; typedef typename boost::mpl::if_c::const_type, typename boost::cgal_no_property::const_type >::type const_type; type get_pmap(const PropertyTag& p, PolygonMesh& pmesh) { return get_impl(p, pmesh, Has_internal_pmap()); } const_type get_const_pmap(const PropertyTag& p, const PolygonMesh& pmesh) { return get_const_pmap_impl(p, pmesh, Has_internal_pmap()); } private: type get_impl(const PropertyTag&, PolygonMesh&, CGAL::Tag_false) { return type(); //boost::cgal_no_property::type } type get_impl(const PropertyTag& p, PolygonMesh& pmesh, CGAL::Tag_true) { return get(p, pmesh); } const_type get_const_pmap_impl(const PropertyTag& , const PolygonMesh&, CGAL::Tag_false) { return const_type(); //boost::cgal_no_property::type } const_type get_const_pmap_impl(const PropertyTag& p , const PolygonMesh& pmesh, CGAL::Tag_true) { return get(p, pmesh); } }; template typename property_map_selector::type get_property_map(const PropertyTag& p, PolygonMesh& pmesh) { property_map_selector pms; return pms.get_pmap(p, pmesh); } template typename property_map_selector::const_type get_const_property_map(const PropertyTag& p, const PolygonMesh& pmesh) { property_map_selector pms; return pms.get_const_pmap(p, pmesh); } // Shortcut for accessing the value type of the property map template class property_map_value { typedef typename boost::property_map::const_type PMap; public: typedef typename boost::property_traits::value_type type; }; template class GetVertexPointMap { typedef typename property_map_selector::const_type DefaultVPMap_const; typedef typename property_map_selector::type DefaultVPMap; public: typedef typename internal_np::Lookup_named_param_def::type type; typedef typename internal_np::Lookup_named_param_def::type const_type; }; template class GetK { typedef typename boost::property_traits< typename GetVertexPointMap::type>::value_type Point; public: typedef typename CGAL::Kernel_traits::Kernel Kernel; }; template class GetGeomTraits { typedef typename CGAL::graph_has_property::type Has_internal_pmap; typedef typename internal_np::Lookup_named_param_def::type NP_vpm; struct Fake_GT {}; // to be used if there is no internal vertex_point_map in PolygonMesh typedef typename boost::mpl::if_c::value, typename GetK::Kernel, Fake_GT>::type DefaultKernel; public: typedef typename internal_np::Lookup_named_param_def::type type; }; // Define the following structs: // // GetInitializedVertexIndexMap // GetInitializedHalfedgeIndexMap // GetInitializedEdgeIndexMap // GetInitializedFaceIndexMap #define CGAL_DEF_GET_INDEX_TYPE(CTYPE, DTYPE, STYPE) \ template \ struct GetInitialized##CTYPE##IndexMap \ : public BGL::internal::GetInitializedIndexMap, \ Graph, NamedParameters> \ { }; CGAL_DEF_GET_INDEX_TYPE(Vertex, vertex, typename boost::graph_traits::vertices_size_type) CGAL_DEF_GET_INDEX_TYPE(Halfedge, halfedge, typename boost::graph_traits::halfedges_size_type) CGAL_DEF_GET_INDEX_TYPE(Edge, edge, typename boost::graph_traits::edges_size_type) CGAL_DEF_GET_INDEX_TYPE(Face, face, typename boost::graph_traits::faces_size_type) #undef CGAL_DEF_GET_INDEX_TYPE // Define the following functions: // // get_initialized_vertex_index_map() // get_initialized_halfedge_index_map() // get_initialized_edge_index_map() // get_initialized_face_index_map() // // The function returns: // - the index property map passed in the NPs, if passed in the NPs; it must be initialized by the user; // - the internal index property map if it is the graph has one. It is initialized if needed and possible; // - an initialized dynamic pmap otherwise. #define CGAL_DEF_GET_INITIALIZED_INDEX_MAP(DTYPE, STYPE) \ template \ typename BGL::internal::GetInitializedIndexMap, \ Graph, NamedParameters>::const_type \ get_initialized_##DTYPE##_index_map(const Graph& g, \ const NamedParameters& np = parameters::default_values()) \ { \ typedef BGL::internal::GetInitializedIndexMap, \ Graph, NamedParameters> Index_map_getter; \ return Index_map_getter::get_const(CGAL::internal_np::DTYPE##_index_t{}, g, np); \ } \ /* same as above, non-const version*/ \ template ::type>::value, int> = 0> \ typename BGL::internal::GetInitializedIndexMap, \ Graph, NamedParameters>::type \ get_initialized_##DTYPE##_index_map(Graph& g, \ const NamedParameters& np = parameters::default_values()) \ { \ typedef BGL::internal::GetInitializedIndexMap, \ Graph, NamedParameters> Index_map_getter; \ return Index_map_getter::get(CGAL::internal_np::DTYPE##_index_t{}, g, np); \ } \ CGAL_DEF_GET_INITIALIZED_INDEX_MAP(vertex, typename boost::graph_traits::vertices_size_type) CGAL_DEF_GET_INITIALIZED_INDEX_MAP(halfedge, typename boost::graph_traits::halfedges_size_type) CGAL_DEF_GET_INITIALIZED_INDEX_MAP(edge, typename boost::graph_traits::edges_size_type) CGAL_DEF_GET_INITIALIZED_INDEX_MAP(face, typename boost::graph_traits::faces_size_type) #undef CGAL_DEF_GET_INITIALIZED_INDEX_MAP namespace internal { BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(Has_nested_type_iterator, iterator, false) } // namespace internal template::value, typename NP_TAG = internal_np::point_t> class GetPointMap { typedef typename std::iterator_traits::value_type Point; typedef typename CGAL::Identity_property_map DefaultPMap; typedef typename CGAL::Identity_property_map DefaultConstPMap; public: typedef typename internal_np::Lookup_named_param_def::type type; typedef typename internal_np::Lookup_named_param_def::type const_type; }; // to please compiler instantiating non valid overloads template class GetPointMap { struct Dummy_point{}; public: typedef typename CGAL::Identity_property_map type; typedef typename CGAL::Identity_property_map const_type; }; template struct Point_set_processing_3_np_helper { typedef typename std::iterator_traits::value_type Value_type; typedef typename Default::Get>::type DefaultPMap; typedef typename Default::Get>::type DefaultConstPMap; typedef typename internal_np::Lookup_named_param_def ::type Point_map; // public typedef typename internal_np::Lookup_named_param_def ::type Const_point_map; // public typedef typename boost::property_traits::value_type Point; typedef typename Kernel_traits::Kernel Default_geom_traits; typedef typename internal_np::Lookup_named_param_def < internal_np::geom_traits_t, NamedParameters, Default_geom_traits > ::type Geom_traits; // public typedef typename Geom_traits::FT FT; // public typedef Constant_property_map DummyNormalMap; typedef typename Default::Get::type DefaultNMap; typedef typename internal_np::Lookup_named_param_def< internal_np::normal_t, NamedParameters, DefaultNMap > ::type Normal_map; // public static Point_map get_point_map(PointRange&, const NamedParameters& np) { return parameters::choose_parameter(parameters::get_parameter(np, internal_np::point_map)); } static Point_map get_point_map(const NamedParameters& np) { return parameters::choose_parameter(parameters::get_parameter(np, internal_np::point_map)); } static Const_point_map get_const_point_map(const PointRange&, const NamedParameters& np) { return parameters::choose_parameter(parameters::get_parameter(np, internal_np::point_map)); } static Normal_map get_normal_map(const PointRange&, const NamedParameters& np) { return parameters::choose_parameter(parameters::get_parameter(np, internal_np::normal_map)); } static Normal_map get_normal_map(const NamedParameters& np) { return parameters::choose_parameter(parameters::get_parameter(np, internal_np::normal_map)); } static Geom_traits get_geom_traits(const PointRange&, const NamedParameters& np) { return parameters::choose_parameter(parameters::get_parameter(np, internal_np::geom_traits)); } static constexpr bool has_normal_map(const PointRange&, const NamedParameters&) { using CGAL::parameters::is_default_parameter; return !(is_default_parameter::value); } }; namespace Point_set_processing_3 { template struct Fake_point_range { struct iterator { typedef ValueType value_type; typedef std::ptrdiff_t difference_type; typedef ValueType* pointer; typedef ValueType reference; typedef std::random_access_iterator_tag iterator_category; }; }; template class GetPlaneMap { typedef typename PlaneRange::iterator::value_type Plane; typedef typename CGAL::Identity_property_map DefaultPMap; typedef typename CGAL::Identity_property_map DefaultConstPMap; public: typedef typename internal_np::Lookup_named_param_def::type type; typedef typename internal_np::Lookup_named_param_def::type const_type; }; template class GetPlaneIndexMap { typedef Constant_property_map DummyPlaneIndexMap; public: typedef typename internal_np::Lookup_named_param_def::type type; }; template class GetIsConstrainedMap { typedef Static_boolean_property_map< typename std::iterator_traits::value_type, false> Default_map; public: typedef typename internal_np::Lookup_named_param_def::type type; }; template class GetAdjacencies { public: typedef Emptyset_iterator Empty; typedef typename internal_np::Lookup_named_param_def::type type; }; } // namespace Point_set_processing_3 template class GetSolver { public: typedef typename internal_np::Lookup_named_param_def::type type; }; template class GetDiagonalizeTraits { public: typedef typename internal_np::Lookup_named_param_def >::type type; }; template class GetSvdTraits { struct DummySvdTraits { typedef double FT; typedef int Vector; typedef int Matrix; static FT solve (const Matrix&, Vector&) { return 0.; } }; public: typedef DummySvdTraits NoTraits; typedef typename internal_np::Lookup_named_param_def::type type; }; template class GetImplementationTag { public: typedef typename internal_np::Lookup_named_param_def::type type; }; template void set_stream_precision_from_NP(std::ostream& os, const NP& np) { using parameters::get_parameter; using parameters::choose_parameter; using parameters::is_default_parameter; if(!is_default_parameter::value) { const int precision = choose_parameter(get_parameter(np, internal_np::stream_precision)); os.precision(precision); } } } // namespace CGAL #endif // CGAL_BOOST_GRAPH_NAMED_PARAMETERS_HELPERS_H