graph_concepts.hpp

来自「CGAL is a collaborative effort of severa」· HPP 代码 · 共 509 行 · 第 1/2 页

HPP
509
字号
////=======================================================================// Copyright 1997, 1998, 1999, 2000 University of Notre Dame.// Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek//// This file is part of the Boost Graph Library//// You should have received a copy of the License Agreement for the// Boost Graph Library along with the software; see the file LICENSE.// If not, contact Office of Research, University of Notre Dame, Notre// Dame, IN 46556.//// Permission to modify the code and to distribute modified code is// granted, provided the text of this NOTICE is retained, a notice that// the code was modified is included with the above COPYRIGHT NOTICE and// with the COPYRIGHT NOTICE in the LICENSE file, and that the LICENSE// file is distributed with the modified code.//// LICENSOR MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED.// By way of example, but not limitation, Licensor MAKES NO// REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY// PARTICULAR PURPOSE OR THAT THE USE OF THE LICENSED SOFTWARE COMPONENTS// OR DOCUMENTATION WILL NOT INFRINGE ANY PATENTS, COPYRIGHTS, TRADEMARKS// OR OTHER RIGHTS.//=======================================================================//#ifndef BOOST_GRAPH_CONCEPTS_HPP#define BOOST_GRAPH_CONCEPTS_HPP#include <boost/config.hpp>#include <boost/graph/graph_traits.hpp>#include <boost/property_map.hpp>#include <boost/graph/properties.hpp>#include <boost/concept_check.hpp>#include <boost/detail/workaround.hpp>namespace boost {  template <class T>  struct MultiPassInputIteratorConcept {    void constraints() {      function_requires< InputIteratorConcept<T> >();    }  };  template <class G>  struct GraphConcept  {    typedef typename graph_traits<G>::vertex_descriptor vertex_descriptor;    typedef typename graph_traits<G>::directed_category directed_category;    typedef typename graph_traits<G>::edge_parallel_category      edge_parallel_category;    typedef typename graph_traits<G>::traversal_category      traversal_category;    void constraints() {      function_requires< DefaultConstructibleConcept<vertex_descriptor> >();      function_requires< EqualityComparableConcept<vertex_descriptor> >();      function_requires< AssignableConcept<vertex_descriptor> >();    }    G g;  };  template <class G>  struct IncidenceGraphConcept  {    typedef typename graph_traits<G>::edge_descriptor edge_descriptor;    typedef typename graph_traits<G>::out_edge_iterator      out_edge_iterator;    typedef typename graph_traits<G>::traversal_category      traversal_category;    void constraints() {      function_requires< GraphConcept<G> >();      function_requires< MultiPassInputIteratorConcept<out_edge_iterator> >();      function_requires< DefaultConstructibleConcept<edge_descriptor> >();      function_requires< EqualityComparableConcept<edge_descriptor> >();      function_requires< AssignableConcept<edge_descriptor> >();      function_requires< ConvertibleConcept<traversal_category,        incidence_graph_tag> >();      p = out_edges(v, g);      n = out_degree(v, g);      e = *p.first;      u = source(e, g);      v = target(e, g);      const_constraints(g);    }    void const_constraints(const G& g) {      p = out_edges(v, g);      n = out_degree(v, g);      e = *p.first;      u = source(e, g);      v = target(e, g);    }    std::pair<out_edge_iterator, out_edge_iterator> p;    typename graph_traits<G>::vertex_descriptor u, v;    typename graph_traits<G>::edge_descriptor e;    typename graph_traits<G>::degree_size_type n;    G g;  };  template <class G>  struct BidirectionalGraphConcept  {    typedef typename graph_traits<G>::in_edge_iterator      in_edge_iterator;    typedef typename graph_traits<G>::traversal_category      traversal_category;    void constraints() {      function_requires< IncidenceGraphConcept<G> >();      function_requires< MultiPassInputIteratorConcept<in_edge_iterator> >();      function_requires< ConvertibleConcept<traversal_category,        bidirectional_graph_tag> >();      p = in_edges(v, g);      n = in_degree(v, g);      e = *p.first;      const_constraints(g);    }    void const_constraints(const G& g) {      p = in_edges(v, g);      n = in_degree(v, g);      e = *p.first;    }    std::pair<in_edge_iterator, in_edge_iterator> p;    typename graph_traits<G>::vertex_descriptor v;    typename graph_traits<G>::edge_descriptor e;    typename graph_traits<G>::degree_size_type n;    G g;  };  template <class G>  struct AdjacencyGraphConcept  {    typedef typename graph_traits<G>::adjacency_iterator      adjacency_iterator;    typedef typename graph_traits<G>::traversal_category      traversal_category;    void constraints() {      function_requires< GraphConcept<G> >();      function_requires< MultiPassInputIteratorConcept<adjacency_iterator> >();      function_requires< ConvertibleConcept<traversal_category,        adjacency_graph_tag> >();      p = adjacent_vertices(v, g);      v = *p.first;      const_constraints(g);    }    void const_constraints(const G& g) {      p = adjacent_vertices(v, g);    }    std::pair<adjacency_iterator,adjacency_iterator> p;    typename graph_traits<G>::vertex_descriptor v;    G g;  };// dwa 2003/7/11 -- This clearly shouldn't be neccessary, but if// you want to use vector_as_graph, it is!  I'm sure the graph// library leaves these out all over the place.  Probably a// redesign involving specializing a template with a static// member function is in order :(//// It is needed in order to allow us to write using boost::vertices as// needed for ADL when using vector_as_graph below.#if !defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)            \ && !BOOST_WORKAROUND(__GNUC__, <= 2)                       \ && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))# define BOOST_VECTOR_AS_GRAPH_GRAPH_ADL_HACK#endif #ifdef BOOST_VECTOR_AS_GRAPH_GRAPH_ADL_HACKtemplate <class T>typename T::ThereReallyIsNoMemberByThisNameInT vertices(T const&);#endif        template <class G>  struct VertexListGraphConcept  {    typedef typename graph_traits<G>::vertex_iterator vertex_iterator;    typedef typename graph_traits<G>::vertices_size_type vertices_size_type;    typedef typename graph_traits<G>::traversal_category      traversal_category;    void constraints() {      function_requires< GraphConcept<G> >();      function_requires< MultiPassInputIteratorConcept<vertex_iterator> >();      function_requires< ConvertibleConcept<traversal_category,        vertex_list_graph_tag> >();#ifdef BOOST_VECTOR_AS_GRAPH_GRAPH_ADL_HACK      // dwa 2003/7/11 -- This clearly shouldn't be neccessary, but if      // you want to use vector_as_graph, it is!  I'm sure the graph      // library leaves these out all over the place.  Probably a      // redesign involving specializing a template with a static      // member function is in order :(      using boost::vertices;#endif            p = vertices(g);      v = *p.first;      const_constraints(g);    }    void const_constraints(const G& g) {#ifdef BOOST_VECTOR_AS_GRAPH_GRAPH_ADL_HACK      // dwa 2003/7/11 -- This clearly shouldn't be neccessary, but if      // you want to use vector_as_graph, it is!  I'm sure the graph      // library leaves these out all over the place.  Probably a      // redesign involving specializing a template with a static      // member function is in order :(      using boost::vertices;#endif             p = vertices(g);      v = *p.first;      V = num_vertices(g);    }    std::pair<vertex_iterator,vertex_iterator> p;    typename graph_traits<G>::vertex_descriptor v;    G g;    vertices_size_type V;  };  template <class G>  struct EdgeListGraphConcept  {    typedef typename graph_traits<G>::edge_descriptor edge_descriptor;    typedef typename graph_traits<G>::edge_iterator edge_iterator;    typedef typename graph_traits<G>::edges_size_type edges_size_type;    typedef typename graph_traits<G>::traversal_category      traversal_category;    void constraints() {      function_requires< GraphConcept<G> >();      function_requires< MultiPassInputIteratorConcept<edge_iterator> >();      function_requires< DefaultConstructibleConcept<edge_descriptor> >();      function_requires< EqualityComparableConcept<edge_descriptor> >();      function_requires< AssignableConcept<edge_descriptor> >();      function_requires< ConvertibleConcept<traversal_category,        edge_list_graph_tag> >();      p = edges(g);      e = *p.first;      u = source(e, g);      v = target(e, g);      const_constraints(g);    }    void const_constraints(const G& g) {      p = edges(g);      E = num_edges(g);      e = *p.first;      u = source(e, g);      v = target(e, g);    }    std::pair<edge_iterator,edge_iterator> p;    typename graph_traits<G>::vertex_descriptor u, v;    typename graph_traits<G>::edge_descriptor e;    edges_size_type E;    G g;  };

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?