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 */ |