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 + -
显示快捷键?