// Copyright (c) 2014 GeometryFactory (France). All rights reserved. // // This file is part of CGAL (www.cgal.org); you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public License as // published by the Free Software Foundation; either version 3 of the License, // or (at your option) any later version. // // Licensees holding a valid commercial license may use this file in // accordance with the commercial license agreement provided with the software. // // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. // // $URL$ // $Id$ // SPDX-License-Identifier: LGPL-3.0+ // // // Author(s) : Jane Tournois #ifndef CGAL_BOOST_GRAPH_VISITOR_H #define CGAL_BOOST_GRAPH_VISITOR_H #include #include #include namespace boost { template struct graph_traits< boost::tuple, boost::reference_wrapper > > : boost::graph_traits< Graph > { typedef boost::graph_traits Base; typedef typename Base::vertex_property_type vertex_property_type; }; template struct graph_traits< boost::tuple, boost::reference_wrapper > const > : boost::graph_traits< Graph > {}; template struct property_map< boost::tuple, boost::reference_wrapper >, PropertyTag> : public property_map {}; template struct property_map< const boost::tuple, boost::reference_wrapper >, PropertyTag> : public property_map {}; } // namespace boost namespace CGAL { template boost::tuple, boost::reference_wrapper > make_graph_with_visitor(V& v, Graph& g) { return boost::make_tuple(boost::ref(v), boost::ref(g)); } template class Visitor_base { public: typedef typename boost::graph_traits gt; typedef typename gt::halfedge_descriptor halfedge_descriptor; typedef typename gt::edge_descriptor edge_descriptor; typedef typename gt::vertex_descriptor vertex_descriptor; }; //// OVERLOADS FOR Visitor template void num_vertices(Visitor_base& w) {} template void num_edges(Visitor_base& w) {} template void degree(typename boost::graph_traits::vertex_descriptor v , const Visitor_base& w) {} template void out_degree(typename boost::graph_traits::vertex_descriptor v , const Visitor_base& w) {} template void in_degree(typename boost::graph_traits::vertex_descriptor v , const Visitor_base& w) {} template void source(typename boost::graph_traits::edge_descriptor e , const Visitor_base & w) {} template void target(typename boost::graph_traits::edge_descriptor e , const Visitor_base & w) {} template void edge(typename boost::graph_traits::vertex_descriptor u , typename boost::graph_traits::vertex_descriptor v , const Visitor_base & w) {} template inline void vertices(const Visitor_base & w) {} template inline void edges(const Visitor_base & w) {} template inline void in_edges(typename boost::graph_traits::vertex_descriptor u , const Visitor_base & w) {} template inline void out_edges(typename boost::graph_traits::vertex_descriptor u , const Visitor_base & w) {} // // MutableHalfedgeGraph // template void add_vertex(Visitor_base & w) {} template void add_vertex(const typename boost::graph_traits::vertex_property_type& p , Visitor_base & w) {} template void remove_vertex(typename boost::graph_traits< Graph >::vertex_descriptor v , Visitor_base & w) {} template void add_edge(Visitor_base & w) {} template void remove_edge(typename boost::graph_traits< Graph >::edge_descriptor e , Visitor_base & w) {} template void set_target(typename boost::graph_traits< Graph >::halfedge_descriptor h1 , typename boost::graph_traits< Graph >::vertex_descriptor v , Visitor_base & w) {} template void set_next(typename boost::graph_traits< Graph >::halfedge_descriptor h1 , typename boost::graph_traits< Graph >::halfedge_descriptor h2 , Visitor_base & w) {} // // MutableFaceGraph // template void add_face(Visitor_base & w) {} template void add_face(InputIterator begin, InputIterator end, Visitor_base & w) {} template void remove_face(typename boost::graph_traits< Graph >::face_descriptor f , Visitor_base & w) {} template void set_face(typename boost::graph_traits< Graph >::halfedge_descriptor h , typename boost::graph_traits< Graph >::face_descriptor f , const Visitor_base & w) {} template void set_halfedge(typename boost::graph_traits< Graph >::face_descriptor f , typename boost::graph_traits< Graph >::halfedge_descriptor h , Visitor_base & w) {} template void set_halfedge(typename boost::graph_traits< Graph >::vertex_descriptor v , typename boost::graph_traits< Graph >::halfedge_descriptor h , const Visitor_base & w) {} // // HalfedgeGraph // template void edge(typename boost::graph_traits< Graph >::halfedge_descriptor h , const Visitor_base & w) {} template void halfedge(typename boost::graph_traits< Graph >::edge_descriptor e , const Visitor_base & w) {} template void halfedge(typename boost::graph_traits< Graph >::vertex_descriptor v , const Visitor_base & w) {} template void halfedge(typename boost::graph_traits< Graph >::vertex_descriptor u , typename boost::graph_traits< Graph >::vertex_descriptor v , const Visitor_base & w) {} template void opposite(typename boost::graph_traits< Graph >::halfedge_descriptor h , const Visitor_base & w) {} template void source(typename boost::graph_traits< Graph >::halfedge_descriptor h , const Visitor_base & w) {} template void target(typename boost::graph_traits< Graph >::halfedge_descriptor h , const Visitor_base & w) {} template void next(typename boost::graph_traits< Graph >::halfedge_descriptor outedge , const Visitor_base & w) {} template void prev(typename boost::graph_traits< Graph >::halfedge_descriptor outedge , const Visitor_base & w) {} // // HalfedgeListGraph // template void halfedges(const Visitor_base & w) {} template void num_halfedges(const Visitor_base & w) {} // Graph template void face(typename boost::graph_traits< Graph >::halfedge_descriptor h , const Visitor_base & w) {} template void halfedge(typename boost::graph_traits< Graph >::face_descriptor f , const Visitor_base & w) {} template void faces(const Visitor_base & w) {} template void num_faces(const Visitor_base & w) {} template void is_valid(const Visitor_base & w, bool verbose = false) {} template void get(PropertyTag ptag, const Visitor_base& w) {} //// OVERLOADS FOR TUPLE template typename boost::graph_traits::vertices_size_type num_vertices(const boost::tuple, boost::reference_wrapper >& w) { num_vertices(boost::unwrap_ref(w.get<0>())); return num_vertices(boost::unwrap_ref(w.get<1>())); } template typename boost::graph_traits::edges_size_type num_edges(const boost::tuple, boost::reference_wrapper >& w) { num_edges(boost::unwrap_ref(w.get<0>())); return num_edges(boost::unwrap_ref(w.get<1>())); } template typename boost::graph_traits::degree_size_type degree(typename boost::graph_traits::vertex_descriptor v , const boost::tuple, boost::reference_wrapper >& w) { degree(v, boost::unwrap_ref(w.get<0>())); return degree(v, boost::unwrap_ref(w.get<1>())); } template typename boost::graph_traits::degree_size_type out_degree(typename boost::graph_traits::vertex_descriptor v , const boost::tuple, boost::reference_wrapper >& w) { out_degree(v, boost::unwrap_ref(w.get<0>())); return out_degree(v, boost::unwrap_ref(w.get<1>())); } template typename boost::graph_traits::degree_size_type in_degree(typename boost::graph_traits::vertex_descriptor v , const boost::tuple, boost::reference_wrapper >& w) { in_degree(v, boost::unwrap_ref(w.get<0>())); return in_degree(v, boost::unwrap_ref(w.get<1>())); } template typename boost::graph_traits::vertex_descriptor source(typename boost::graph_traits::edge_descriptor e , const boost::tuple, boost::reference_wrapper > & w) { source(e, boost::unwrap_ref(w.get<0>())); return source(e, boost::unwrap_ref(w.get<1>())); } template typename boost::graph_traits::vertex_descriptor target(typename boost::graph_traits::edge_descriptor e , const boost::tuple, boost::reference_wrapper > & w) { target(e, boost::unwrap_ref(w.get<0>())); return target(e, boost::unwrap_ref(w.get<1>())); } template std::pair::edge_descriptor, bool> edge(typename boost::graph_traits::vertex_descriptor u , typename boost::graph_traits::vertex_descriptor v , const boost::tuple, boost::reference_wrapper > & w) { edge(u, v, boost::unwrap_ref(w.get<0>())); return edge(u, v, boost::unwrap_ref(w.get<1>())); } template inline CGAL::Iterator_range::vertex_iterator> vertices(const boost::tuple, boost::reference_wrapper >& w) { vertices(boost::unwrap_ref(w.get<0>())); return vertices(boost::unwrap_ref(w.get<1>())); } template inline CGAL::Iterator_range::edge_iterator> edges(const boost::tuple, boost::reference_wrapper >& w) { edges(boost::unwrap_ref(w.get<0>())); return edges(boost::unwrap_ref(w.get<1>())); } template inline CGAL::Iterator_range::in_edge_iterator> in_edges(typename boost::graph_traits::vertex_descriptor u , const boost::tuple, boost::reference_wrapper >& w) { in_edges(u, boost::unwrap_ref(w.get<0>())); return in_edges(u, boost::unwrap_ref(w.get<1>())); } template inline CGAL::Iterator_range::out_edge_iterator> out_edges(typename boost::graph_traits::vertex_descriptor u , const boost::tuple, boost::reference_wrapper >& w) { out_edges(u, boost::unwrap_ref(w.get<0>())); return out_edges(u, boost::unwrap_ref(w.get<1>())); } // // MutableHalfedgeGraph // template typename boost::graph_traits< Graph >::vertex_descriptor add_vertex(boost::tuple, boost::reference_wrapper >& w) { add_vertex(boost::unwrap_ref(w.get<0>())); return add_vertex(boost::unwrap_ref(w.get<1>())); } template typename boost::graph_traits< Graph >::vertex_descriptor add_vertex(const typename boost::graph_traits::vertex_property_type& p , boost::tuple, boost::reference_wrapper >& w) { add_vertex(p, boost::unwrap_ref(w.get<0>())); return add_vertex(p, boost::unwrap_ref(w.get<1>())); } template void remove_vertex(typename boost::graph_traits< Graph >::vertex_descriptor v , boost::tuple, boost::reference_wrapper >& w) { remove_vertex(v, boost::unwrap_ref(w.get<0>())); remove_vertex(v, boost::unwrap_ref(w.get<1>())); } template typename boost::graph_traits< Graph >::edge_descriptor add_edge(boost::tuple, boost::reference_wrapper >& w) { add_edge(boost::unwrap_ref(w.get<0>())); return add_edge(boost::unwrap_ref(w.get<1>())); } template void remove_edge(typename boost::graph_traits< Graph >::edge_descriptor e , boost::tuple, boost::reference_wrapper >& w) { remove_edge(e, boost::unwrap_ref(w.get<0>())); remove_edge(e, boost::unwrap_ref(w.get<1>())); } template void set_target(typename boost::graph_traits< Graph >::halfedge_descriptor h1 , typename boost::graph_traits< Graph >::vertex_descriptor v , boost::tuple, boost::reference_wrapper >& w) { set_target(h1, v, boost::unwrap_ref(w.get<0>())); set_target(h1, v, boost::unwrap_ref(w.get<1>())); } template void set_next(typename boost::graph_traits< Graph >::halfedge_descriptor h1 , typename boost::graph_traits< Graph >::halfedge_descriptor h2 , boost::tuple, boost::reference_wrapper >& w) { set_next(h1, h2, boost::unwrap_ref(w.get<0>())); set_next(h1, h2, boost::unwrap_ref(w.get<1>())); } // // MutableFaceGraph // template typename boost::graph_traits< Graph >::face_descriptor add_face(boost::tuple, boost::reference_wrapper >& w) { add_face(boost::unwrap_ref(w.get<0>())); return add_face(boost::unwrap_ref(w.get<1>())); } template typename boost::graph_traits< Graph >::face_descriptor add_face(InputIterator begin, InputIterator end, boost::tuple, boost::reference_wrapper >& w) { add_face(begin, end, boost::unwrap_ref(w.get<0>())); return add_face(begin, end, boost::unwrap_ref(w.get<1>())); } template void remove_face(typename boost::graph_traits< Graph >::face_descriptor f , boost::tuple, boost::reference_wrapper >& w) { remove_face(f, boost::unwrap_ref(w.get<0>())); return remove_face(f, boost::unwrap_ref(w.get<1>())); } template void set_face(typename boost::graph_traits< Graph >::halfedge_descriptor h , typename boost::graph_traits< Graph >::face_descriptor f , const boost::tuple, boost::reference_wrapper >& w) { set_face(h, f, boost::unwrap_ref(w.get<0>())); set_face(h, f, boost::unwrap_ref(w.get<1>())); } template void set_halfedge(typename boost::graph_traits< Graph >::face_descriptor f , typename boost::graph_traits< Graph >::halfedge_descriptor h , boost::tuple, boost::reference_wrapper >& w) { set_halfedge(f, h, boost::unwrap_ref(w.get<0>())); set_halfedge(f, h, boost::unwrap_ref(w.get<1>())); } template void set_halfedge(typename boost::graph_traits< Graph >::vertex_descriptor v , typename boost::graph_traits< Graph >::halfedge_descriptor h , const boost::tuple, boost::reference_wrapper >& w) { set_halfedge(v, h, boost::unwrap_ref(w.get<0>())); set_halfedge(v, h, boost::unwrap_ref(w.get<1>())); } // // HalfedgeGraph // template typename boost::graph_traits< Graph >::edge_descriptor edge(typename boost::graph_traits< Graph >::halfedge_descriptor h , const boost::tuple, boost::reference_wrapper >& w) { edge(h, boost::unwrap_ref(w.get<0>())); return edge(h, boost::unwrap_ref(w.get<1>())); } template typename boost::graph_traits< Graph >::halfedge_descriptor halfedge(typename boost::graph_traits< Graph >::edge_descriptor e , const boost::tuple, boost::reference_wrapper >& w) { halfedge(e, boost::unwrap_ref(w.get<0>())); return halfedge(e, boost::unwrap_ref(w.get<1>())); } template typename boost::graph_traits< Graph >::halfedge_descriptor halfedge(typename boost::graph_traits< Graph >::vertex_descriptor v , const boost::tuple, boost::reference_wrapper >& w) { halfedge(v, boost::unwrap_ref(w.get<0>())); return halfedge(v, boost::unwrap_ref(w.get<1>())); } template std::pair< typename boost::graph_traits< Graph >::halfedge_descriptor , bool> halfedge(typename boost::graph_traits< Graph >::vertex_descriptor u , typename boost::graph_traits< Graph >::vertex_descriptor v , const boost::tuple, boost::reference_wrapper >& w) { halfedge(u, v, boost::unwrap_ref(w.get<0>())); return halfedge(u, v, boost::unwrap_ref(w.get<1>())); } template typename boost::graph_traits< Graph >::halfedge_descriptor opposite(typename boost::graph_traits< Graph >::halfedge_descriptor h , const boost::tuple, boost::reference_wrapper >& w) { opposite(h, boost::unwrap_ref(w.get<0>())); return opposite(h, boost::unwrap_ref(w.get<1>())); } template typename boost::graph_traits< Graph >::vertex_descriptor source(typename boost::graph_traits< Graph >::halfedge_descriptor h , const boost::tuple, boost::reference_wrapper >& w) { source(h, boost::unwrap_ref(w.get<0>())); return source(h, boost::unwrap_ref(w.get<1>())); } template typename boost::graph_traits< Graph >::vertex_descriptor target(typename boost::graph_traits< Graph >::halfedge_descriptor h , const boost::tuple, boost::reference_wrapper >& w) { target(h, boost::unwrap_ref(w.get<0>())); return target(h, boost::unwrap_ref(w.get<1>())); } template typename boost::graph_traits< Graph >::halfedge_descriptor next(typename boost::graph_traits< Graph >::halfedge_descriptor outedge , const boost::tuple, boost::reference_wrapper >& w) { next(outedge, boost::unwrap_ref(w.get<0>())); return next(outedge, boost::unwrap_ref(w.get<1>())); } template typename boost::graph_traits< Graph >::halfedge_descriptor prev(typename boost::graph_traits< Graph >::halfedge_descriptor outedge , const boost::tuple, boost::reference_wrapper >& w) { prev(outedge, boost::unwrap_ref(w.get<0>())); return prev(outedge, boost::unwrap_ref(w.get<1>())); } // // HalfedgeListGraph // template CGAL::Iterator_range::halfedge_iterator> halfedges(const boost::tuple, boost::reference_wrapper >& w) { halfedges(boost::unwrap_ref(w.get<0>())); return halfedges(boost::unwrap_ref(w.get<1>())); } template typename boost::graph_traits< Graph >::halfedges_size_type num_halfedges(const boost::tuple, boost::reference_wrapper >& w) { num_halfedges(boost::unwrap_ref(w.get<0>())); return num_halfedges(boost::unwrap_ref(w.get<1>())); } // Graph template typename boost::graph_traits< Graph >::face_descriptor face(typename boost::graph_traits< Graph >::halfedge_descriptor h , const boost::tuple, boost::reference_wrapper >& w) { face(h, boost::unwrap_ref(w.get<0>())); return face(h, boost::unwrap_ref(w.get<1>())); } template typename boost::graph_traits< Graph >::halfedge_descriptor halfedge(typename boost::graph_traits< Graph >::face_descriptor f , const boost::tuple, boost::reference_wrapper >& w) { halfedge(f, boost::unwrap_ref(w.get<0>())); return halfedge(f, boost::unwrap_ref(w.get<1>())); } template inline CGAL::Iterator_range::face_iterator > faces(const boost::tuple, boost::reference_wrapper >& w) { faces(boost::unwrap_ref(w.get<0>())); return faces(boost::unwrap_ref(w.get<1>())); } template typename boost::graph_traits::faces_size_type num_faces(const boost::tuple, boost::reference_wrapper >& w) { num_faces(boost::unwrap_ref(w.get<0>())); return num_faces(boost::unwrap_ref(w.get<1>())); } template bool is_valid(const boost::tuple, boost::reference_wrapper >& w , bool verbose = false) { is_valid(boost::unwrap_ref(w.get<0>()), verbose); return is_valid(boost::unwrap_ref(w.get<1>()), verbose); } template typename boost::property_map< Graph, PropertyTag >::type get(PropertyTag ptag, const boost::tuple, boost::reference_wrapper >& w) { get(ptag, boost::unwrap_ref(w.get<0>())); return get(ptag, boost::unwrap_ref(w.get<1>())); } }//end namespace CGAL #endif //CGAL_BOOST_GRAPH_VISITOR_H