| // Copyright (C) 2004-2006 The Trustees of Indiana University. |
| |
| // Use, modification and distribution is subject to 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) |
| |
| // Authors: Douglas Gregor |
| // Andrew Lumsdaine |
| |
| // |
| // Distributed graph concepts and helpers |
| // |
| |
| #ifndef BOOST_GRAPH_DISTRIBUTED_CONCEPTS_HPP |
| #define BOOST_GRAPH_DISTRIBUTED_CONCEPTS_HPP |
| |
| #ifndef BOOST_GRAPH_USE_MPI |
| #error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included" |
| #endif |
| |
| #include <boost/version.hpp> |
| #include <boost/graph/graph_traits.hpp> |
| #include <boost/graph/graph_concepts.hpp> |
| |
| #if BOOST_VERSION >= 103500 |
| # include <boost/concept/detail/concept_def.hpp> |
| #endif |
| |
| namespace boost { |
| |
| class distributed_graph_tag { }; |
| class distributed_vertex_list_graph_tag { }; |
| class distributed_edge_list_graph_tag { }; |
| |
| #if BOOST_VERSION >= 103500 |
| namespace concepts { |
| #endif |
| |
| #if BOOST_VERSION < 103500 |
| |
| template <class G> |
| struct DistributedVertexListGraphConcept |
| { |
| 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, |
| distributed_vertex_list_graph_tag> >(); |
| |
| #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; |
| }; |
| |
| template <class G> |
| struct DistributedEdgeListGraphConcept |
| { |
| 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, |
| distributed_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& 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; |
| }; |
| #else |
| BOOST_concept(DistributedVertexListGraph,(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; |
| ~DistributedVertexListGraph() { |
| BOOST_CONCEPT_ASSERT((MultiPassInputIterator<vertex_iterator>)); |
| BOOST_CONCEPT_ASSERT((Convertible<traversal_category, |
| distributed_vertex_list_graph_tag>)); |
| |
| #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(DistributedEdgeListGraph,(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; |
| ~DistributedEdgeListGraph() { |
| 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, |
| distributed_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& 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; |
| }; |
| #endif |
| |
| #if BOOST_VERSION >= 103500 |
| } // end namespace concepts |
| |
| using concepts::DistributedVertexListGraphConcept; |
| using concepts::DistributedEdgeListGraphConcept; |
| #endif |
| } // end namespace boost |
| |
| #if BOOST_VERSION >= 103500 |
| # include <boost/concept/detail/concept_undef.hpp> |
| #endif |
| |
| #endif // BOOST_GRAPH_DISTRIBUTED_CONCEPTS_HPP |