mirror of https://github.com/CGAL/cgal
Add templates for the index maps in the class type.
This commit is contained in:
parent
6e1199d56f
commit
793931be88
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue