From 58b4b81ccd532190898d05890c088e8f643d421f Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Mon, 13 Mar 2017 17:06:19 +0100 Subject: [PATCH] fix in_edges() and out_edges() --- BGL/include/CGAL/boost/graph/Dual.h | 10 ++++---- BGL/include/CGAL/boost/graph/iterator.h | 34 +++++++++++++++++++++++++ BGL/test/BGL/test_bgl_dual.cpp | 15 ++++++++++- 3 files changed, 53 insertions(+), 6 deletions(-) diff --git a/BGL/include/CGAL/boost/graph/Dual.h b/BGL/include/CGAL/boost/graph/Dual.h index b4d7ea60c4e..4d5dee0cc05 100644 --- a/BGL/include/CGAL/boost/graph/Dual.h +++ b/BGL/include/CGAL/boost/graph/Dual.h @@ -103,8 +103,8 @@ public: typedef typename GTP::halfedge_iterator halfedge_iterator; typedef typename GTP::edge_iterator edge_iterator; - typedef CGAL::Halfedge_around_face_iterator in_edge_iterator; - typedef CGAL::Opposite_edge_around_face_iterator out_edge_iterator; + typedef CGAL::Edge_around_face_iterator out_edge_iterator; + typedef CGAL::Opposite_edge_around_face_iterator in_edge_iterator; static vertex_descriptor null_vertex() { return vertex_descriptor(); } static face_descriptor null_face() { return face_descriptor(); } @@ -446,16 +446,16 @@ out_edges(typename boost::graph_traits >::vertex_descriptor v, const Dual

& dual) { const typename Dual

::Primal& primal = dual.primal(); - return opposite_edges_around_face(halfedge(v,primal),primal); + return edges_around_face(halfedge(v,primal),primal); } template -Iterator_range >::out_edge_iterator> +Iterator_range >::in_edge_iterator> in_edges(typename boost::graph_traits >::vertex_descriptor v, const Dual

& dual) { const typename Dual

::Primal& primal = dual.primal(); - return halfedges_around_face(halfedge(v,primal),primal); + return opposite_edges_around_face(halfedge(v,primal),primal); } template diff --git a/BGL/include/CGAL/boost/graph/iterator.h b/BGL/include/CGAL/boost/graph/iterator.h index d27a36cd23a..74d5ba5324b 100644 --- a/BGL/include/CGAL/boost/graph/iterator.h +++ b/BGL/include/CGAL/boost/graph/iterator.h @@ -1122,6 +1122,40 @@ opposite_edges_around_face(typename boost::graph_traits::halfedge_descrip return make_range(I(h,g), I(h,g,1)); } +template +class Edge_around_face_iterator +#ifndef DOXYGEN_RUNNING + : public boost::iterator_adaptor< + Edge_around_face_iterator // Derived + , Halfedge_around_face_iterator // Base + , typename boost::graph_traits::edge_descriptor // Value + , std::bidirectional_iterator_tag // CategoryOrTraversal + , typename boost::graph_traits::edge_descriptor // Reference + > +#endif +{ + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + internal::Edge fct; +public: + + Edge_around_face_iterator() + {} + + Edge_around_face_iterator(halfedge_descriptor h, const Graph& g, int n = 0) + : Edge_around_face_iterator::iterator_adaptor_(Halfedge_around_face_iterator(h,g,(h==halfedge_descriptor())?1:n)), fct(g) + {} +private: + friend class boost::iterator_core_access; + typename boost::graph_traits::edge_descriptor dereference() const { return fct(*this->base_reference()); } +}; + +template +Iterator_range > +edges_around_face(typename boost::graph_traits::halfedge_descriptor h, const Graph& g) +{ + typedef Edge_around_face_iterator I; + return make_range(I(h,g), I(h,g,1)); +} diff --git a/BGL/test/BGL/test_bgl_dual.cpp b/BGL/test/BGL/test_bgl_dual.cpp index 407caa60eab..1456eec0cc7 100644 --- a/BGL/test/BGL/test_bgl_dual.cpp +++ b/BGL/test/BGL/test_bgl_dual.cpp @@ -13,6 +13,8 @@ typedef CGAL::Dual Dual; typedef boost::graph_traits::face_descriptor face_descriptor; typedef boost::graph_traits::vertex_descriptor vertex_descriptor; typedef boost::graph_traits::halfedge_descriptor halfedge_descriptor; +typedef boost::graph_traits::out_edge_iterator out_edge_iterator; +typedef boost::graph_traits::in_edge_iterator in_edge_iterator; int main() { @@ -38,7 +40,18 @@ int main() BOOST_FOREACH(halfedge_descriptor lhd, halfedges_around_target(halfedge(vd,dual),dual)){ assert(target(lhd,dual) == vd); } - + + { + out_edge_iterator b,e; + boost::tie(b,e) = out_edges(vd,dual); + std::cerr << vd << " " << source(*b,dual) << std::endl; + } + + { + in_edge_iterator b,e; + boost::tie(b,e) = in_edges(vd,dual); + std::cerr << vd << " " << source(*b,dual) << std::endl; + } std::cerr << "done"<< std::endl; return 0; }