avoid duplicating properties for Polyhedron

This commit is contained in:
Sébastien Loriot 2022-06-16 13:29:20 +02:00
parent d216c5dfb7
commit 968e9cf5a9
6 changed files with 524 additions and 1014 deletions

View File

@ -0,0 +1,494 @@
// Copyright (c) 2007 GeometryFactory (France). All rights reserved.
//
// This file is part of CGAL (www.cgal.org)
//
// $URL$
// $Id$
// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial
//
//
// Author(s) : Andreas Fabri, Fernando Cacciola
// note only the properties below are protected by the macro,
// the rest of the file is the shared implementation of properties for
// Polyhedron and HalfedgeDS_default
#ifndef CGAL_BOOST_GRAPH_PROPERTIES_HALFEDGEDS_BASE_H
#define CGAL_BOOST_GRAPH_PROPERTIES_HALFEDGEDS_BASE_H
#include <CGAL/boost/graph/properties.h>
#include <CGAL/Unique_hash_map.h>
#include <CGAL/number_utils.h>
#include <memory>
#include <CGAL/boost/graph/internal/Has_member_id.h>
#include <CGAL/Distance_3/Point_3_Point_3.h>
namespace CGAL {
namespace internal {
template<class Handle>
class HDS_index_map_external
: public boost::put_get_helper<std::size_t&, HDS_index_map_external<Handle> >
{
public:
typedef boost::lvalue_property_map_tag category;
typedef std::size_t value_type;
typedef std::size_t& reference;
typedef Handle key_type;
private:
typedef CGAL::Unique_hash_map<key_type,std::size_t> Map;
public:
template <typename InputIterator>
HDS_index_map_external(InputIterator begin, InputIterator end, std::size_t max)
: map_(new Map(begin, end, 0, std::size_t(-1), max)) {}
reference operator[](const key_type& k) const { return (*map_)[k]; }
private:
std::shared_ptr<Map> map_;
};
// Special case for edges.
template<class Polyhedron>
class HDS_edge_index_map_external
: public boost::put_get_helper<std::size_t&, HDS_edge_index_map_external<Polyhedron> >
{
public:
typedef boost::lvalue_property_map_tag category;
typedef std::size_t value_type;
typedef std::size_t& reference;
typedef typename boost::graph_traits<Polyhedron>::edge_descriptor key_type;
private:
typedef CGAL::Unique_hash_map<key_type,std::size_t> Map;
public:
HDS_edge_index_map_external(Polyhedron& p)
: map_(new Map(std::size_t(-1), num_halfedges(p)))
{
unsigned int data = 0;
typename boost::graph_traits<Polyhedron>::edge_iterator it, end;
for(boost::tie(it, end) = edges(p); it != end; ++it, ++data)
(*map_)[*it] = data;
}
reference operator[](const key_type& k) const { return (*map_)[k]; }
private:
std::shared_ptr<Map> map_;
};
template<typename Handle, typename FT>
struct HDS_wrap_squared
{
typedef FT value_type;
typedef FT reference;
typedef Handle key_type;
typedef boost::readable_property_map_tag category;
template<typename E>
FT operator[](const E& e) const {
return approximate_sqrt(CGAL::squared_distance(e.halfedge()->vertex()->point(),
e.halfedge()->opposite()->vertex()->point()));
}
friend inline
value_type get(const HDS_wrap_squared& m, const key_type k)
{
return m[k];
}
};
}
// the tag we dispatch on from property_map<G, Property>
template <class HDS, class Tag>
struct HDS_property_map {};
} // end of CGAL::internal namespace
#endif // CGAL_BOOST_GRAPH_PROPERTIES_HALFEDGEDS_BASE_H
#if !defined(HDS_TMPLT) || ! defined(HDS_CLASS)
#error HDS_TMPLT or HDS_CLASS is not defined
#endif
namespace CGAL {
// generalized 2-ary get functions
template<class HDS_TMPLT, class PropertyTag>
typename boost::property_map<HDS_CLASS, PropertyTag >::const_type
get(PropertyTag,HDS_CLASS const&)
{ return typename boost::property_map<HDS_CLASS, PropertyTag >::const_type(); }
template<class HDS_TMPLT, class PropertyTag>
typename boost::property_map<HDS_CLASS, PropertyTag >::type
get(PropertyTag,HDS_CLASS&)
{ return typename boost::property_map<HDS_CLASS, PropertyTag >::type(); }
// generalized 3-ary get functions
template<class HDS_TMPLT, class PropertyTag, class Key>
typename boost::property_traits< typename boost::property_map<HDS_CLASS, PropertyTag >::type >::reference
get(PropertyTag p,HDS_CLASS& g, const Key& key)
{ return get(get(p, g), key); }
template<class HDS_TMPLT, class PropertyTag, class Key>
typename boost::property_traits< typename boost::property_map<HDS_CLASS, PropertyTag >::const_type >::reference
get(PropertyTag p,HDS_CLASS const& g, const Key& key)
{ return get(get(p, g), key); }
#define DECLARE_HDS_DYNAMIC_PM(TAG, DESCRIPTOR) \
template <typename HDS_TMPLT, class T> \
typename boost::property_map<HDS_CLASS, TAG >::const_type \
get(const TAG&, const HDS_CLASS&) \
{ \
typedef typename boost::graph_traits< HDS_CLASS >::DESCRIPTOR descriptor; \
return internal::Dynamic_property_map<descriptor,T>(); \
}
DECLARE_HDS_DYNAMIC_PM(dynamic_vertex_property_t<T>, vertex_descriptor)
DECLARE_HDS_DYNAMIC_PM(dynamic_halfedge_property_t<T>, halfedge_descriptor)
DECLARE_HDS_DYNAMIC_PM(dynamic_edge_property_t<T>, edge_descriptor)
DECLARE_HDS_DYNAMIC_PM(dynamic_face_property_t<T>, face_descriptor)
#undef DECLARE_HDS_DYNAMIC_PM
// generalized put
template<class HDS_TMPLT, class PropertyTag, class Key,class Value>
void put(PropertyTag p,HDS_CLASS& g, const Key& key, const Value& value)
{
typedef typename boost::property_map<HDS_CLASS, PropertyTag>::type Map;
Map pmap = get(p, g);
put(pmap, key, value);
}
// specialization needs to be repeated for halfedge, vertex, face
#define DECLARE_HDS_INDEX_PM(ENTITY, TAG, ACCESSOR) \
template<class HDS_TMPLT> \
struct HDS_property_map<HDS_CLASS, \
boost::ENTITY##TAG> { \
struct bind_ { \
typedef internal::ACCESSOR##_accessor< \
HDS_CLASS, \
typename boost::graph_traits< HDS_CLASS \
>::ENTITY##_descriptor > type;\
typedef type const_type; \
}; \
};
DECLARE_HDS_INDEX_PM(halfedge, _index_t, Index)
DECLARE_HDS_INDEX_PM(vertex, _index_t, Index)
DECLARE_HDS_INDEX_PM(face, _index_t, Index)
} // end of CGAL namespace
#undef DECLARE_HDS_INDEX_PM
namespace CGAL {
// not done with macros, because HDS_edge::id does not return a
// reference
template<class HDS_TMPLT>
struct HDS_property_map<HDS_CLASS, boost::edge_index_t>
{
struct bind_
{
typedef internal::Edge_index_accessor<
typename boost::graph_traits<
HDS_CLASS
>::edge_descriptor > type;
typedef type const_type;
};
};
template<class HDS_TMPLT>
struct HDS_property_map<HDS_CLASS, boost::edge_weight_t>
{
struct bind_
{
typedef typename HDS_CLASS::Traits::FT FT;
typedef typename boost::graph_traits<HDS_CLASS >::edge_descriptor edge_descriptor;
typedef internal::HDS_wrap_squared<edge_descriptor,FT> type;
typedef type const_type;
};
};
template<class HDS_TMPLT>
struct HDS_property_map<HDS_CLASS,vertex_point_t>
{
struct bind_
{
typedef internal::Point_accessor<
typename boost::graph_traits<
HDS_CLASS
>::vertex_descriptor,
typename Gt::Point_3, typename Gt::Point_3&> type;
typedef internal::Point_accessor<
typename boost::graph_traits<
HDS_CLASS
>::vertex_descriptor,
typename Gt::Point_3, const typename Gt::Point_3&> const_type;
};
};
//
// external indices
//
template<class HDS_TMPLT>
struct HDS_property_map<HDS_CLASS, edge_external_index_t>
{
struct bind_
{
typedef internal::HDS_edge_index_map_external<
HDS_CLASS
> type;
typedef type const_type;
};
};
template<class HDS_TMPLT>
struct HDS_property_map<HDS_CLASS, halfedge_external_index_t>
{
struct bind_
{
typedef internal::HDS_index_map_external<
typename boost::graph_traits<
HDS_CLASS
>::halfedge_descriptor > type;
typedef type const_type;
};
};
template<class HDS_TMPLT>
struct HDS_property_map<HDS_CLASS, vertex_external_index_t>
{
struct bind_
{
typedef internal::HDS_index_map_external<
typename boost::graph_traits<
HDS_CLASS
>::vertex_descriptor > type;
typedef type const_type;
};
};
template<class HDS_TMPLT>
struct HDS_property_map<HDS_CLASS, face_external_index_t>
{
struct bind_
{
typedef internal::HDS_index_map_external<
typename boost::graph_traits<
HDS_CLASS
>::face_descriptor > type;
typedef type const_type;
};
};
template<class HDS_TMPLT>
typename boost::property_map<HDS_CLASS, boost::edge_external_index_t >::const_type
get(boost::edge_external_index_t,HDS_CLASS const& p)
{
return typename boost::property_map<HDS_CLASS, boost::edge_external_index_t >::const_type(
const_cast<HDS_CLASS& >(p));
}
template<class HDS_TMPLT>
typename boost::property_map<HDS_CLASS, boost::halfedge_external_index_t >::const_type
get(boost::halfedge_external_index_t,HDS_CLASS const& p)
{
HDS_CLASS& ncp = const_cast<HDS_CLASS&>(p);
return typename boost::property_map<HDS_CLASS, boost::halfedge_external_index_t >::const_type(
ncp.halfedges_begin(), ncp.halfedges_end(), ncp.size_of_halfedges());
}
template<class HDS_TMPLT>
typename boost::property_map<HDS_CLASS, boost::vertex_external_index_t >::const_type
get(boost::vertex_external_index_t,HDS_CLASS const& p)
{
HDS_CLASS& ncp = const_cast<HDS_CLASS&>(p);
return typename boost::property_map<HDS_CLASS, boost::vertex_external_index_t >::const_type(
ncp.vertices_begin(), ncp.vertices_end(), ncp.size_of_vertices());
}
template<class HDS_TMPLT>
typename boost::property_map<HDS_CLASS, boost::face_external_index_t >::const_type
get(boost::face_external_index_t,HDS_CLASS const& p)
{
HDS_CLASS& ncp = const_cast<HDS_CLASS&>(p);
return typename boost::property_map<HDS_CLASS, boost::face_external_index_t >::const_type(
ncp.facets_begin(), ncp.facets_end(), ncp.size_of_facets());
}
// the same blurb for non-const
template<class HDS_TMPLT>
typename boost::property_map<HDS_CLASS, boost::edge_external_index_t >::type
get(boost::edge_external_index_t,HDS_CLASS& p)
{
return typename boost::property_map<HDS_CLASS, boost::edge_external_index_t >::type(
p);
}
template<class HDS_TMPLT>
typename boost::property_map<HDS_CLASS, boost::halfedge_external_index_t >::type
get(boost::halfedge_external_index_t,HDS_CLASS & ncp)
{
return typename boost::property_map<HDS_CLASS, boost::halfedge_external_index_t >::type(
ncp.halfedges_begin(), ncp.halfedges_end(), ncp.size_of_halfedges());
}
template<class HDS_TMPLT>
typename boost::property_map<HDS_CLASS, boost::vertex_external_index_t >::type
get(boost::vertex_external_index_t,HDS_CLASS & ncp)
{
return typename boost::property_map<HDS_CLASS, boost::vertex_external_index_t >::type(
ncp.vertices_begin(), ncp.vertices_end(), ncp.size_of_vertices());
}
template<class HDS_TMPLT>
typename boost::property_map<HDS_CLASS, boost::face_external_index_t >::type
get(boost::face_external_index_t,HDS_CLASS & ncp)
{
return typename boost::property_map<HDS_CLASS, boost::face_external_index_t >::type(
ncp.facets_begin(), ncp.facets_end(), ncp.size_of_facets());
}
} // end of CGAL namespace
namespace boost {
// property_map dispatcher into Polyhedron
template<class HDS_TMPLT, class Tag>
struct property_map<HDS_CLASS, Tag>
{
typedef typename CGAL::HDS_property_map<HDS_CLASS, Tag>::
bind_ map_gen;
typedef typename map_gen::type type;
typedef typename map_gen::const_type const_type;
};
// property_map dispatcher into const Polyhedron
template<class HDS_TMPLT, class Tag>
struct property_map<const HDS_CLASS, Tag>
{
typedef typename CGAL::HDS_property_map<HDS_CLASS, Tag>::
bind_ map_gen;
typedef typename map_gen::type type;
typedef typename map_gen::const_type const_type;
};
template<class HDS_TMPLT, class T>
struct property_map<HDS_CLASS, CGAL::dynamic_vertex_property_t<T> >
{
typedef HDS_CLASS G;
typedef typename boost::graph_traits<G>::vertex_descriptor vertex_descriptor;
typedef CGAL::internal::Dynamic_property_map<vertex_descriptor,T> type;
typedef type const_type;
};
template<class HDS_TMPLT, class T>
struct property_map<HDS_CLASS, CGAL::dynamic_halfedge_property_t<T> >
{
typedef HDS_CLASS G;
typedef typename boost::graph_traits<G>::halfedge_descriptor halfedge_descriptor;
typedef CGAL::internal::Dynamic_property_map<halfedge_descriptor,T> type;
typedef type const_type;
};
template<class HDS_TMPLT, class T>
struct property_map<HDS_CLASS, CGAL::dynamic_edge_property_t<T> >
{
typedef HDS_CLASS G;
typedef typename boost::graph_traits<G>::edge_descriptor edge_descriptor;
typedef CGAL::internal::Dynamic_property_map<edge_descriptor,T> type;
typedef type const_type;
};
template<class HDS_TMPLT, class T>
struct property_map<HDS_CLASS, CGAL::dynamic_face_property_t<T> >
{
typedef HDS_CLASS G;
typedef typename boost::graph_traits<G>::face_descriptor face_descriptor;
typedef CGAL::internal::Dynamic_property_map<face_descriptor,T> type;
typedef type const_type;
};
// What are those needed for ???
template<class HDS_TMPLT>
struct edge_property_type<HDS_CLASS >
{
typedef edge_weight_t type;
};
template<class HDS_TMPLT>
struct vertex_property_type<HDS_CLASS >
{
typedef CGAL::vertex_point_t type;
};
template<class HDS_TMPLT>
struct vertex_property_type<const HDS_CLASS >
{
typedef CGAL::vertex_point_t type;
};
} // end of boost namespace
namespace CGAL{
template<class HDS_TMPLT>
struct graph_has_property<HDS_CLASS, boost::vertex_point_t>
: CGAL::Tag_true {};
template<class HDS_TMPLT>
struct graph_has_property<HDS_CLASS, boost::edge_weight_t>
: CGAL::Tag_true {};
template<class HDS_TMPLT>
struct graph_has_property<HDS_CLASS, boost::edge_index_t>
: CGAL::Boolean_tag<
CGAL::internal::Has_member_id<
typename boost::graph_traits<HDS_CLASS >::edge_descriptor
>::value
>
{};
template<class HDS_TMPLT>
struct graph_has_property<HDS_CLASS, boost::face_index_t>
: CGAL::Boolean_tag<
CGAL::internal::Has_member_id<
typename HDS_CLASS::Facet
>::value
>
{};
template<class HDS_TMPLT>
struct graph_has_property<HDS_CLASS, boost::halfedge_index_t>
: CGAL::Boolean_tag<
CGAL::internal::Has_member_id<
typename HDS_CLASS::Halfedge
>::value
>
{};
template<class HDS_TMPLT>
struct graph_has_property<HDS_CLASS, boost::vertex_index_t>
: CGAL::Boolean_tag<
CGAL::internal::Has_member_id<
typename HDS_CLASS::Vertex
>::value
>
{};
}// end of CGAL namespace
#undef HDS_TMPLT
#undef HDS_CLASS

View File

@ -12,497 +12,9 @@
#ifndef CGAL_BOOST_GRAPH_PROPERTIES_HALFEDGEDS_DEFAULT_H
#define CGAL_BOOST_GRAPH_PROPERTIES_HALFEDGEDS_DEFAULT_H
#include <CGAL/boost/graph/properties.h>
#include <CGAL/boost/graph/graph_traits_HalfedgeDS_default.h>
#include <CGAL/Unique_hash_map.h>
#include <CGAL/number_utils.h>
#include <memory>
#include <CGAL/boost/graph/internal/Has_member_id.h>
#include <CGAL/Distance_3/Point_3_Point_3.h>
namespace CGAL {
namespace internal {
template<class Handle>
class HDS_index_map_external
: public boost::put_get_helper<std::size_t&, HDS_index_map_external<Handle> >
{
public:
typedef boost::lvalue_property_map_tag category;
typedef std::size_t value_type;
typedef std::size_t& reference;
typedef Handle key_type;
private:
typedef CGAL::Unique_hash_map<key_type,std::size_t> Map;
public:
template <typename InputIterator>
HDS_index_map_external(InputIterator begin, InputIterator end, std::size_t max)
: map_(new Map(begin, end, 0, std::size_t(-1), max)) {}
reference operator[](const key_type& k) const { return (*map_)[k]; }
private:
std::shared_ptr<Map> map_;
};
// Special case for edges.
template<class Polyhedron>
class HDS_edge_index_map_external
: public boost::put_get_helper<std::size_t&, HDS_edge_index_map_external<Polyhedron> >
{
public:
typedef boost::lvalue_property_map_tag category;
typedef std::size_t value_type;
typedef std::size_t& reference;
typedef typename boost::graph_traits<Polyhedron>::edge_descriptor key_type;
private:
typedef CGAL::Unique_hash_map<key_type,std::size_t> Map;
public:
HDS_edge_index_map_external(Polyhedron& p)
: map_(new Map(std::size_t(-1), num_halfedges(p)))
{
unsigned int data = 0;
typename boost::graph_traits<Polyhedron>::edge_iterator it, end;
for(boost::tie(it, end) = edges(p); it != end; ++it, ++data)
(*map_)[*it] = data;
}
reference operator[](const key_type& k) const { return (*map_)[k]; }
private:
std::shared_ptr<Map> map_;
};
template<typename Handle, typename FT>
struct HDS_wrap_squared
{
typedef FT value_type;
typedef FT reference;
typedef Handle key_type;
typedef boost::readable_property_map_tag category;
template<typename E>
FT operator[](const E& e) const {
return approximate_sqrt(CGAL::squared_distance(e.halfedge()->vertex()->point(),
e.halfedge()->opposite()->vertex()->point()));
}
friend inline
value_type get(const HDS_wrap_squared& m, const key_type k)
{
return m[k];
}
};
} // internal
// the tag we dispatch on from property_map<G, Property>
template <class Tag>
struct HDS_property_map {};
} // namespace CGAL
namespace CGAL {
// generalized 2-ary get functions
template<class Gt, class I, class A, class PropertyTag>
typename boost::property_map<CGAL::HalfedgeDS_default<Gt,I,A>, PropertyTag >::const_type
get(PropertyTag,CGAL::HalfedgeDS_default<Gt,I,A> const&)
{ return typename boost::property_map<CGAL::HalfedgeDS_default<Gt,I,A>, PropertyTag >::const_type(); }
template<class Gt, class I, class A, class PropertyTag>
typename boost::property_map<CGAL::HalfedgeDS_default<Gt,I,A>, PropertyTag >::type
get(PropertyTag,CGAL::HalfedgeDS_default<Gt,I,A>&)
{ return typename boost::property_map<CGAL::HalfedgeDS_default<Gt,I,A>, PropertyTag >::type(); }
// generalized 3-ary get functions
template<class Gt, class I, class A, class PropertyTag, class Key>
typename boost::property_traits< typename boost::property_map<CGAL::HalfedgeDS_default<Gt,I,A>, PropertyTag >::type >::reference
get(PropertyTag p,CGAL::HalfedgeDS_default<Gt,I,A>& g, const Key& key)
{ return get(get(p, g), key); }
template<class Gt, class I, class A, class PropertyTag, class Key>
typename boost::property_traits< typename boost::property_map<CGAL::HalfedgeDS_default<Gt,I,A>, PropertyTag >::const_type >::reference
get(PropertyTag p,CGAL::HalfedgeDS_default<Gt,I,A> const& g, const Key& key)
{ return get(get(p, g), key); }
#define CGAL_POLYHEDRON_DYNAMIC_PM(TAG, DESCRIPTOR) \
template <typename T, typename Gt, typename I, typename A> \
typename boost::property_map<HalfedgeDS_default<Gt,I,A>, TAG >::const_type \
get(const TAG&, const HalfedgeDS_default<Gt,I,A>&) \
{ \
typedef typename boost::graph_traits< HalfedgeDS_default<Gt,I,A> >::DESCRIPTOR descriptor; \
return internal::Dynamic_property_map<descriptor,T>(); \
}
CGAL_POLYHEDRON_DYNAMIC_PM(dynamic_vertex_property_t<T>, vertex_descriptor)
CGAL_POLYHEDRON_DYNAMIC_PM(dynamic_halfedge_property_t<T>, halfedge_descriptor)
CGAL_POLYHEDRON_DYNAMIC_PM(dynamic_edge_property_t<T>, edge_descriptor)
CGAL_POLYHEDRON_DYNAMIC_PM(dynamic_face_property_t<T>, face_descriptor)
#undef CGAL_POLYHEDRON_DYNAMIC_PM
// generalized put
template<class Gt, class I, class A, class PropertyTag, class Key,class Value>
void put(PropertyTag p,CGAL::HalfedgeDS_default<Gt,I,A>& g, const Key& key, const Value& value)
{
typedef typename boost::property_map<CGAL::HalfedgeDS_default<Gt,I,A>, PropertyTag>::type Map;
Map pmap = get(p, g);
put(pmap, key, value);
}
} // CGAL
// specialization needs to be repeated for halfedge, vertex, face
#define CGAL_POLYHEDRON_INDEX_PM(ENTITY, TAG, ACCESSOR) \
namespace CGAL { \
template<> struct HDS_property_map<boost::ENTITY##TAG> { \
template<class Gt, class I, class A> \
struct bind_ { \
typedef internal::ACCESSOR##_accessor< \
CGAL::HalfedgeDS_default<Gt, I, A>, \
typename boost::graph_traits< CGAL::HalfedgeDS_default<Gt, I, A> \
>::ENTITY##_descriptor > type; \
typedef type const_type; \
}; \
}; \
} //CGAL
CGAL_POLYHEDRON_INDEX_PM(halfedge, _index_t, Index)
CGAL_POLYHEDRON_INDEX_PM(vertex, _index_t, Index)
CGAL_POLYHEDRON_INDEX_PM(face, _index_t, Index)
#undef CGAL_POLYHEDRON_INDEX_PM
namespace CGAL {
// not done with macros, because HDS_edge::id does not return a
// reference
template <>
struct HDS_property_map<boost::edge_index_t>
{
template<class Gt, class I, class A>
struct bind_
{
typedef internal::Edge_index_accessor<
typename boost::graph_traits<
CGAL::HalfedgeDS_default<Gt, I, A>
>::edge_descriptor > type;
typedef type const_type;
};
};
template <>
struct HDS_property_map<boost::edge_weight_t>
{
template<class Gt, class I, class A>
struct bind_
{
typedef typename CGAL::HalfedgeDS_default<Gt,I,A>::Traits::FT FT;
typedef typename boost::graph_traits<CGAL::HalfedgeDS_default<Gt,I,A> >::edge_descriptor edge_descriptor;
typedef internal::HDS_wrap_squared<edge_descriptor,FT> type;
typedef type const_type;
};
};
template <>
struct HDS_property_map<vertex_point_t>
{
template<class Gt, class I, class A>
struct bind_
{
typedef internal::Point_accessor<
typename boost::graph_traits<
CGAL::HalfedgeDS_default<Gt,I,A>
>::vertex_descriptor,
typename Gt::Point_3, typename Gt::Point_3&> type;
typedef internal::Point_accessor<
typename boost::graph_traits<
CGAL::HalfedgeDS_default<Gt,I,A>
>::vertex_descriptor,
typename Gt::Point_3, const typename Gt::Point_3&> const_type;
};
};
//
// external indices
//
template <>
struct HDS_property_map<edge_external_index_t>
{
template<class Gt, class I, class A>
struct bind_
{
typedef internal::HDS_edge_index_map_external<
CGAL::HalfedgeDS_default<Gt,I,A>
> type;
typedef type const_type;
};
};
template <>
struct HDS_property_map<halfedge_external_index_t>
{
template<class Gt, class I, class A>
struct bind_
{
typedef internal::HDS_index_map_external<
typename boost::graph_traits<
CGAL::HalfedgeDS_default<Gt,I,A>
>::halfedge_descriptor > type;
typedef type const_type;
};
};
template <>
struct HDS_property_map<vertex_external_index_t>
{
template<class Gt, class I, class A>
struct bind_
{
typedef internal::HDS_index_map_external<
typename boost::graph_traits<
CGAL::HalfedgeDS_default<Gt,I,A>
>::vertex_descriptor > type;
typedef type const_type;
};
};
template <>
struct HDS_property_map<face_external_index_t>
{
template<class Gt, class I, class A>
struct bind_
{
typedef internal::HDS_index_map_external<
typename boost::graph_traits<
CGAL::HalfedgeDS_default<Gt,I,A>
>::face_descriptor > type;
typedef type const_type;
};
};
} // CGAL
namespace CGAL {
template<class Gt, class I, class A>
typename boost::property_map<CGAL::HalfedgeDS_default<Gt,I,A>, boost::edge_external_index_t >::const_type
get(boost::edge_external_index_t,CGAL::HalfedgeDS_default<Gt,I,A> const& p)
{
return typename boost::property_map<CGAL::HalfedgeDS_default<Gt,I,A>, boost::edge_external_index_t >::const_type(
const_cast<CGAL::HalfedgeDS_default<Gt,I,A>& >(p));
}
template<class Gt, class I, class A>
typename boost::property_map<CGAL::HalfedgeDS_default<Gt,I,A>, boost::halfedge_external_index_t >::const_type
get(boost::halfedge_external_index_t,CGAL::HalfedgeDS_default<Gt,I,A> const& p)
{
CGAL::HalfedgeDS_default<Gt,I,A>& ncp = const_cast<CGAL::HalfedgeDS_default<Gt,I,A>&>(p);
return typename boost::property_map<CGAL::HalfedgeDS_default<Gt,I,A>, boost::halfedge_external_index_t >::const_type(
ncp.halfedges_begin(), ncp.halfedges_end(), ncp.size_of_halfedges());
}
template<class Gt, class I, class A>
typename boost::property_map<CGAL::HalfedgeDS_default<Gt,I,A>, boost::vertex_external_index_t >::const_type
get(boost::vertex_external_index_t,CGAL::HalfedgeDS_default<Gt,I,A> const& p)
{
CGAL::HalfedgeDS_default<Gt,I,A>& ncp = const_cast<CGAL::HalfedgeDS_default<Gt,I,A>&>(p);
return typename boost::property_map<CGAL::HalfedgeDS_default<Gt,I,A>, boost::vertex_external_index_t >::const_type(
ncp.vertices_begin(), ncp.vertices_end(), ncp.size_of_vertices());
}
template<class Gt, class I, class A>
typename boost::property_map<CGAL::HalfedgeDS_default<Gt,I,A>, boost::face_external_index_t >::const_type
get(boost::face_external_index_t,CGAL::HalfedgeDS_default<Gt,I,A> const& p)
{
CGAL::HalfedgeDS_default<Gt,I,A>& ncp = const_cast<CGAL::HalfedgeDS_default<Gt,I,A>&>(p);
return typename boost::property_map<CGAL::HalfedgeDS_default<Gt,I,A>, boost::face_external_index_t >::const_type(
ncp.facets_begin(), ncp.facets_end(), ncp.size_of_facets());
}
// the same blurb for non-const
template<class Gt, class I, class A>
typename boost::property_map<CGAL::HalfedgeDS_default<Gt,I,A>, boost::edge_external_index_t >::type
get(boost::edge_external_index_t,CGAL::HalfedgeDS_default<Gt,I,A>& p)
{
return typename boost::property_map<CGAL::HalfedgeDS_default<Gt,I,A>, boost::edge_external_index_t >::type(
p);
}
template<class Gt, class I, class A>
typename boost::property_map<CGAL::HalfedgeDS_default<Gt,I,A>, boost::halfedge_external_index_t >::type
get(boost::halfedge_external_index_t,CGAL::HalfedgeDS_default<Gt,I,A> & ncp)
{
return typename boost::property_map<CGAL::HalfedgeDS_default<Gt,I,A>, boost::halfedge_external_index_t >::type(
ncp.halfedges_begin(), ncp.halfedges_end(), ncp.size_of_halfedges());
}
template<class Gt, class I, class A>
typename boost::property_map<CGAL::HalfedgeDS_default<Gt,I,A>, boost::vertex_external_index_t >::type
get(boost::vertex_external_index_t,CGAL::HalfedgeDS_default<Gt,I,A> & ncp)
{
return typename boost::property_map<CGAL::HalfedgeDS_default<Gt,I,A>, boost::vertex_external_index_t >::type(
ncp.vertices_begin(), ncp.vertices_end(), ncp.size_of_vertices());
}
template<class Gt, class I, class A>
typename boost::property_map<CGAL::HalfedgeDS_default<Gt,I,A>, boost::face_external_index_t >::type
get(boost::face_external_index_t,CGAL::HalfedgeDS_default<Gt,I,A> & ncp)
{
return typename boost::property_map<CGAL::HalfedgeDS_default<Gt,I,A>, boost::face_external_index_t >::type(
ncp.facets_begin(), ncp.facets_end(), ncp.size_of_facets());
}
} // namespace CGAL
namespace boost {
// property_map dispatcher into Polyhedron
template<class Gt, class I, class A, class Tag>
struct property_map<CGAL::HalfedgeDS_default<Gt,I,A>, Tag>
{
typedef typename CGAL::HDS_property_map<Tag>::
template bind_<Gt,I,A> map_gen;
typedef typename map_gen::type type;
typedef typename map_gen::const_type const_type;
};
// property_map dispatcher into const Polyhedron
template<class Gt, class I, class A, class Tag>
struct property_map<const CGAL::HalfedgeDS_default<Gt,I,A>, Tag>
{
typedef typename CGAL::HDS_property_map<Tag>::
template bind_<Gt,I,A> map_gen;
typedef typename map_gen::type type;
typedef typename map_gen::const_type const_type;
};
template<class Gt, class I, class A, class T>
struct property_map<CGAL::HalfedgeDS_default<Gt,I,A>, CGAL::dynamic_vertex_property_t<T> >
{
typedef CGAL::HalfedgeDS_default<Gt,I,A> G;
typedef typename boost::graph_traits<G>::vertex_descriptor vertex_descriptor;
typedef CGAL::internal::Dynamic_property_map<vertex_descriptor,T> type;
typedef type const_type;
};
template<class Gt, class I, class A, class T>
struct property_map<CGAL::HalfedgeDS_default<Gt,I,A>, CGAL::dynamic_halfedge_property_t<T> >
{
typedef CGAL::HalfedgeDS_default<Gt,I,A> G;
typedef typename boost::graph_traits<G>::halfedge_descriptor halfedge_descriptor;
typedef CGAL::internal::Dynamic_property_map<halfedge_descriptor,T> type;
typedef type const_type;
};
template<class Gt, class I, class A, class T>
struct property_map<CGAL::HalfedgeDS_default<Gt,I,A>, CGAL::dynamic_edge_property_t<T> >
{
typedef CGAL::HalfedgeDS_default<Gt,I,A> G;
typedef typename boost::graph_traits<G>::edge_descriptor edge_descriptor;
typedef CGAL::internal::Dynamic_property_map<edge_descriptor,T> type;
typedef type const_type;
};
template<class Gt, class I, class A, class T>
struct property_map<CGAL::HalfedgeDS_default<Gt,I,A>, CGAL::dynamic_face_property_t<T> >
{
typedef CGAL::HalfedgeDS_default<Gt,I,A> G;
typedef typename boost::graph_traits<G>::face_descriptor face_descriptor;
typedef CGAL::internal::Dynamic_property_map<face_descriptor,T> type;
typedef type const_type;
};
// What are those needed for ???
template<class Gt, class I, class A>
struct edge_property_type<CGAL::HalfedgeDS_default<Gt,I,A> >
{
typedef edge_weight_t type;
};
template<class Gt, class I, class A>
struct vertex_property_type<CGAL::HalfedgeDS_default<Gt,I,A> >
{
typedef CGAL::vertex_point_t type;
};
template<class Gt, class I, class A>
struct vertex_property_type<const CGAL::HalfedgeDS_default<Gt,I,A> >
{
typedef CGAL::vertex_point_t type;
};
} // namespace boost
namespace CGAL{
template<class Gt, class I, class A>
struct graph_has_property<CGAL::HalfedgeDS_default<Gt,I,A>, boost::vertex_point_t>
: CGAL::Tag_true {};
template<class Gt, class I, class A>
struct graph_has_property<CGAL::HalfedgeDS_default<Gt,I,A>, boost::edge_weight_t>
: CGAL::Tag_true {};
template<class Gt, class I, class A>
struct graph_has_property<CGAL::HalfedgeDS_default<Gt,I,A>, boost::edge_index_t>
: CGAL::Boolean_tag<
CGAL::internal::Has_member_id<
typename boost::graph_traits<CGAL::HalfedgeDS_default<Gt,I,A> >::edge_descriptor
>::value
>
{};
template<class Gt, class I, class A>
struct graph_has_property<CGAL::HalfedgeDS_default<Gt,I,A>, boost::face_index_t>
: CGAL::Boolean_tag<
CGAL::internal::Has_member_id<
typename CGAL::HalfedgeDS_default<Gt,I,A>::Facet
>::value
>
{};
template<class Gt, class I, class A>
struct graph_has_property<CGAL::HalfedgeDS_default<Gt,I,A>, boost::halfedge_index_t>
: CGAL::Boolean_tag<
CGAL::internal::Has_member_id<
typename CGAL::HalfedgeDS_default<Gt,I,A>::Halfedge
>::value
>
{};
template<class Gt, class I, class A>
struct graph_has_property<CGAL::HalfedgeDS_default<Gt,I,A>, boost::vertex_index_t>
: CGAL::Boolean_tag<
CGAL::internal::Has_member_id<
typename CGAL::HalfedgeDS_default<Gt,I,A>::Vertex
>::value
>
{};
}// end CGAL
#undef CGAL_HDS_PARAM_
#define HDS_TMPLT Gt, class I, class A
#define HDS_CLASS CGAL::HalfedgeDS_default<Gt,I,A>
#include <CGAL/boost/graph/properties_HalfedgeDS_base.h>
#endif // CGAL_BOOST_GRAPH_PROPERTIES_HALFEDGEDS_DEFAULT_H

View File

@ -491,10 +491,9 @@ namespace boost {
#endif //CGAL_NO_DEPRECATED_CODE
#undef CGAL_HDS_PARAM_
#include <CGAL/boost/graph/properties_Polyhedron_3.h>
#include <CGAL/boost/graph/properties_Polyhedron_3_time_stamp.h>
#include <CGAL/boost/graph/properties_Polyhedron_3_features.h>
#undef CGAL_HDS_PARAM_
#endif // CGAL_BOOST_GRAPH_GRAPH_TRAITS_POLYHEDRON_3_H

View File

@ -12,497 +12,9 @@
#ifndef CGAL_BOOST_GRAPH_PROPERTIES_POLYHEDRON_3_H
#define CGAL_BOOST_GRAPH_PROPERTIES_POLYHEDRON_3_H
#include <CGAL/boost/graph/properties.h>
#include <CGAL/boost/graph/graph_traits_Polyhedron_3.h>
#include <CGAL/Unique_hash_map.h>
#include <CGAL/number_utils.h>
#include <memory>
#include <CGAL/boost/graph/internal/Has_member_id.h>
#include <CGAL/Distance_3/Point_3_Point_3.h>
#define CGAL_HDS_PARAM_ template < class Traits, class Items, class Alloc> class HDS
namespace CGAL {
namespace internal {
template<class Handle>
class Polyhedron_index_map_external
: public boost::put_get_helper<std::size_t&, Polyhedron_index_map_external<Handle> >
{
public:
typedef boost::lvalue_property_map_tag category;
typedef std::size_t value_type;
typedef std::size_t& reference;
typedef Handle key_type;
private:
typedef CGAL::Unique_hash_map<key_type,std::size_t> Map;
public:
template <typename InputIterator>
Polyhedron_index_map_external(InputIterator begin, InputIterator end, std::size_t max)
: map_(new Map(begin, end, 0, std::size_t(-1), max)) {}
reference operator[](const key_type& k) const { return (*map_)[k]; }
private:
std::shared_ptr<Map> map_;
};
// Special case for edges.
template<class Polyhedron>
class Polyhedron_edge_index_map_external
: public boost::put_get_helper<std::size_t&, Polyhedron_edge_index_map_external<Polyhedron> >
{
public:
typedef boost::lvalue_property_map_tag category;
typedef std::size_t value_type;
typedef std::size_t& reference;
typedef typename boost::graph_traits<Polyhedron>::edge_descriptor key_type;
private:
typedef CGAL::Unique_hash_map<key_type,std::size_t> Map;
public:
Polyhedron_edge_index_map_external(Polyhedron& p)
: map_(new Map(std::size_t(-1), num_halfedges(p)))
{
unsigned int data = 0;
typename boost::graph_traits<Polyhedron>::edge_iterator it, end;
for(boost::tie(it, end) = edges(p); it != end; ++it, ++data)
(*map_)[*it] = data;
}
reference operator[](const key_type& k) const { return (*map_)[k]; }
private:
std::shared_ptr<Map> map_;
};
template<typename Handle, typename FT>
struct Wrap_squared
{
typedef FT value_type;
typedef FT reference;
typedef Handle key_type;
typedef boost::readable_property_map_tag category;
template<typename E>
FT operator[](const E& e) const {
return approximate_sqrt(CGAL::squared_distance(e.halfedge()->vertex()->point(),
e.halfedge()->opposite()->vertex()->point()));
}
friend inline
value_type get(const Wrap_squared& m, const key_type k)
{
return m[k];
}
};
} // internal
// the tag we dispatch on from property_map<G, Property>
template <class Tag>
struct Polyhedron_property_map {};
} // namespace CGAL
namespace CGAL {
// generalized 2-ary get functions
template<class Gt, class I, CGAL_HDS_PARAM_, class A, class PropertyTag>
typename boost::property_map< CGAL::Polyhedron_3<Gt,I,HDS,A>, PropertyTag >::const_type
get(PropertyTag, CGAL::Polyhedron_3<Gt,I,HDS,A> const&)
{ return typename boost::property_map< CGAL::Polyhedron_3<Gt,I,HDS,A>, PropertyTag >::const_type(); }
template<class Gt, class I, CGAL_HDS_PARAM_, class A, class PropertyTag>
typename boost::property_map< CGAL::Polyhedron_3<Gt,I,HDS,A>, PropertyTag >::type
get(PropertyTag, CGAL::Polyhedron_3<Gt,I,HDS,A>&)
{ return typename boost::property_map< CGAL::Polyhedron_3<Gt,I,HDS,A>, PropertyTag >::type(); }
// generalized 3-ary get functions
template<class Gt, class I, CGAL_HDS_PARAM_, class A, class PropertyTag, class Key>
typename boost::property_traits< typename boost::property_map< CGAL::Polyhedron_3<Gt,I,HDS,A>, PropertyTag >::type >::reference
get(PropertyTag p, CGAL::Polyhedron_3<Gt,I,HDS,A>& g, const Key& key)
{ return get(get(p, g), key); }
template<class Gt, class I, CGAL_HDS_PARAM_, class A, class PropertyTag, class Key>
typename boost::property_traits< typename boost::property_map<CGAL::Polyhedron_3<Gt,I,HDS,A>, PropertyTag >::const_type >::reference
get(PropertyTag p, CGAL::Polyhedron_3<Gt,I,HDS,A> const& g, const Key& key)
{ return get(get(p, g), key); }
#define CGAL_POLYHEDRON_DYNAMIC_PM(TAG, DESCRIPTOR) \
template <typename T, typename Gt, typename I, CGAL_HDS_PARAM_, typename A> \
typename boost::property_map<Polyhedron_3<Gt,I,HDS,A>, TAG >::const_type \
get(const TAG&, const Polyhedron_3<Gt,I,HDS,A>&) \
{ \
typedef typename boost::graph_traits< Polyhedron_3<Gt,I,HDS,A> >::DESCRIPTOR descriptor; \
return internal::Dynamic_property_map<descriptor,T>(); \
}
CGAL_POLYHEDRON_DYNAMIC_PM(dynamic_vertex_property_t<T>, vertex_descriptor)
CGAL_POLYHEDRON_DYNAMIC_PM(dynamic_halfedge_property_t<T>, halfedge_descriptor)
CGAL_POLYHEDRON_DYNAMIC_PM(dynamic_edge_property_t<T>, edge_descriptor)
CGAL_POLYHEDRON_DYNAMIC_PM(dynamic_face_property_t<T>, face_descriptor)
#undef CGAL_POLYHEDRON_DYNAMIC_PM
// generalized put
template<class Gt, class I, CGAL_HDS_PARAM_, class A, class PropertyTag, class Key,class Value>
void put(PropertyTag p, CGAL::Polyhedron_3<Gt,I,HDS,A>& g, const Key& key, const Value& value)
{
typedef typename boost::property_map<CGAL::Polyhedron_3<Gt,I,HDS,A>, PropertyTag>::type Map;
Map pmap = get(p, g);
put(pmap, key, value);
}
} // CGAL
// specialization needs to be repeated for halfedge, vertex, face
#define CGAL_POLYHEDRON_INDEX_PM(ENTITY, TAG, ACCESSOR) \
namespace CGAL { \
template<> struct Polyhedron_property_map<boost::ENTITY##TAG> { \
template<class Gt, class I, CGAL_HDS_PARAM_, class A> \
struct bind_ { \
typedef internal::ACCESSOR##_accessor< \
CGAL::Polyhedron_3<Gt, I, HDS, A>, \
typename boost::graph_traits< CGAL::Polyhedron_3<Gt, I, HDS, A> \
>::ENTITY##_descriptor > type; \
typedef type const_type; \
}; \
}; \
} //CGAL
CGAL_POLYHEDRON_INDEX_PM(halfedge, _index_t, Index)
CGAL_POLYHEDRON_INDEX_PM(vertex, _index_t, Index)
CGAL_POLYHEDRON_INDEX_PM(face, _index_t, Index)
#undef CGAL_POLYHEDRON_INDEX_PM
namespace CGAL {
// not done with macros, because HDS_edge::id does not return a
// reference
template <>
struct Polyhedron_property_map<boost::edge_index_t>
{
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
struct bind_
{
typedef internal::Edge_index_accessor<
typename boost::graph_traits<
CGAL::Polyhedron_3<Gt, I, HDS, A>
>::edge_descriptor > type;
typedef type const_type;
};
};
template <>
struct Polyhedron_property_map<boost::edge_weight_t>
{
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
struct bind_
{
typedef typename CGAL::Polyhedron_3<Gt, I, HDS, A>::Traits::FT FT;
typedef typename boost::graph_traits<CGAL::Polyhedron_3<Gt, I, HDS, A> >::edge_descriptor edge_descriptor;
typedef internal::Wrap_squared<edge_descriptor,FT> type;
typedef type const_type;
};
};
template <>
struct Polyhedron_property_map<vertex_point_t>
{
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
struct bind_
{
typedef internal::Point_accessor<
typename boost::graph_traits<
CGAL::Polyhedron_3<Gt, I, HDS, A>
>::vertex_descriptor,
typename Gt::Point_3, typename Gt::Point_3&> type;
typedef internal::Point_accessor<
typename boost::graph_traits<
CGAL::Polyhedron_3<Gt, I, HDS, A>
>::vertex_descriptor,
typename Gt::Point_3, const typename Gt::Point_3&> const_type;
};
};
//
// external indices
//
template <>
struct Polyhedron_property_map<edge_external_index_t>
{
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
struct bind_
{
typedef internal::Polyhedron_edge_index_map_external<
CGAL::Polyhedron_3<Gt, I, HDS, A>
> type;
typedef type const_type;
};
};
template <>
struct Polyhedron_property_map<halfedge_external_index_t>
{
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
struct bind_
{
typedef internal::Polyhedron_index_map_external<
typename boost::graph_traits<
CGAL::Polyhedron_3<Gt, I, HDS, A>
>::halfedge_descriptor > type;
typedef type const_type;
};
};
template <>
struct Polyhedron_property_map<vertex_external_index_t>
{
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
struct bind_
{
typedef internal::Polyhedron_index_map_external<
typename boost::graph_traits<
CGAL::Polyhedron_3<Gt, I, HDS, A>
>::vertex_descriptor > type;
typedef type const_type;
};
};
template <>
struct Polyhedron_property_map<face_external_index_t>
{
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
struct bind_
{
typedef internal::Polyhedron_index_map_external<
typename boost::graph_traits<
CGAL::Polyhedron_3<Gt, I, HDS, A>
>::face_descriptor > type;
typedef type const_type;
};
};
} // CGAL
namespace CGAL {
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
typename boost::property_map< CGAL::Polyhedron_3<Gt,I,HDS,A>, boost::edge_external_index_t >::const_type
get(boost::edge_external_index_t, CGAL::Polyhedron_3<Gt,I,HDS,A> const& p)
{
return typename boost::property_map< CGAL::Polyhedron_3<Gt,I,HDS,A>, boost::edge_external_index_t >::const_type(
const_cast<CGAL::Polyhedron_3<Gt,I,HDS,A>& >(p));
}
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
typename boost::property_map< CGAL::Polyhedron_3<Gt,I,HDS,A>, boost::halfedge_external_index_t >::const_type
get(boost::halfedge_external_index_t, CGAL::Polyhedron_3<Gt,I,HDS,A> const& p)
{
CGAL::Polyhedron_3<Gt,I,HDS,A>& ncp = const_cast<CGAL::Polyhedron_3<Gt,I,HDS,A>&>(p);
return typename boost::property_map< CGAL::Polyhedron_3<Gt,I,HDS,A>, boost::halfedge_external_index_t >::const_type(
ncp.halfedges_begin(), ncp.halfedges_end(), ncp.size_of_halfedges());
}
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
typename boost::property_map< CGAL::Polyhedron_3<Gt,I,HDS,A>, boost::vertex_external_index_t >::const_type
get(boost::vertex_external_index_t, CGAL::Polyhedron_3<Gt,I,HDS,A> const& p)
{
CGAL::Polyhedron_3<Gt,I,HDS,A>& ncp = const_cast<CGAL::Polyhedron_3<Gt,I,HDS,A>&>(p);
return typename boost::property_map< CGAL::Polyhedron_3<Gt,I,HDS,A>, boost::vertex_external_index_t >::const_type(
ncp.vertices_begin(), ncp.vertices_end(), ncp.size_of_vertices());
}
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
typename boost::property_map< CGAL::Polyhedron_3<Gt,I,HDS,A>, boost::face_external_index_t >::const_type
get(boost::face_external_index_t, CGAL::Polyhedron_3<Gt,I,HDS,A> const& p)
{
CGAL::Polyhedron_3<Gt,I,HDS,A>& ncp = const_cast<CGAL::Polyhedron_3<Gt,I,HDS,A>&>(p);
return typename boost::property_map< CGAL::Polyhedron_3<Gt,I,HDS,A>, boost::face_external_index_t >::const_type(
ncp.facets_begin(), ncp.facets_end(), ncp.size_of_facets());
}
// the same blurb for non-const
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
typename boost::property_map< CGAL::Polyhedron_3<Gt,I,HDS,A>, boost::edge_external_index_t >::type
get(boost::edge_external_index_t, CGAL::Polyhedron_3<Gt,I,HDS,A>& p)
{
return typename boost::property_map< CGAL::Polyhedron_3<Gt,I,HDS,A>, boost::edge_external_index_t >::type(
p);
}
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
typename boost::property_map< CGAL::Polyhedron_3<Gt,I,HDS,A>, boost::halfedge_external_index_t >::type
get(boost::halfedge_external_index_t, CGAL::Polyhedron_3<Gt,I,HDS,A> & ncp)
{
return typename boost::property_map< CGAL::Polyhedron_3<Gt,I,HDS,A>, boost::halfedge_external_index_t >::type(
ncp.halfedges_begin(), ncp.halfedges_end(), ncp.size_of_halfedges());
}
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
typename boost::property_map< CGAL::Polyhedron_3<Gt,I,HDS,A>, boost::vertex_external_index_t >::type
get(boost::vertex_external_index_t, CGAL::Polyhedron_3<Gt,I,HDS,A> & ncp)
{
return typename boost::property_map< CGAL::Polyhedron_3<Gt,I,HDS,A>, boost::vertex_external_index_t >::type(
ncp.vertices_begin(), ncp.vertices_end(), ncp.size_of_vertices());
}
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
typename boost::property_map< CGAL::Polyhedron_3<Gt,I,HDS,A>, boost::face_external_index_t >::type
get(boost::face_external_index_t, CGAL::Polyhedron_3<Gt,I,HDS,A> & ncp)
{
return typename boost::property_map< CGAL::Polyhedron_3<Gt,I,HDS,A>, boost::face_external_index_t >::type(
ncp.facets_begin(), ncp.facets_end(), ncp.size_of_facets());
}
} // namespace CGAL
namespace boost {
// property_map dispatcher into Polyhedron
template<class Gt, class I, CGAL_HDS_PARAM_, class A, class Tag>
struct property_map<CGAL::Polyhedron_3<Gt,I,HDS,A>, Tag>
{
typedef typename CGAL::Polyhedron_property_map<Tag>::
template bind_<Gt,I,HDS,A> map_gen;
typedef typename map_gen::type type;
typedef typename map_gen::const_type const_type;
};
// property_map dispatcher into const Polyhedron
template<class Gt, class I, CGAL_HDS_PARAM_, class A, class Tag>
struct property_map<const CGAL::Polyhedron_3<Gt,I,HDS,A>, Tag>
{
typedef typename CGAL::Polyhedron_property_map<Tag>::
template bind_<Gt,I,HDS,A> map_gen;
typedef typename map_gen::type type;
typedef typename map_gen::const_type const_type;
};
template<class Gt, class I, CGAL_HDS_PARAM_, class A, class T>
struct property_map<CGAL::Polyhedron_3<Gt,I,HDS,A>, CGAL::dynamic_vertex_property_t<T> >
{
typedef CGAL::Polyhedron_3<Gt,I,HDS,A> G;
typedef typename boost::graph_traits<G>::vertex_descriptor vertex_descriptor;
typedef CGAL::internal::Dynamic_property_map<vertex_descriptor,T> type;
typedef type const_type;
};
template<class Gt, class I, CGAL_HDS_PARAM_, class A, class T>
struct property_map<CGAL::Polyhedron_3<Gt,I,HDS,A>, CGAL::dynamic_halfedge_property_t<T> >
{
typedef CGAL::Polyhedron_3<Gt,I,HDS,A> G;
typedef typename boost::graph_traits<G>::halfedge_descriptor halfedge_descriptor;
typedef CGAL::internal::Dynamic_property_map<halfedge_descriptor,T> type;
typedef type const_type;
};
template<class Gt, class I, CGAL_HDS_PARAM_, class A, class T>
struct property_map<CGAL::Polyhedron_3<Gt,I,HDS,A>, CGAL::dynamic_edge_property_t<T> >
{
typedef CGAL::Polyhedron_3<Gt,I,HDS,A> G;
typedef typename boost::graph_traits<G>::edge_descriptor edge_descriptor;
typedef CGAL::internal::Dynamic_property_map<edge_descriptor,T> type;
typedef type const_type;
};
template<class Gt, class I, CGAL_HDS_PARAM_, class A, class T>
struct property_map<CGAL::Polyhedron_3<Gt,I,HDS,A>, CGAL::dynamic_face_property_t<T> >
{
typedef CGAL::Polyhedron_3<Gt,I,HDS,A> G;
typedef typename boost::graph_traits<G>::face_descriptor face_descriptor;
typedef CGAL::internal::Dynamic_property_map<face_descriptor,T> type;
typedef type const_type;
};
// What are those needed for ???
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
struct edge_property_type<CGAL::Polyhedron_3<Gt,I,HDS,A> >
{
typedef edge_weight_t type;
};
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
struct vertex_property_type<CGAL::Polyhedron_3<Gt,I,HDS,A> >
{
typedef CGAL::vertex_point_t type;
};
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
struct vertex_property_type<const CGAL::Polyhedron_3<Gt,I,HDS,A> >
{
typedef CGAL::vertex_point_t type;
};
} // namespace boost
namespace CGAL{
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
struct graph_has_property<CGAL::Polyhedron_3<Gt, I, HDS, A>, boost::vertex_point_t>
: CGAL::Tag_true {};
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
struct graph_has_property<CGAL::Polyhedron_3<Gt, I, HDS, A>, boost::edge_weight_t>
: CGAL::Tag_true {};
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
struct graph_has_property<CGAL::Polyhedron_3<Gt, I, HDS, A>, boost::edge_index_t>
: CGAL::Boolean_tag<
CGAL::internal::Has_member_id<
typename boost::graph_traits<CGAL::Polyhedron_3<Gt, I, HDS, A> >::edge_descriptor
>::value
>
{};
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
struct graph_has_property<CGAL::Polyhedron_3<Gt, I, HDS, A>, boost::face_index_t>
: CGAL::Boolean_tag<
CGAL::internal::Has_member_id<
typename CGAL::Polyhedron_3<Gt, I, HDS, A>::Facet
>::value
>
{};
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
struct graph_has_property<CGAL::Polyhedron_3<Gt, I, HDS, A>, boost::halfedge_index_t>
: CGAL::Boolean_tag<
CGAL::internal::Has_member_id<
typename CGAL::Polyhedron_3<Gt, I, HDS, A>::Halfedge
>::value
>
{};
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
struct graph_has_property<CGAL::Polyhedron_3<Gt, I, HDS, A>, boost::vertex_index_t>
: CGAL::Boolean_tag<
CGAL::internal::Has_member_id<
typename CGAL::Polyhedron_3<Gt, I, HDS, A>::Vertex
>::value
>
{};
}// end CGAL
#undef CGAL_HDS_PARAM_
#define HDS_TMPLT Gt, class I, CGAL_HDS_PARAM_, class A
#define HDS_CLASS CGAL::Polyhedron_3<Gt,I,HDS,A>
#include <CGAL/boost/graph/properties_HalfedgeDS_base.h>
#endif // CGAL_BOOST_GRAPH_PROPERTIES_POLYHEDRON_3_H

View File

@ -55,10 +55,9 @@ void put(Polyhedron_face_patch_id_pmap<Patch_id>, Handle_type h, Patch_id pid)
h->set_patch_id(pid);
}
template <typename Patch_id>
struct Polyhedron_property_map<CGAL::face_patch_id_t<Patch_id> >
template <class Gt, class I, CGAL_HDS_PARAM_, class A, typename Patch_id>
struct HDS_property_map<CGAL::Polyhedron_3<Gt, I, HDS, A>, CGAL::face_patch_id_t<Patch_id> >
{
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
struct bind_
{
typedef Polyhedron_face_patch_id_pmap<Patch_id> type;
@ -79,10 +78,9 @@ get(CGAL::face_patch_id_t<void>, const Polyhedron_3<Gt,I,HDS,A>&)
return Pmap( std::pair<int,int>(0,1) );
}
template <>
struct Polyhedron_property_map<CGAL::face_patch_id_t<void> >
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
struct HDS_property_map<CGAL::Polyhedron_3<Gt, I, HDS, A>, CGAL::face_patch_id_t<void> >
{
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
struct bind_
{
typedef typename internal::Get_static_property_map<Gt,I,HDS,A>::type type;
@ -93,10 +91,9 @@ struct Polyhedron_property_map<CGAL::face_patch_id_t<void> >
// Compatibility: when the `Patch_id` template argument of
// `Polyhedron_mesh_domain` is `Tag_true` (because that argument was named
// `UsePatchId` in previous versions of CGAL.
template <>
struct Polyhedron_property_map<CGAL::face_patch_id_t<CGAL::Tag_true> >
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
struct HDS_property_map<CGAL::Polyhedron_3<Gt, I, HDS, A>, CGAL::face_patch_id_t<CGAL::Tag_true> >
{
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
struct bind_
{
typedef Polyhedron_3<Gt,I,HDS,A> Polyhedron;
@ -108,9 +105,9 @@ struct Polyhedron_property_map<CGAL::face_patch_id_t<CGAL::Tag_true> >
// Compatibility: when the `Patch_id` template argument of
// `Polyhedron_mesh_domain` is `Tag_false` (because that argument was named
// `UsePatchId` in previous versions of CGAL.
template <>
struct Polyhedron_property_map<CGAL::face_patch_id_t<CGAL::Tag_false> >
: public Polyhedron_property_map<CGAL::face_patch_id_t<void> >
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
struct HDS_property_map<CGAL::Polyhedron_3<Gt, I, HDS, A>, CGAL::face_patch_id_t<CGAL::Tag_false> >
: public HDS_property_map<CGAL::Polyhedron_3<Gt, I, HDS, A>, CGAL::face_patch_id_t<void> >
{
};
@ -144,10 +141,9 @@ void put(Polyhedron_num_feature_edges_pmap, Handle_type h, int n)
}
template <>
struct Polyhedron_property_map<CGAL::vertex_feature_degree_t>
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
struct HDS_property_map<CGAL::Polyhedron_3<Gt, I, HDS, A>, CGAL::vertex_feature_degree_t>
{
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
struct bind_
{
typedef Polyhedron_num_feature_edges_pmap type;
@ -177,10 +173,9 @@ void put(Polyhedron_is_feature_edge_pmap, Handle_type e, bool b)
e.halfedge()->opposite()->set_feature_edge(b);
}
template <>
struct Polyhedron_property_map<CGAL::edge_is_feature_t>
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
struct HDS_property_map<CGAL::Polyhedron_3<Gt, I, HDS, A>, CGAL::edge_is_feature_t>
{
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
struct bind_
{
typedef Polyhedron_is_feature_edge_pmap type;
@ -220,10 +215,9 @@ void put(Polyhedron_incident_patches_pmap<Patch_id>,
h->add_incident_patch(n);
}
template <typename Patch_id>
struct Polyhedron_property_map<CGAL::vertex_incident_patches_t<Patch_id> >
template<class Gt, class I, CGAL_HDS_PARAM_, class A, class Patch_id>
struct HDS_property_map<CGAL::Polyhedron_3<Gt, I, HDS, A>, CGAL::vertex_incident_patches_t<Patch_id> >
{
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
struct bind_
{
typedef Polyhedron_incident_patches_pmap<Patch_id> type;

View File

@ -38,10 +38,9 @@ void put(Polyhedron_face_time_stamp_pmap, Handle_type h, std::size_t ts)
h->set_time_stamp(ts);
}
template <>
struct Polyhedron_property_map<CGAL::vertex_time_stamp_t>
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
struct HDS_property_map<CGAL::Polyhedron_3<Gt, I, HDS, A>, CGAL::vertex_time_stamp_t>
{
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
struct bind_
{
typedef Polyhedron_face_time_stamp_pmap type;
@ -49,14 +48,14 @@ struct Polyhedron_property_map<CGAL::vertex_time_stamp_t>
};
};
template <>
struct Polyhedron_property_map<CGAL::halfedge_time_stamp_t>
: public Polyhedron_property_map<CGAL::vertex_time_stamp_t>
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
struct HDS_property_map<CGAL::Polyhedron_3<Gt, I, HDS, A>, CGAL::halfedge_time_stamp_t>
: public HDS_property_map<CGAL::Polyhedron_3<Gt, I, HDS, A>, CGAL::vertex_time_stamp_t>
{};
template <>
struct Polyhedron_property_map<CGAL::face_time_stamp_t>
: public Polyhedron_property_map<CGAL::vertex_time_stamp_t>
template<class Gt, class I, CGAL_HDS_PARAM_, class A>
struct HDS_property_map<CGAL::Polyhedron_3<Gt, I, HDS, A>, CGAL::face_time_stamp_t>
: public HDS_property_map<CGAL::Polyhedron_3<Gt, I, HDS, A>, CGAL::vertex_time_stamp_t>
{};