Add templates for the index maps in the class type.

This commit is contained in:
Maxime Gimeno 2017-05-02 14:21:45 +02:00
parent 6e1199d56f
commit 793931be88
1 changed files with 282 additions and 160 deletions

View File

@ -39,8 +39,7 @@ namespace CGAL
*
* The class `Connected_components_graph` wraps a graph into another graph in such a way that only the specified connected components are seen from the outside.
*
* For example, calling `vertices(graph)` will return an iterator range of all but only the vertices that belong to the connected components whose ids in the
* `FaceComponentMap` are contained in the given set.
* For example, calling `vertices(graph)` will return an iterator range of all but only the vertices that belong to the selected connected components.
*
* \tparam Graph must be a model of a `FaceListGraph` and `HalfedgeListGraph`.
*
@ -48,7 +47,10 @@ namespace CGAL
* \cgalModels `HalfedgeListGraph`
*/
template<typename Graph>
template<typename Graph,
typename FImap = typename boost::property_map<Graph, CGAL::face_index_t>::type,
typename VImap = typename boost::property_map<Graph, boost::vertex_index_t>::type,
typename HImap = typename boost::property_map<Graph, CGAL::halfedge_index_t>::type>
struct Connected_components_graph
{
typedef boost::graph_traits<Graph> gt;
@ -56,10 +58,7 @@ struct Connected_components_graph
typedef typename gt::halfedge_descriptor halfedge_descriptor;
typedef typename gt::edge_descriptor edge_descriptor;
typedef typename gt::face_descriptor face_descriptor;
typedef Connected_components_graph<Graph> Self;
typedef typename boost::property_map<Graph, CGAL::face_index_t>::type FImap;
typedef typename boost::property_map<Graph, boost::vertex_index_t>::type VImap;
typedef typename boost::property_map<Graph, CGAL::halfedge_index_t>::type HImap;
typedef Connected_components_graph<Graph, FImap, VImap, HImap> Self;
/*!
* \brief Creates a Connected_components_graph of the connected components of `graph` specified in the range
@ -223,10 +222,13 @@ private:
namespace boost
{
template<typename Graph>
struct graph_traits< CGAL::Connected_components_graph<Graph> >
template<typename Graph,
typename FImap,
typename VImap,
typename HImap>
struct graph_traits< CGAL::Connected_components_graph<Graph, FImap, VImap, HImap> >
{
typedef CGAL::Connected_components_graph<Graph> G;
typedef CGAL::Connected_components_graph<Graph, FImap, VImap, HImap> G;
typedef boost::graph_traits<Graph> BGTG;
typedef typename BGTG::vertex_descriptor vertex_descriptor;
typedef typename BGTG::halfedge_descriptor halfedge_descriptor;
@ -271,9 +273,12 @@ struct graph_traits< CGAL::Connected_components_graph<Graph> >
}
};
template<typename Graph>
struct graph_traits< const CGAL::Connected_components_graph<Graph> >
: public graph_traits< CGAL::Connected_components_graph<Graph> >
template<typename Graph,
typename FImap,
typename VImap,
typename HImap>
struct graph_traits< const CGAL::Connected_components_graph<Graph, FImap, VImap, HImap> >
: public graph_traits< CGAL::Connected_components_graph<Graph, FImap, VImap, HImap> >
{};
@ -281,62 +286,83 @@ struct graph_traits< const CGAL::Connected_components_graph<Graph> >
namespace CGAL {
template <class Graph>
template<typename Graph,
typename FImap,
typename VImap,
typename HImap>
bool
in_CC(const typename boost::graph_traits< Connected_components_graph<Graph> >::face_descriptor f,
const Connected_components_graph<Graph> & w)
in_CC(const typename boost::graph_traits< Connected_components_graph<Graph, FImap, VImap, HImap> >::face_descriptor f,
const Connected_components_graph<Graph, FImap, VImap, HImap> & w)
{
return w.is_in_cc(f);
}
template <class Graph>
template<typename Graph,
typename FImap,
typename VImap,
typename HImap>
bool
in_CC(const typename boost::graph_traits< Connected_components_graph<Graph> >::halfedge_descriptor h,
const Connected_components_graph<Graph> & w)
in_CC(const typename boost::graph_traits< Connected_components_graph<Graph, FImap, VImap, HImap> >::halfedge_descriptor h,
const Connected_components_graph<Graph, FImap, VImap, HImap> & w)
{
return w.is_in_cc(h);
}
template <class Graph>
template<typename Graph,
typename FImap,
typename VImap,
typename HImap>
bool
in_CC(const typename boost::graph_traits< Connected_components_graph<Graph> >::edge_descriptor e,
const Connected_components_graph<Graph> & w)
in_CC(const typename boost::graph_traits< Connected_components_graph<Graph, FImap, VImap, HImap> >::edge_descriptor e,
const Connected_components_graph<Graph, FImap, VImap, HImap> & w)
{
return w.is_in_cc(halfedge(e, w.graph()));
}
template <class Graph>
template<typename Graph,
typename FImap,
typename VImap,
typename HImap>
bool
in_CC(const typename boost::graph_traits< Connected_components_graph<Graph> >::vertex_descriptor v,
const Connected_components_graph<Graph> & w)
in_CC(const typename boost::graph_traits< Connected_components_graph<Graph, FImap, VImap, HImap> >::vertex_descriptor v,
const Connected_components_graph<Graph, FImap, VImap, HImap> & w)
{
return w.is_in_cc(v);
}
template<typename Graph>
template<typename Graph,
typename FImap,
typename VImap,
typename HImap>
typename boost::graph_traits<Graph>::vertices_size_type
num_vertices(const Connected_components_graph<Graph>& w)
num_vertices(const Connected_components_graph<Graph, FImap, VImap, HImap>& w)
{
return w.number_of_vertices();
}
template<typename Graph>
template<typename Graph,
typename FImap,
typename VImap,
typename HImap>
typename boost::graph_traits<Graph>::edges_size_type
num_edges(const Connected_components_graph<Graph>& w)
num_edges(const Connected_components_graph<Graph, FImap, VImap, HImap>& w)
{
return w.number_of_halfedges()/2;
}
template<typename Graph>
template<typename Graph,
typename FImap,
typename VImap,
typename HImap>
typename boost::graph_traits<Graph>::degree_size_type
degree(typename boost::graph_traits<Connected_components_graph<Graph> >::vertex_descriptor v,
const Connected_components_graph<Graph>& w)
degree(typename boost::graph_traits<Connected_components_graph<Graph, FImap, VImap, HImap> >::vertex_descriptor v,
const Connected_components_graph<Graph, FImap, VImap, HImap>& w)
{
CGAL_assertion(in_CC(v, w));
typename boost::graph_traits<Graph>::degree_size_type v_deg = 0;
typename boost::graph_traits<Connected_components_graph<Graph> >::halfedge_descriptor h = halfedge(v, w);
typename boost::graph_traits<Connected_components_graph<Graph> >::halfedge_descriptor hcirc = h;
typename boost::graph_traits<Connected_components_graph<Graph, FImap, VImap, HImap> >::halfedge_descriptor h = halfedge(v, w);
typename boost::graph_traits<Connected_components_graph<Graph, FImap, VImap, HImap> >::halfedge_descriptor hcirc = h;
do
{
if(in_CC(hcirc, w))
@ -346,109 +372,136 @@ degree(typename boost::graph_traits<Connected_components_graph<Graph> >::vertex_
return v_deg;
}
template <class Graph>
template<typename Graph,
typename FImap,
typename VImap,
typename HImap>
typename boost::graph_traits<Graph>::degree_size_type
out_degree(typename boost::graph_traits<Connected_components_graph<Graph> >::vertex_descriptor v,
const Connected_components_graph<Graph>& w)
out_degree(typename boost::graph_traits<Connected_components_graph<Graph, FImap, VImap, HImap> >::vertex_descriptor v,
const Connected_components_graph<Graph, FImap, VImap, HImap>& w)
{
CGAL_assertion(in_CC(v, w));
return std::distance(out_edges(v, w).first ,out_edges(v, w).second);
}
template <class Graph>
template<typename Graph,
typename FImap,
typename VImap,
typename HImap>
typename boost::graph_traits<Graph>::degree_size_type
in_degree(typename boost::graph_traits<Connected_components_graph<Graph> >::vertex_descriptor v,
const Connected_components_graph<Graph>& w)
in_degree(typename boost::graph_traits<Connected_components_graph<Graph, FImap, VImap, HImap> >::vertex_descriptor v,
const Connected_components_graph<Graph, FImap, VImap, HImap>& w)
{
CGAL_assertion(in_CC(v, w));
return std::distance(in_edges(v, w).first ,in_edges(v, w).second);
}
template <class Graph>
typename boost::graph_traits<Connected_components_graph<Graph> >::vertex_descriptor
source(typename boost::graph_traits<Connected_components_graph<Graph> >::edge_descriptor e,
const Connected_components_graph<Graph> & w)
template<typename Graph,
typename FImap,
typename VImap,
typename HImap>
typename boost::graph_traits<Connected_components_graph<Graph, FImap, VImap, HImap> >::vertex_descriptor
source(typename boost::graph_traits<Connected_components_graph<Graph, FImap, VImap, HImap> >::edge_descriptor e,
const Connected_components_graph<Graph, FImap, VImap, HImap> & w)
{
CGAL_assertion(in_CC(e, w));
return source(e, w.graph());
}
template <class Graph>
typename boost::graph_traits<Connected_components_graph<Graph> >::vertex_descriptor
target(typename boost::graph_traits<Connected_components_graph<Graph> >::edge_descriptor e,
const Connected_components_graph<Graph> & w)
template<typename Graph,
typename FImap,
typename VImap,
typename HImap>
typename boost::graph_traits<Connected_components_graph<Graph, FImap, VImap, HImap> >::vertex_descriptor
target(typename boost::graph_traits<Connected_components_graph<Graph, FImap, VImap, HImap> >::edge_descriptor e,
const Connected_components_graph<Graph, FImap, VImap, HImap> & w)
{
CGAL_assertion(in_CC(e, w));
return target(e, w.graph());
}
template <class Graph>
std::pair<typename boost::graph_traits<Connected_components_graph<Graph> >::edge_descriptor, bool>
edge(typename boost::graph_traits<Connected_components_graph<Graph> >::vertex_descriptor u,
typename boost::graph_traits<Connected_components_graph<Graph> >::vertex_descriptor v,
const Connected_components_graph<Graph> & w)
template<typename Graph,
typename FImap,
typename VImap,
typename HImap>
std::pair<typename boost::graph_traits<Connected_components_graph<Graph, FImap, VImap, HImap> >::edge_descriptor, bool>
edge(typename boost::graph_traits<Connected_components_graph<Graph, FImap, VImap, HImap> >::vertex_descriptor u,
typename boost::graph_traits<Connected_components_graph<Graph, FImap, VImap, HImap> >::vertex_descriptor v,
const Connected_components_graph<Graph, FImap, VImap, HImap> & w)
{
CGAL_assertion(in_CC(u, w) && in_CC(v, w));
typename boost::graph_traits<Connected_components_graph<Graph> >::edge_descriptor e = edge(u, v, w.graph()).first;
typename boost::graph_traits<Connected_components_graph<Graph, FImap, VImap, HImap> >::edge_descriptor e = edge(u, v, w.graph()).first;
bool res = in_CC(e, w);
return std::make_pair(e, res);
}
template <class Graph>
CGAL::Iterator_range<typename boost::graph_traits<Connected_components_graph<Graph> >::vertex_iterator>
vertices(const Connected_components_graph<Graph> & w)
template<typename Graph,
typename FImap,
typename VImap,
typename HImap>
CGAL::Iterator_range<typename boost::graph_traits<Connected_components_graph<Graph, FImap, VImap, HImap> >::vertex_iterator>
vertices(const Connected_components_graph<Graph, FImap, VImap, HImap> & w)
{
typedef typename boost::graph_traits<Connected_components_graph<Graph> >::vertex_iterator vertex_iterator;
typedef typename boost::graph_traits<Connected_components_graph<Graph, FImap, VImap, HImap> >::vertex_iterator vertex_iterator;
typedef typename boost::graph_traits<Graph >::vertex_iterator g_vertex_iterator;
typename Connected_components_graph<Graph> ::Is_simplex_valid predicate(&w);
typename Connected_components_graph<Graph, FImap, VImap, HImap> ::Is_simplex_valid predicate(&w);
g_vertex_iterator b,e;
boost::tie(b,e) = vertices(w.graph());
return make_range(vertex_iterator(predicate, b, e),
vertex_iterator(predicate, e, e));
}
template <class Graph>
CGAL::Iterator_range<typename boost::graph_traits<Connected_components_graph<Graph> >::edge_iterator>
edges(const Connected_components_graph<Graph> & w)
template<typename Graph,
typename FImap,
typename VImap,
typename HImap>
CGAL::Iterator_range<typename boost::graph_traits<Connected_components_graph<Graph, FImap, VImap, HImap> >::edge_iterator>
edges(const Connected_components_graph<Graph, FImap, VImap, HImap> & w)
{
typedef typename boost::graph_traits<Connected_components_graph<Graph> >::edge_iterator edge_iterator;
typedef typename boost::graph_traits<Connected_components_graph<Graph, FImap, VImap, HImap> >::edge_iterator edge_iterator;
typedef typename boost::graph_traits<Graph >::edge_iterator g_edge_iterator;
typename Connected_components_graph<Graph> ::Is_simplex_valid predicate(&w);
typename Connected_components_graph<Graph, FImap, VImap, HImap> ::Is_simplex_valid predicate(&w);
g_edge_iterator b,e;
boost::tie(b,e) = edges(w.graph());
return make_range(edge_iterator(predicate, b, e),
edge_iterator(predicate, e, e));
}
template <class Graph>
CGAL::Iterator_range<typename boost::graph_traits<Connected_components_graph<Graph> >::out_edge_iterator>
out_edges(typename boost::graph_traits<Connected_components_graph<Graph> >::vertex_descriptor v,
const Connected_components_graph<Graph> & w)
template<typename Graph,
typename FImap,
typename VImap,
typename HImap>
CGAL::Iterator_range<typename boost::graph_traits<Connected_components_graph<Graph, FImap, VImap, HImap> >::out_edge_iterator>
out_edges(typename boost::graph_traits<Connected_components_graph<Graph, FImap, VImap, HImap> >::vertex_descriptor v,
const Connected_components_graph<Graph, FImap, VImap, HImap> & w)
{
typedef typename boost::graph_traits<Connected_components_graph<Graph> >::out_edge_iterator out_edge_iterator;
typedef typename boost::graph_traits<Connected_components_graph<Graph, FImap, VImap, HImap> >::out_edge_iterator out_edge_iterator;
typedef typename boost::graph_traits<Graph >::out_edge_iterator g_out_edge_iterator;
typename Connected_components_graph<Graph> ::Is_simplex_valid predicate(&w);
typename Connected_components_graph<Graph, FImap, VImap, HImap> ::Is_simplex_valid predicate(&w);
g_out_edge_iterator b,e;
boost::tie(b,e) = out_edges(v, w.graph());
return make_range(out_edge_iterator(predicate, b, e),
out_edge_iterator(predicate, e, e));
}
template <class Graph>
CGAL::Iterator_range<typename boost::graph_traits<Connected_components_graph<Graph> >::in_edge_iterator>
in_edges(typename boost::graph_traits<Connected_components_graph<Graph> >::vertex_descriptor v,
const Connected_components_graph<Graph> & w)
template<typename Graph,
typename FImap,
typename VImap,
typename HImap>
CGAL::Iterator_range<typename boost::graph_traits<Connected_components_graph<Graph, FImap, VImap, HImap> >::in_edge_iterator>
in_edges(typename boost::graph_traits<Connected_components_graph<Graph, FImap, VImap, HImap> >::vertex_descriptor v,
const Connected_components_graph<Graph, FImap, VImap, HImap> & w)
{
typedef typename boost::graph_traits<Connected_components_graph<Graph> >::in_edge_iterator in_edge_iterator;
typedef typename boost::graph_traits<Connected_components_graph<Graph, FImap, VImap, HImap> >::in_edge_iterator in_edge_iterator;
typedef typename boost::graph_traits<Graph >::in_edge_iterator g_in_edge_iterator;
typename Connected_components_graph<Graph> ::Is_simplex_valid predicate(&w);
typename Connected_components_graph<Graph, FImap, VImap, HImap> ::Is_simplex_valid predicate(&w);
g_in_edge_iterator b,e;
boost::tie(b,e) = in_edges(v, w.graph());
return make_range(in_edge_iterator(predicate, b, e),
@ -458,106 +511,133 @@ in_edges(typename boost::graph_traits<Connected_components_graph<Graph> >::verte
//
// HalfedgeGraph
//
template <class Graph>
typename boost::graph_traits< Connected_components_graph<Graph> >::edge_descriptor
edge(typename boost::graph_traits< Connected_components_graph<Graph> >::halfedge_descriptor h,
const Connected_components_graph<Graph> & w)
template<typename Graph,
typename FImap,
typename VImap,
typename HImap>
typename boost::graph_traits< Connected_components_graph<Graph, FImap, VImap, HImap> >::edge_descriptor
edge(typename boost::graph_traits< Connected_components_graph<Graph, FImap, VImap, HImap> >::halfedge_descriptor h,
const Connected_components_graph<Graph, FImap, VImap, HImap> & w)
{
CGAL_assertion(CGAL::in_CC(h, w));
return edge(h, w.graph());
}
template <class Graph>
typename boost::graph_traits< Connected_components_graph<Graph> >::halfedge_descriptor
halfedge(typename boost::graph_traits< Connected_components_graph<Graph> >::edge_descriptor e,
const Connected_components_graph<Graph> & w)
template<typename Graph,
typename FImap,
typename VImap,
typename HImap>
typename boost::graph_traits< Connected_components_graph<Graph, FImap, VImap, HImap> >::halfedge_descriptor
halfedge(typename boost::graph_traits< Connected_components_graph<Graph, FImap, VImap, HImap> >::edge_descriptor e,
const Connected_components_graph<Graph, FImap, VImap, HImap> & w)
{
CGAL_assertion(CGAL::in_CC(e, w));
return halfedge(e, w.graph());
}
template <class Graph>
typename boost::graph_traits< Connected_components_graph<Graph> >::halfedge_descriptor
halfedge(typename boost::graph_traits< Connected_components_graph<Graph> >::vertex_descriptor v,
const Connected_components_graph<Graph> & w)
template<typename Graph,
typename FImap,
typename VImap,
typename HImap>
typename boost::graph_traits< Connected_components_graph<Graph, FImap, VImap, HImap> >::halfedge_descriptor
halfedge(typename boost::graph_traits< Connected_components_graph<Graph, FImap, VImap, HImap> >::vertex_descriptor v,
const Connected_components_graph<Graph, FImap, VImap, HImap> & w)
{
CGAL_assertion(in_CC(v, w));
typename boost::graph_traits<Connected_components_graph<Graph> >::halfedge_descriptor h = halfedge(v, w.graph());
typename boost::graph_traits<Connected_components_graph<Graph> >::halfedge_descriptor hcirc = h;
typename boost::graph_traits<Connected_components_graph<Graph, FImap, VImap, HImap> >::halfedge_descriptor h = halfedge(v, w.graph());
typename boost::graph_traits<Connected_components_graph<Graph, FImap, VImap, HImap> >::halfedge_descriptor hcirc = h;
do
{
if(in_CC(hcirc, w))
return hcirc;
hcirc = opposite(next(hcirc, w.graph()), w.graph());
}while(hcirc != h);
return boost::graph_traits< CGAL::Connected_components_graph<Graph> >::null_halfedge();
return boost::graph_traits< CGAL::Connected_components_graph<Graph, FImap, VImap, HImap> >::null_halfedge();
}
template <class Graph>
std::pair<typename boost::graph_traits< Connected_components_graph<Graph> >::halfedge_descriptor, bool>
halfedge(typename boost::graph_traits< Connected_components_graph<Graph> >::vertex_descriptor u,
typename boost::graph_traits< Connected_components_graph<Graph> >::vertex_descriptor v,
const Connected_components_graph<Graph> & w)
template<typename Graph,
typename FImap,
typename VImap,
typename HImap>
std::pair<typename boost::graph_traits< Connected_components_graph<Graph, FImap, VImap, HImap> >::halfedge_descriptor, bool>
halfedge(typename boost::graph_traits< Connected_components_graph<Graph, FImap, VImap, HImap> >::vertex_descriptor u,
typename boost::graph_traits< Connected_components_graph<Graph, FImap, VImap, HImap> >::vertex_descriptor v,
const Connected_components_graph<Graph, FImap, VImap, HImap> & w)
{
CGAL_assertion(in_CC(u, w) && in_CC(v, w));
typename boost::graph_traits<Connected_components_graph<Graph> >::halfedge_descriptor h = halfedge(u, v, w.graph()).first;
typename boost::graph_traits<Connected_components_graph<Graph, FImap, VImap, HImap> >::halfedge_descriptor h = halfedge(u, v, w.graph()).first;
return std::make_pair(h, in_CC(h, w));
}
template <class Graph>
typename boost::graph_traits< Connected_components_graph<Graph> >::halfedge_descriptor
opposite(typename boost::graph_traits< Connected_components_graph<Graph> >::halfedge_descriptor h,
const Connected_components_graph<Graph> & w)
template<typename Graph,
typename FImap,
typename VImap,
typename HImap>
typename boost::graph_traits< Connected_components_graph<Graph, FImap, VImap, HImap> >::halfedge_descriptor
opposite(typename boost::graph_traits< Connected_components_graph<Graph, FImap, VImap, HImap> >::halfedge_descriptor h,
const Connected_components_graph<Graph, FImap, VImap, HImap> & w)
{
CGAL_assertion(in_CC(h, w) );
return opposite(h, w.graph());
}
template <class Graph>
typename boost::graph_traits< Connected_components_graph<Graph> >::vertex_descriptor
source(typename boost::graph_traits< Connected_components_graph<Graph> >::halfedge_descriptor h,
const Connected_components_graph<Graph> & w)
template<typename Graph,
typename FImap,
typename VImap,
typename HImap>
typename boost::graph_traits< Connected_components_graph<Graph, FImap, VImap, HImap> >::vertex_descriptor
source(typename boost::graph_traits< Connected_components_graph<Graph, FImap, VImap, HImap> >::halfedge_descriptor h,
const Connected_components_graph<Graph, FImap, VImap, HImap> & w)
{
CGAL_assertion(in_CC(h, w) );
return source(h, w.graph());
}
template <class Graph>
typename boost::graph_traits< Connected_components_graph<Graph> >::vertex_descriptor
target(typename boost::graph_traits< Connected_components_graph<Graph> >::halfedge_descriptor h,
const Connected_components_graph<Graph> & w)
template<typename Graph,
typename FImap,
typename VImap,
typename HImap>
typename boost::graph_traits< Connected_components_graph<Graph, FImap, VImap, HImap> >::vertex_descriptor
target(typename boost::graph_traits< Connected_components_graph<Graph, FImap, VImap, HImap> >::halfedge_descriptor h,
const Connected_components_graph<Graph, FImap, VImap, HImap> & w)
{
CGAL_assertion(in_CC(h, w) );
return target(h, w.graph());
}
template <class Graph>
typename boost::graph_traits< Connected_components_graph<Graph> >::halfedge_descriptor
next(typename boost::graph_traits< Connected_components_graph<Graph> >::halfedge_descriptor h,
const Connected_components_graph<Graph> & w)
template<typename Graph,
typename FImap,
typename VImap,
typename HImap>
typename boost::graph_traits< Connected_components_graph<Graph, FImap, VImap, HImap> >::halfedge_descriptor
next(typename boost::graph_traits< Connected_components_graph<Graph, FImap, VImap, HImap> >::halfedge_descriptor h,
const Connected_components_graph<Graph, FImap, VImap, HImap> & w)
{
CGAL_assertion(in_CC(h, w));
if(in_CC(next(h, w.graph()), w))
return next(h, w.graph());
//act as a border
BOOST_FOREACH(typename boost::graph_traits< Connected_components_graph<Graph> >::halfedge_descriptor hcirc
, CGAL::halfedges_around_target(target(h, w.graph()), w.graph()))
typedef typename boost::graph_traits< Connected_components_graph<Graph, FImap, VImap, HImap> >::halfedge_descriptor h_d;
BOOST_FOREACH( h_d hcirc,
CGAL::halfedges_around_target(target(h, w.graph()), w.graph()))
{
if(hcirc != h && in_CC(hcirc, w))
{
return opposite(hcirc, w.graph());
}
}
return boost::graph_traits< CGAL::Connected_components_graph<Graph> >::null_halfedge();
return boost::graph_traits< CGAL::Connected_components_graph<Graph, FImap, VImap, HImap> >::null_halfedge();
}
template <class Graph>
typename boost::graph_traits< Connected_components_graph<Graph> >::halfedge_descriptor
prev(typename boost::graph_traits< Connected_components_graph<Graph> >::halfedge_descriptor h,
const Connected_components_graph<Graph> & w)
template<typename Graph,
typename FImap,
typename VImap,
typename HImap>
typename boost::graph_traits< Connected_components_graph<Graph, FImap, VImap, HImap> >::halfedge_descriptor
prev(typename boost::graph_traits< Connected_components_graph<Graph, FImap, VImap, HImap> >::halfedge_descriptor h,
const Connected_components_graph<Graph, FImap, VImap, HImap> & w)
{
CGAL_assertion(in_CC(h, w));
@ -565,30 +645,34 @@ prev(typename boost::graph_traits< Connected_components_graph<Graph> >::halfedge
return prev(h, w.graph());
//act as a border
BOOST_FOREACH(typename boost::graph_traits< Connected_components_graph<Graph> >::halfedge_descriptor hcirc
, CGAL::halfedges_around_source(source(h, w.graph()), w.graph()))
typedef typename boost::graph_traits< Connected_components_graph<Graph, FImap, VImap, HImap> >::halfedge_descriptor h_d;
BOOST_FOREACH(h_d hcirc,
CGAL::halfedges_around_source(source(h, w.graph()), w.graph()))
{
if(hcirc != h && in_CC(hcirc, w))
{
return opposite(hcirc, w.graph());
}
}
return boost::graph_traits< CGAL::Connected_components_graph<Graph> >::null_halfedge();
return boost::graph_traits< CGAL::Connected_components_graph<Graph, FImap, VImap, HImap> >::null_halfedge();
}
//
// HalfedgeListGraph
//
template <class Graph>
std::pair<typename boost::graph_traits<Connected_components_graph<Graph> >::halfedge_iterator,
typename boost::graph_traits<Connected_components_graph<Graph> >::halfedge_iterator>
halfedges(const Connected_components_graph<Graph> & w)
template<typename Graph,
typename FImap,
typename VImap,
typename HImap>
std::pair<typename boost::graph_traits<Connected_components_graph<Graph, FImap, VImap, HImap> >::halfedge_iterator,
typename boost::graph_traits<Connected_components_graph<Graph, FImap, VImap, HImap> >::halfedge_iterator>
halfedges(const Connected_components_graph<Graph, FImap, VImap, HImap> & w)
{
typedef typename boost::graph_traits<Connected_components_graph<Graph> >::halfedge_iterator halfedge_iterator;
typedef typename boost::graph_traits<Connected_components_graph<Graph, FImap, VImap, HImap> >::halfedge_iterator halfedge_iterator;
typedef typename boost::graph_traits<Graph >::halfedge_iterator g_halfedge_iterator;
typename Connected_components_graph<Graph> ::Is_simplex_valid predicate(&w);
typename Connected_components_graph<Graph, FImap, VImap, HImap> ::Is_simplex_valid predicate(&w);
std::pair<g_halfedge_iterator, g_halfedge_iterator> original_halfedges = halfedges(w.graph());
return make_range(halfedge_iterator(predicate, original_halfedges.first, original_halfedges.second),
@ -596,44 +680,56 @@ halfedges(const Connected_components_graph<Graph> & w)
}
template <class Graph>
template<typename Graph,
typename FImap,
typename VImap,
typename HImap>
typename boost::graph_traits<Graph>::halfedges_size_type
num_halfedges(const Connected_components_graph<Graph> & w)
num_halfedges(const Connected_components_graph<Graph, FImap, VImap, HImap> & w)
{
return w.number_of_halfedges();
}
// FaceGraph
template <class Graph>
typename boost::graph_traits< Connected_components_graph<Graph> >::face_descriptor
face(typename boost::graph_traits< Connected_components_graph<Graph> >::halfedge_descriptor h,
const Connected_components_graph<Graph> & w)
template<typename Graph,
typename FImap,
typename VImap,
typename HImap>
typename boost::graph_traits< Connected_components_graph<Graph, FImap, VImap, HImap> >::face_descriptor
face(typename boost::graph_traits< Connected_components_graph<Graph, FImap, VImap, HImap> >::halfedge_descriptor h,
const Connected_components_graph<Graph, FImap, VImap, HImap> & w)
{
CGAL_assertion(CGAL::in_CC(h, w));
if(in_CC(h, w))
return face(h,w.graph());
else
return boost::graph_traits< CGAL::Connected_components_graph<Graph> >::null_face();
return boost::graph_traits< CGAL::Connected_components_graph<Graph, FImap, VImap, HImap> >::null_face();
}
template <class Graph>
typename boost::graph_traits< Connected_components_graph<Graph> >::halfedge_descriptor
halfedge(typename boost::graph_traits< Connected_components_graph<Graph> >::face_descriptor f,
const Connected_components_graph<Graph> & w)
template<typename Graph,
typename FImap,
typename VImap,
typename HImap>
typename boost::graph_traits< Connected_components_graph<Graph, FImap, VImap, HImap> >::halfedge_descriptor
halfedge(typename boost::graph_traits< Connected_components_graph<Graph, FImap, VImap, HImap> >::face_descriptor f,
const Connected_components_graph<Graph, FImap, VImap, HImap> & w)
{
CGAL_assertion(CGAL::in_CC(f, w));
return halfedge(f,w.graph());
}
template <class Graph>
Iterator_range<typename boost::graph_traits<Connected_components_graph<Graph> >::face_iterator>
faces(const Connected_components_graph<Graph> & w)
template<typename Graph,
typename FImap,
typename VImap,
typename HImap>
Iterator_range<typename boost::graph_traits<Connected_components_graph<Graph, FImap, VImap, HImap> >::face_iterator>
faces(const Connected_components_graph<Graph, FImap, VImap, HImap> & w)
{
typedef typename boost::graph_traits<Connected_components_graph<Graph> >::face_iterator face_iterator;
typedef typename boost::graph_traits<Connected_components_graph<Graph, FImap, VImap, HImap> >::face_iterator face_iterator;
typedef typename boost::graph_traits<Graph >::face_iterator g_face_iterator;
typename Connected_components_graph<Graph> ::Is_simplex_valid predicate(&w);
typename Connected_components_graph<Graph, FImap, VImap, HImap> ::Is_simplex_valid predicate(&w);
std::pair<g_face_iterator, g_face_iterator> original_faces = faces(w.graph());
return make_range(face_iterator(predicate, original_faces.first, original_faces.second),
@ -642,42 +738,60 @@ faces(const Connected_components_graph<Graph> & w)
template <class Graph>
template<typename Graph,
typename FImap,
typename VImap,
typename HImap>
typename boost::graph_traits<Graph>::vertices_size_type
num_faces(const Connected_components_graph<Graph> & w)
num_faces(const Connected_components_graph<Graph, FImap, VImap, HImap> & w)
{
return w.number_of_faces();
}
template <class Graph>
template<typename Graph,
typename FImap,
typename VImap,
typename HImap>
bool
in_CC(const Connected_components_graph<Graph> & w, bool verbose = false)
in_CC(const Connected_components_graph<Graph, FImap, VImap, HImap> & w, bool verbose = false)
{
return in_CC(w.graph(),verbose);
}
template <class Graph, class PropertyTag>
template <class Graph,
typename FImap,
typename VImap,
typename HImap,
class PropertyTag>
typename boost::property_map<Graph, PropertyTag >::type
get(PropertyTag ptag, const Connected_components_graph<Graph>& w)
get(PropertyTag ptag, const Connected_components_graph<Graph, FImap, VImap, HImap>& w)
{
return get(ptag, w.graph());
}
template <class Graph, class PropertyTag>
template <class Graph,
typename FImap,
typename VImap,
typename HImap,
class PropertyTag>
typename boost::property_traits<typename boost::property_map<Graph,PropertyTag>::type>::value_type
get(PropertyTag ptag,
const Connected_components_graph<Graph>& w,
const Connected_components_graph<Graph, FImap, VImap, HImap>& w,
const typename boost::property_traits<typename boost::property_map<Graph,PropertyTag>::type>::key_type& k)
{
return get(ptag, w.graph(), k);
}
template <class Graph, class PropertyTag>
template <class Graph,
typename FImap,
typename VImap,
typename HImap,
class PropertyTag>
void
put(PropertyTag ptag, const Connected_components_graph<Graph>& w,
put(PropertyTag ptag, const Connected_components_graph<Graph, FImap, VImap, HImap>& w,
const typename boost::property_traits<typename boost::property_map<Graph,PropertyTag>::type>::key_type& k,
typename boost::property_traits<typename boost::property_map<Graph,PropertyTag>::type>::value_type& v)
{
@ -687,14 +801,22 @@ put(PropertyTag ptag, const Connected_components_graph<Graph>& w,
}//end namespace CGAL
namespace boost {
template <typename Graph, typename PropertyTag>
struct property_map<CGAL::Connected_components_graph<Graph>,PropertyTag> {
template<typename Graph,
typename FImap,
typename VImap,
typename HImap,
typename PropertyTag>
struct property_map<CGAL::Connected_components_graph<Graph, FImap, VImap, HImap>,PropertyTag> {
typedef typename boost::property_map<Graph, PropertyTag >::type type;
typedef typename boost::property_map<Graph, PropertyTag >::const_type const_type;
};
template<typename Graph, typename PropertyTag>
struct graph_has_property<CGAL::Connected_components_graph<Graph>, PropertyTag>
template<typename Graph,
typename FImap,
typename VImap,
typename HImap,
typename PropertyTag>
struct graph_has_property<CGAL::Connected_components_graph<Graph, FImap, VImap, HImap>, PropertyTag>
: graph_has_property<Graph, PropertyTag> {};
}// namespace boost