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