Chris@16: // Chris@16: //======================================================================= Chris@16: // Copyright 1997, 1998, 1999, 2000 University of Notre Dame. Chris@16: // Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek Chris@16: // Chris@16: // Copyright 2009, Andrew Sutton Chris@16: // Chris@16: // Distributed under the Boost Software License, Version 1.0. (See Chris@16: // accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: //======================================================================= Chris@16: // Chris@16: #ifndef BOOST_GRAPH_CONCEPTS_HPP Chris@16: #define BOOST_GRAPH_CONCEPTS_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: namespace boost Chris@16: { Chris@16: // dwa 2003/7/11 -- This clearly shouldn't be necessary, but if Chris@16: // you want to use vector_as_graph, it is! I'm sure the graph Chris@16: // library leaves these out all over the place. Probably a Chris@16: // redesign involving specializing a template with a static Chris@16: // member function is in order :( Chris@16: // Chris@16: // It is needed in order to allow us to write using boost::vertices as Chris@16: // needed for ADL when using vector_as_graph below. Chris@16: #if !defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP) \ Chris@16: && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) Chris@16: # define BOOST_VECTOR_AS_GRAPH_GRAPH_ADL_HACK Chris@16: #endif Chris@16: Chris@16: #ifdef BOOST_VECTOR_AS_GRAPH_GRAPH_ADL_HACK Chris@16: template Chris@16: typename T::ThereReallyIsNoMemberByThisNameInT vertices(T const&); Chris@16: #endif Chris@16: Chris@16: namespace concepts { Chris@16: BOOST_concept(MultiPassInputIterator,(T)) { Chris@16: BOOST_CONCEPT_USAGE(MultiPassInputIterator) { Chris@16: BOOST_CONCEPT_ASSERT((InputIterator)); Chris@16: } Chris@16: }; Chris@16: Chris@16: BOOST_concept(Graph,(G)) Chris@16: { Chris@16: typedef typename graph_traits::vertex_descriptor vertex_descriptor; Chris@16: typedef typename graph_traits::edge_descriptor edge_descriptor; Chris@16: typedef typename graph_traits::directed_category directed_category; Chris@16: typedef typename graph_traits::edge_parallel_category edge_parallel_category; Chris@16: typedef typename graph_traits::traversal_category traversal_category; Chris@16: Chris@16: BOOST_CONCEPT_USAGE(Graph) Chris@16: { Chris@16: BOOST_CONCEPT_ASSERT((DefaultConstructible)); Chris@16: BOOST_CONCEPT_ASSERT((EqualityComparable)); Chris@16: BOOST_CONCEPT_ASSERT((Assignable)); Chris@16: } Chris@16: G g; Chris@16: }; Chris@16: Chris@16: BOOST_concept(IncidenceGraph,(G)) Chris@16: : Graph Chris@16: { Chris@16: typedef typename graph_traits::edge_descriptor edge_descriptor; Chris@16: typedef typename graph_traits::out_edge_iterator out_edge_iterator; Chris@16: typedef typename graph_traits::degree_size_type degree_size_type; Chris@16: typedef typename graph_traits::traversal_category traversal_category; Chris@16: Chris@16: BOOST_STATIC_ASSERT((boost::mpl::not_ >::value)); Chris@16: BOOST_STATIC_ASSERT((boost::mpl::not_ >::value)); Chris@16: Chris@16: BOOST_CONCEPT_USAGE(IncidenceGraph) { Chris@16: BOOST_CONCEPT_ASSERT((MultiPassInputIterator)); Chris@16: BOOST_CONCEPT_ASSERT((DefaultConstructible)); Chris@16: BOOST_CONCEPT_ASSERT((EqualityComparable)); Chris@16: BOOST_CONCEPT_ASSERT((Assignable)); Chris@16: BOOST_CONCEPT_ASSERT((Convertible)); Chris@16: Chris@16: p = out_edges(u, g); Chris@16: n = out_degree(u, g); Chris@16: e = *p.first; Chris@16: u = source(e, g); Chris@16: v = target(e, g); Chris@16: const_constraints(g); Chris@16: } Chris@16: void const_constraints(const G& cg) { Chris@16: p = out_edges(u, cg); Chris@16: n = out_degree(u, cg); Chris@16: e = *p.first; Chris@16: u = source(e, cg); Chris@16: v = target(e, cg); Chris@16: } Chris@16: std::pair p; Chris@16: typename graph_traits::vertex_descriptor u, v; Chris@16: typename graph_traits::edge_descriptor e; Chris@16: typename graph_traits::degree_size_type n; Chris@16: G g; Chris@16: }; Chris@16: Chris@16: BOOST_concept(BidirectionalGraph,(G)) Chris@16: : IncidenceGraph Chris@16: { Chris@16: typedef typename graph_traits::in_edge_iterator Chris@16: in_edge_iterator; Chris@16: typedef typename graph_traits::traversal_category Chris@16: traversal_category; Chris@16: Chris@16: BOOST_CONCEPT_USAGE(BidirectionalGraph) { Chris@16: BOOST_CONCEPT_ASSERT((MultiPassInputIterator)); Chris@16: BOOST_CONCEPT_ASSERT((Convertible)); Chris@16: Chris@16: BOOST_STATIC_ASSERT((boost::mpl::not_ >::value)); Chris@16: Chris@16: p = in_edges(v, g); Chris@16: n = in_degree(v, g); Chris@16: e = *p.first; Chris@16: const_constraints(g); Chris@16: } Chris@16: void const_constraints(const G& cg) { Chris@16: p = in_edges(v, cg); Chris@16: n = in_degree(v, cg); Chris@16: e = *p.first; Chris@16: } Chris@16: std::pair p; Chris@16: typename graph_traits::vertex_descriptor v; Chris@16: typename graph_traits::edge_descriptor e; Chris@16: typename graph_traits::degree_size_type n; Chris@16: G g; Chris@16: }; Chris@16: Chris@16: BOOST_concept(AdjacencyGraph,(G)) Chris@16: : Graph Chris@16: { Chris@16: typedef typename graph_traits::adjacency_iterator Chris@16: adjacency_iterator; Chris@16: typedef typename graph_traits::traversal_category Chris@16: traversal_category; Chris@16: Chris@16: BOOST_CONCEPT_USAGE(AdjacencyGraph) { Chris@16: BOOST_CONCEPT_ASSERT((MultiPassInputIterator)); Chris@16: BOOST_CONCEPT_ASSERT((Convertible)); Chris@16: Chris@16: BOOST_STATIC_ASSERT((boost::mpl::not_ >::value)); Chris@16: Chris@16: p = adjacent_vertices(v, g); Chris@16: v = *p.first; Chris@16: const_constraints(g); Chris@16: } Chris@16: void const_constraints(const G& cg) { Chris@16: p = adjacent_vertices(v, cg); Chris@16: } Chris@16: std::pair p; Chris@16: typename graph_traits::vertex_descriptor v; Chris@16: G g; Chris@16: }; Chris@16: Chris@16: BOOST_concept(VertexListGraph,(G)) Chris@16: : Graph Chris@16: { Chris@16: typedef typename graph_traits::vertex_iterator vertex_iterator; Chris@16: typedef typename graph_traits::vertices_size_type vertices_size_type; Chris@16: typedef typename graph_traits::traversal_category Chris@16: traversal_category; Chris@16: Chris@16: BOOST_CONCEPT_USAGE(VertexListGraph) { Chris@16: BOOST_CONCEPT_ASSERT((MultiPassInputIterator)); Chris@16: BOOST_CONCEPT_ASSERT((Convertible)); Chris@16: Chris@16: BOOST_STATIC_ASSERT((boost::mpl::not_ >::value)); Chris@16: BOOST_STATIC_ASSERT((boost::mpl::not_ >::value)); Chris@16: Chris@16: #ifdef BOOST_VECTOR_AS_GRAPH_GRAPH_ADL_HACK Chris@16: // dwa 2003/7/11 -- This clearly shouldn't be necessary, but if Chris@16: // you want to use vector_as_graph, it is! I'm sure the graph Chris@16: // library leaves these out all over the place. Probably a Chris@16: // redesign involving specializing a template with a static Chris@16: // member function is in order :( Chris@16: using boost::vertices; Chris@16: #endif Chris@16: p = vertices(g); Chris@16: v = *p.first; Chris@16: const_constraints(g); Chris@16: } Chris@16: void const_constraints(const G& cg) { Chris@16: #ifdef BOOST_VECTOR_AS_GRAPH_GRAPH_ADL_HACK Chris@16: // dwa 2003/7/11 -- This clearly shouldn't be necessary, but if Chris@16: // you want to use vector_as_graph, it is! I'm sure the graph Chris@16: // library leaves these out all over the place. Probably a Chris@16: // redesign involving specializing a template with a static Chris@16: // member function is in order :( Chris@16: using boost::vertices; Chris@16: #endif Chris@16: Chris@16: p = vertices(cg); Chris@16: v = *p.first; Chris@16: V = num_vertices(cg); Chris@16: } Chris@16: std::pair p; Chris@16: typename graph_traits::vertex_descriptor v; Chris@16: G g; Chris@16: vertices_size_type V; Chris@16: }; Chris@16: Chris@16: BOOST_concept(EdgeListGraph,(G)) Chris@16: : Graph Chris@16: { Chris@16: typedef typename graph_traits::edge_descriptor edge_descriptor; Chris@16: typedef typename graph_traits::edge_iterator edge_iterator; Chris@16: typedef typename graph_traits::edges_size_type edges_size_type; Chris@16: typedef typename graph_traits::traversal_category Chris@16: traversal_category; Chris@16: Chris@16: BOOST_CONCEPT_USAGE(EdgeListGraph) { Chris@16: BOOST_CONCEPT_ASSERT((MultiPassInputIterator)); Chris@16: BOOST_CONCEPT_ASSERT((DefaultConstructible)); Chris@16: BOOST_CONCEPT_ASSERT((EqualityComparable)); Chris@16: BOOST_CONCEPT_ASSERT((Assignable)); Chris@16: BOOST_CONCEPT_ASSERT((Convertible)); Chris@16: Chris@16: BOOST_STATIC_ASSERT((boost::mpl::not_ >::value)); Chris@16: BOOST_STATIC_ASSERT((boost::mpl::not_ >::value)); Chris@16: Chris@16: p = edges(g); Chris@16: e = *p.first; Chris@16: u = source(e, g); Chris@16: v = target(e, g); Chris@16: const_constraints(g); Chris@16: } Chris@16: void const_constraints(const G& cg) { Chris@16: p = edges(cg); Chris@16: E = num_edges(cg); Chris@16: e = *p.first; Chris@16: u = source(e, cg); Chris@16: v = target(e, cg); Chris@16: } Chris@16: std::pair p; Chris@16: typename graph_traits::vertex_descriptor u, v; Chris@16: typename graph_traits::edge_descriptor e; Chris@16: edges_size_type E; Chris@16: G g; Chris@16: }; Chris@16: Chris@16: BOOST_concept(VertexAndEdgeListGraph,(G)) Chris@16: : VertexListGraph Chris@16: , EdgeListGraph Chris@16: { Chris@16: }; Chris@16: Chris@16: // Where to put the requirement for this constructor? Chris@16: // G g(n_vertices); Chris@16: // Not in mutable graph, then LEDA graph's can't be models of Chris@16: // MutableGraph. Chris@16: BOOST_concept(EdgeMutableGraph,(G)) Chris@16: { Chris@16: typedef typename graph_traits::edge_descriptor edge_descriptor; Chris@16: Chris@16: BOOST_CONCEPT_USAGE(EdgeMutableGraph) { Chris@16: p = add_edge(u, v, g); Chris@16: remove_edge(u, v, g); Chris@16: remove_edge(e, g); Chris@16: clear_vertex(v, g); Chris@16: } Chris@16: G g; Chris@16: edge_descriptor e; Chris@16: std::pair p; Chris@16: typename graph_traits::vertex_descriptor u, v; Chris@16: }; Chris@16: Chris@16: BOOST_concept(VertexMutableGraph,(G)) Chris@16: { Chris@16: Chris@16: BOOST_CONCEPT_USAGE(VertexMutableGraph) { Chris@16: v = add_vertex(g); Chris@16: remove_vertex(v, g); Chris@16: } Chris@16: G g; Chris@16: typename graph_traits::vertex_descriptor u, v; Chris@16: }; Chris@16: Chris@16: BOOST_concept(MutableGraph,(G)) Chris@16: : EdgeMutableGraph Chris@16: , VertexMutableGraph Chris@16: { Chris@16: }; Chris@16: Chris@16: template Chris@16: struct dummy_edge_predicate { Chris@16: bool operator()(const edge_descriptor&) const { Chris@16: return false; Chris@16: } Chris@16: }; Chris@16: Chris@16: BOOST_concept(MutableIncidenceGraph,(G)) Chris@16: : MutableGraph Chris@16: { Chris@16: BOOST_CONCEPT_USAGE(MutableIncidenceGraph) { Chris@16: remove_edge(iter, g); Chris@16: remove_out_edge_if(u, p, g); Chris@16: } Chris@16: G g; Chris@16: typedef typename graph_traits::edge_descriptor edge_descriptor; Chris@16: dummy_edge_predicate p; Chris@16: typename boost::graph_traits::vertex_descriptor u; Chris@16: typename boost::graph_traits::out_edge_iterator iter; Chris@16: }; Chris@16: Chris@16: BOOST_concept(MutableBidirectionalGraph,(G)) Chris@16: : MutableIncidenceGraph Chris@16: { Chris@16: BOOST_CONCEPT_USAGE(MutableBidirectionalGraph) Chris@16: { Chris@16: remove_in_edge_if(u, p, g); Chris@16: } Chris@16: G g; Chris@16: typedef typename graph_traits::edge_descriptor edge_descriptor; Chris@16: dummy_edge_predicate p; Chris@16: typename boost::graph_traits::vertex_descriptor u; Chris@16: }; Chris@16: Chris@16: BOOST_concept(MutableEdgeListGraph,(G)) Chris@16: : EdgeMutableGraph Chris@16: { Chris@16: BOOST_CONCEPT_USAGE(MutableEdgeListGraph) { Chris@16: remove_edge_if(p, g); Chris@16: } Chris@16: G g; Chris@16: typedef typename graph_traits::edge_descriptor edge_descriptor; Chris@16: dummy_edge_predicate p; Chris@16: }; Chris@16: Chris@16: BOOST_concept(VertexMutablePropertyGraph,(G)) Chris@16: : VertexMutableGraph Chris@16: { Chris@16: BOOST_CONCEPT_USAGE(VertexMutablePropertyGraph) { Chris@16: v = add_vertex(vp, g); Chris@16: } Chris@16: G g; Chris@16: typename graph_traits::vertex_descriptor v; Chris@16: typename vertex_property_type::type vp; Chris@16: }; Chris@16: Chris@16: BOOST_concept(EdgeMutablePropertyGraph,(G)) Chris@16: : EdgeMutableGraph Chris@16: { Chris@16: typedef typename graph_traits::edge_descriptor edge_descriptor; Chris@16: Chris@16: BOOST_CONCEPT_USAGE(EdgeMutablePropertyGraph) { Chris@16: p = add_edge(u, v, ep, g); Chris@16: } Chris@16: G g; Chris@16: std::pair p; Chris@16: typename graph_traits::vertex_descriptor u, v; Chris@16: typename edge_property_type::type ep; Chris@16: }; Chris@16: Chris@16: BOOST_concept(AdjacencyMatrix,(G)) Chris@16: : Graph Chris@16: { Chris@16: typedef typename graph_traits::edge_descriptor edge_descriptor; Chris@16: Chris@16: BOOST_CONCEPT_USAGE(AdjacencyMatrix) { Chris@16: p = edge(u, v, g); Chris@16: const_constraints(g); Chris@16: } Chris@16: void const_constraints(const G& cg) { Chris@16: p = edge(u, v, cg); Chris@16: } Chris@16: typename graph_traits::vertex_descriptor u, v; Chris@16: std::pair p; Chris@16: G g; Chris@16: }; Chris@16: Chris@16: BOOST_concept(ReadablePropertyGraph,(G)(X)(Property)) Chris@16: : Graph Chris@16: { Chris@16: typedef typename property_map::const_type const_Map; Chris@16: Chris@16: BOOST_CONCEPT_USAGE(ReadablePropertyGraph) Chris@16: { Chris@16: BOOST_CONCEPT_ASSERT((ReadablePropertyMapConcept)); Chris@16: Chris@16: const_constraints(g); Chris@16: } Chris@16: void const_constraints(const G& cg) { Chris@16: const_Map pmap = get(Property(), cg); Chris@16: pval = get(Property(), cg, x); Chris@16: ignore_unused_variable_warning(pmap); Chris@16: } Chris@16: G g; Chris@16: X x; Chris@16: typename property_traits::value_type pval; Chris@16: }; Chris@16: Chris@16: BOOST_concept(PropertyGraph,(G)(X)(Property)) Chris@16: : ReadablePropertyGraph Chris@16: { Chris@16: typedef typename property_map::type Map; Chris@16: BOOST_CONCEPT_USAGE(PropertyGraph) { Chris@16: BOOST_CONCEPT_ASSERT((ReadWritePropertyMapConcept)); Chris@16: Chris@16: Map pmap = get(Property(), g); Chris@16: pval = get(Property(), g, x); Chris@16: put(Property(), g, x, pval); Chris@16: ignore_unused_variable_warning(pmap); Chris@16: } Chris@16: G g; Chris@16: X x; Chris@16: typename property_traits::value_type pval; Chris@16: }; Chris@16: Chris@16: BOOST_concept(LvaluePropertyGraph,(G)(X)(Property)) Chris@16: : ReadablePropertyGraph Chris@16: { Chris@16: typedef typename property_map::type Map; Chris@16: typedef typename property_map::const_type const_Map; Chris@16: Chris@16: BOOST_CONCEPT_USAGE(LvaluePropertyGraph) { Chris@16: BOOST_CONCEPT_ASSERT((LvaluePropertyMapConcept)); Chris@16: Chris@16: pval = get(Property(), g, x); Chris@16: put(Property(), g, x, pval); Chris@16: } Chris@16: G g; Chris@16: X x; Chris@16: typename property_traits::value_type pval; Chris@16: }; Chris@16: Chris@16: // The *IndexGraph concepts are "semantic" graph concpepts. These can be Chris@16: // applied to describe any graph that has an index map that can be accessed Chris@16: // using the get(*_index, g) method. For example, adjacency lists with Chris@16: // VertexSet == vecS are implicitly models of this concept. Chris@16: // Chris@16: // NOTE: We could require an associated type vertex_index_type, but that Chris@16: // would mean propagating that type name into graph_traits and all of the Chris@16: // other graph implementations. Much easier to simply call it unsigned. Chris@16: Chris@16: BOOST_concept(VertexIndexGraph,(Graph)) Chris@16: { Chris@16: BOOST_CONCEPT_USAGE(VertexIndexGraph) Chris@16: { Chris@16: typedef typename graph_traits::vertex_descriptor Vertex; Chris@16: typedef typename property_map::type Map; Chris@16: typedef unsigned Index; // This could be Graph::vertex_index_type Chris@16: Map m = get(vertex_index, g); Chris@16: Index x = get(vertex_index, g, Vertex()); Chris@16: ignore_unused_variable_warning(m); Chris@16: ignore_unused_variable_warning(x); Chris@16: Chris@16: // This is relaxed Chris@16: renumber_vertex_indices(g); Chris@16: Chris@16: const_constraints(g); Chris@16: } Chris@101: void const_constraints(const Graph& g_) Chris@16: { Chris@16: typedef typename property_map::const_type Map; Chris@101: Map m = get(vertex_index, g_); Chris@16: ignore_unused_variable_warning(m); Chris@16: } Chris@16: private: Chris@16: Graph g; Chris@16: }; Chris@16: Chris@16: BOOST_concept(EdgeIndexGraph,(Graph)) Chris@16: { Chris@16: BOOST_CONCEPT_USAGE(EdgeIndexGraph) Chris@16: { Chris@16: typedef typename graph_traits::edge_descriptor Edge; Chris@16: typedef typename property_map::type Map; Chris@16: typedef unsigned Index; // This could be Graph::vertex_index_type Chris@16: Map m = get(edge_index, g); Chris@16: Index x = get(edge_index, g, Edge()); Chris@16: ignore_unused_variable_warning(m); Chris@16: ignore_unused_variable_warning(x); Chris@16: Chris@16: // This is relaxed Chris@16: renumber_edge_indices(g); Chris@16: Chris@16: const_constraints(g); Chris@16: } Chris@101: void const_constraints(const Graph& g_) Chris@16: { Chris@16: typedef typename property_map::const_type Map; Chris@101: Map m = get(edge_index, g_); Chris@16: ignore_unused_variable_warning(m); Chris@16: } Chris@16: private: Chris@16: Graph g; Chris@16: }; Chris@16: Chris@16: BOOST_concept(ColorValue,(C)) Chris@16: : EqualityComparable Chris@16: , DefaultConstructible Chris@16: { Chris@16: BOOST_CONCEPT_USAGE(ColorValue) { Chris@16: c = color_traits::white(); Chris@16: c = color_traits::gray(); Chris@16: c = color_traits::black(); Chris@16: } Chris@16: C c; Chris@16: }; Chris@16: Chris@16: BOOST_concept(BasicMatrix,(M)(I)(V)) Chris@16: { Chris@16: BOOST_CONCEPT_USAGE(BasicMatrix) { Chris@16: V& elt = A[i][j]; Chris@16: const_constraints(A); Chris@16: ignore_unused_variable_warning(elt); Chris@16: } Chris@16: void const_constraints(const M& cA) { Chris@16: const V& elt = cA[i][j]; Chris@16: ignore_unused_variable_warning(elt); Chris@16: } Chris@16: M A; Chris@16: I i, j; Chris@16: }; Chris@16: Chris@16: // The following concepts describe aspects of numberic values and measure Chris@16: // functions. We're extending the notion of numeric values to include Chris@16: // emulation for zero and infinity. Chris@16: Chris@16: BOOST_concept(NumericValue,(Numeric)) Chris@16: { Chris@16: BOOST_CONCEPT_USAGE(NumericValue) Chris@16: { Chris@16: BOOST_CONCEPT_ASSERT(( DefaultConstructible )); Chris@16: BOOST_CONCEPT_ASSERT(( CopyConstructible )); Chris@16: numeric_values::zero(); Chris@16: numeric_values::infinity(); Chris@16: } Chris@16: }; Chris@16: Chris@16: BOOST_concept(DegreeMeasure,(Measure)(Graph)) Chris@16: { Chris@16: BOOST_CONCEPT_USAGE(DegreeMeasure) Chris@16: { Chris@16: typedef typename Measure::degree_type Degree; Chris@16: typedef typename Measure::vertex_type Vertex; Chris@16: Chris@16: Degree d = m(Vertex(), g); Chris@16: ignore_unused_variable_warning(d); Chris@16: } Chris@16: private: Chris@16: Measure m; Chris@16: Graph g; Chris@16: }; Chris@16: Chris@16: BOOST_concept(DistanceMeasure,(Measure)(Graph)) Chris@16: { Chris@16: BOOST_CONCEPT_USAGE(DistanceMeasure) Chris@16: { Chris@16: typedef typename Measure::distance_type Distance; Chris@16: typedef typename Measure::result_type Result; Chris@16: Result r = m(Distance(), g); Chris@16: ignore_unused_variable_warning(r); Chris@16: } Chris@16: private: Chris@16: Measure m; Chris@16: Graph g; Chris@16: }; Chris@16: Chris@16: } /* namespace concepts */ Chris@16: Chris@16: using boost::concepts::MultiPassInputIteratorConcept; Chris@16: Chris@16: // Graph concepts Chris@16: using boost::concepts::GraphConcept; Chris@16: using boost::concepts::IncidenceGraphConcept; Chris@16: using boost::concepts::BidirectionalGraphConcept; Chris@16: using boost::concepts::AdjacencyGraphConcept; Chris@16: using boost::concepts::VertexListGraphConcept; Chris@16: using boost::concepts::EdgeListGraphConcept; Chris@16: using boost::concepts::VertexAndEdgeListGraphConcept; Chris@16: using boost::concepts::EdgeMutableGraphConcept; Chris@16: using boost::concepts::VertexMutableGraphConcept; Chris@16: using boost::concepts::MutableGraphConcept; Chris@16: using boost::concepts::MutableIncidenceGraphConcept; Chris@16: using boost::concepts::MutableBidirectionalGraphConcept; Chris@16: using boost::concepts::MutableEdgeListGraphConcept; Chris@16: using boost::concepts::VertexMutablePropertyGraphConcept; Chris@16: using boost::concepts::EdgeMutablePropertyGraphConcept; Chris@16: using boost::concepts::AdjacencyMatrixConcept; Chris@16: using boost::concepts::ReadablePropertyGraphConcept; Chris@16: using boost::concepts::PropertyGraphConcept; Chris@16: using boost::concepts::LvaluePropertyGraphConcept; Chris@16: using boost::concepts::VertexIndexGraphConcept; Chris@16: using boost::concepts::EdgeIndexGraphConcept; Chris@16: Chris@16: // Utility concepts Chris@16: using boost::concepts::ColorValueConcept; Chris@16: using boost::concepts::BasicMatrixConcept; Chris@16: using boost::concepts::NumericValueConcept; Chris@16: using boost::concepts::DistanceMeasureConcept; Chris@16: using boost::concepts::DegreeMeasureConcept; Chris@16: Chris@16: Chris@16: } /* namespace boost */ Chris@16: #include Chris@16: Chris@16: #endif /* BOOST_GRAPH_CONCEPTS_H */