#ifndef CGAL_BGL_DUAL_H #define CGAL_BGL_DUAL_H #include #include namespace CGAL { template class Dual { const Primal_& primal_; public: typedef Primal_ Primal; Dual(const Primal& primal) : primal_(primal) {} const Primal& primal() const { return primal_; } }; } // namespace CGAL namespace boost { template class graph_traits > { typedef boost::graph_traits GTP; struct Dual_traversal_category : public virtual boost::bidirectional_graph_tag, public virtual boost::vertex_list_graph_tag, public virtual boost::edge_list_graph_tag {}; public: typedef typename GTP::face_descriptor vertex_descriptor; typedef typename GTP::vertex_descriptor face_descriptor; typedef typename GTP::halfedge_descriptor halfedge_descriptor; typedef typename GTP::edge_descriptor edge_descriptor; typedef typename GTP::directed_category directed_category; typedef boost::allow_parallel_edge_tag edge_parallel_category; typedef Dual_traversal_category traversal_category; typedef typename GTP::faces_size_type vertices_size_type; typedef typename GTP::vertices_size_type faces_size_type; typedef typename GTP::edges_size_type edges_size_type; typedef typename GTP::halfedges_size_type halfedges_size_type; typedef typename GTP::degree_size_type degree_size_type; typedef typename GTP::face_iterator vertex_iterator; typedef typename GTP::vertex_iterator face_iterator; 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; static vertex_descriptor null_vertex() { return vertex_descriptor(); } static face_descriptor null_face() { return face_descriptor(); } static halfedge_descriptor null_halfedge() { return halfedge_descriptor(); } }; template struct graph_traits< const CGAL::Dual

> : public graph_traits< CGAL::Dual

> {}; template struct property_map, boost::vertex_index_t> { typedef typename property_map::type type; typedef typename property_map::const_type const_type; }; } // namespace boost namespace CGAL { template typename boost::property_map::type get(boost::vertex_index_t, const Dual

& dual) { return get(CGAL::face_index, dual.primal()); } template typename boost::graph_traits >::vertices_size_type num_vertices(const CGAL::Dual

& dual) { return num_faces(dual.primal()); } template Iterator_range >::vertex_iterator> vertices(const CGAL::Dual

& dual) { return faces(dual.primal()); } template Iterator_range >::halfedge_iterator> halfedges(const CGAL::Dual

& dual) { return halfedges(dual.primal()); } template Iterator_range >::edge_iterator> edges(const CGAL::Dual

& dual) { return edges(dual.primal()); } template typename boost::graph_traits >::vertex_descriptor source(typename boost::graph_traits >::halfedge_descriptor h, const Dual

& dual) { const typename Dual

::Primal& primal = dual.primal(); return face(opposite(h,primal),primal); } template typename boost::graph_traits >::vertex_descriptor target(typename boost::graph_traits >::halfedge_descriptor h, const Dual

& dual) { const typename Dual

::Primal& primal = dual.primal(); return face(h,primal); } template typename boost::graph_traits >::vertex_descriptor source(typename boost::graph_traits >::edge_descriptor h, const Dual

& dual) { const typename Dual

::Primal& primal = dual.primal(); return face(opposite(halfedge(h,primal),primal),primal); } template typename boost::graph_traits >::vertex_descriptor target(typename boost::graph_traits >::edge_descriptor h, const Dual

& dual) { const typename Dual

::Primal& primal = dual.primal(); return face(halfedge(h,primal),primal); } template typename boost::graph_traits >::halfedge_descriptor halfedge(typename boost::graph_traits >::vertex_descriptor v, const Dual

& dual) { return halfedge(v, dual.primal()); } template typename boost::graph_traits >::halfedge_descriptor halfedge(typename boost::graph_traits >::face_descriptor f, const Dual

& dual) { return halfedge(f, dual.primal()); } template typename boost::graph_traits >::halfedge_descriptor halfedge(typename boost::graph_traits >::edge_descriptor e, const Dual

& dual) { return halfedge(e, dual.primal()); } template typename boost::graph_traits >::face_descriptor face(typename boost::graph_traits >::halfedge_descriptor h, const Dual

& dual) { const typename Dual

::Primal& primal = dual.primal(); return target(h,primal); const typename Dual

::Primal& primal = dual.primal(); return vertex(h,primal); } template typename boost::graph_traits >::halfedge_descriptor opposite(typename boost::graph_traits >::halfedge_descriptor h, const Dual

& dual) { return opposite(h, dual.primal()); } template typename boost::graph_traits >::halfedge_descriptor next(typename boost::graph_traits >::halfedge_descriptor h, const Dual

& dual) { const typename Dual

::Primal& primal = dual.primal(); return opposite(prev(h,primal),primal); } template typename boost::graph_traits >::halfedge_descriptor prev(typename boost::graph_traits >::halfedge_descriptor h, const Dual

& dual) { const typename Dual

::Primal& primal = dual.primal(); return next(opposite(h,primal),primal); } template Iterator_range >::out_edge_iterator> out_edges(typename boost::graph_traits >::vertex_descriptor v, const Dual

& dual) { typename const Dual

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

& dual) { typename const Dual

::Primal& primal = dual.primal(); return halfedges_around_face(halfedge(v,primal),primal); } template typename boost::graph_traits >::degree_size_type out_degree(typename boost::graph_traits >::vertex_descriptor v, const Dual

& dual) { typename const Dual

::Primal& primal = dual.primal(); return boost::distance(halfedges_around_face(halfedge(v,primal),primal)); } template typename boost::graph_traits >::degree_size_type in_degree(typename boost::graph_traits >::vertex_descriptor v, const Dual

& dual) { return out_degree(v,dual); } } // namespace CGAL #endif