boost/graph/graph_archetypes.hpp | 247 ++++++++++++++++++++++++++++++++++++ libs/graph/test/graph_concepts.cpp | 16 +++ 2 files changed, 263 insertions(+) diff --git a/boost/graph/graph_archetypes.hpp b/boost/graph/graph_archetypes.hpp index 81f9c2c..f4a8e34 100644 --- a/boost/graph/graph_archetypes.hpp +++ b/boost/graph/graph_archetypes.hpp @@ -187,7 +187,254 @@ namespace boost { // should use a different namespace for this } //=========================================================================== + template + struct edge_list_graph_archetype : public Base + { + typedef typename Base::traversal_category base_trav_cat; + struct traversal_category + : public edge_list_graph_tag, public base_trav_cat { }; + + typedef Vertex vertex_descriptor; + typedef unsigned int edges_size_type; + typedef Directed directed_category; + typedef ParallelCategory edge_parallel_category; + + struct edge_descriptor { + edge_descriptor() { } + edge_descriptor(const detail::dummy_constructor&) { } + bool operator==(const edge_descriptor&) const { return false; } + bool operator!=(const edge_descriptor&) const { return false; } + }; + typedef input_iterator_archetype edge_iterator; + + static vertex_descriptor null_vertex() {return vertex_descriptor();} + }; + + template + std::pair::edge_iterator, + typename edge_list_graph_archetype::edge_iterator> + edges(const edge_list_graph_archetype& ) + { + typedef typename edge_list_graph_archetype::edge_iterator Iter; + return std::make_pair(Iter(), Iter()); + } + + template + typename edge_list_graph_archetype::edges_size_type + num_edges(const edge_list_graph_archetype& ) + { + return 0; + } + + template + V source(const typename edge_list_graph_archetype::edge_descriptor&, + const edge_list_graph_archetype& ) + { + return V(static_object::get()); + } + + template + V target(const typename edge_list_graph_archetype::edge_descriptor&, + const edge_list_graph_archetype& ) + { + return V(static_object::get()); + } + + //=========================================================================== + template + struct vertex_and_edge_list_graph_archetype : public Base + { + typedef typename Base::traversal_category base_trav_cat; + struct traversal_category + : public vertex_list_graph_tag, + public edge_list_graph_tag, + public base_trav_cat { }; + + typedef vertex_list_graph_archetype + VertexList; + typedef edge_list_graph_archetype + EdgeList; + + typedef Directed directed_category; + typedef ParallelCategory edge_parallel_category; + + typedef Vertex vertex_descriptor; + + typedef typename VertexList::out_edge_iterator out_edge_iterator; + typedef typename VertexList::adjacency_iterator adjacency_iterator; + + typedef typename VertexList::vertices_size_type vertices_size_type; + typedef typename VertexList::vertex_iterator vertex_iterator; + + typedef typename EdgeList::edge_descriptor edge_descriptor; + typedef typename EdgeList::edge_iterator edge_iterator; + typedef typename EdgeList::edges_size_type edges_size_type; + + static vertex_descriptor null_vertex() {return vertex_descriptor();} + }; + + template + std::pair::vertex_iterator, + typename vertex_and_edge_list_graph_archetype::vertex_iterator> + vertices(const vertex_and_edge_list_graph_archetype& ) + { + typedef typename vertex_and_edge_list_graph_archetype::vertex_iterator Iter; + return std::make_pair(Iter(), Iter()); + } + + template + typename vertex_and_edge_list_graph_archetype::vertices_size_type + num_vertices(const vertex_and_edge_list_graph_archetype& ) + { + return 0; + } + + template + typename vertex_and_edge_list_graph_archetype::degree_size_type + out_degree(const V&, const vertex_and_edge_list_graph_archetype& ) + { + return 0; + } + + template + std::pair::edge_iterator, + typename vertex_and_edge_list_graph_archetype::edge_iterator> + edges(const vertex_and_edge_list_graph_archetype& ) + { + typedef typename vertex_and_edge_list_graph_archetype::edge_iterator Iter; + return std::make_pair(Iter(), Iter()); + } + + template + typename vertex_and_edge_list_graph_archetype::edges_size_type + num_edges(const vertex_and_edge_list_graph_archetype& ) + { + return 0; + } + template + V source(const typename vertex_and_edge_list_graph_archetype::edge_descriptor&, + const vertex_and_edge_list_graph_archetype& ) + { + return V(static_object::get()); + } + + template + V target(const typename vertex_and_edge_list_graph_archetype::edge_descriptor&, + const vertex_and_edge_list_graph_archetype& ) + { + return V(static_object::get()); + } + + //=========================================================================== + template + struct adjacency_matrix_archetype : public Base + { + typedef typename Base::traversal_category base_trav_cat; + struct traversal_category + : public adjacency_matrix_tag, public base_trav_cat { }; + typedef Vertex vertex_descriptor; + struct edge_descriptor { + edge_descriptor() { } + edge_descriptor(const detail::dummy_constructor&) { } + bool operator==(const edge_descriptor&) const { return false; } + bool operator!=(const edge_descriptor&) const { return false; } + }; + + typedef Directed directed_category; + typedef ParallelCategory edge_parallel_category; + + static vertex_descriptor null_vertex() {return vertex_descriptor();} + }; + + template + std::pair::edge_descriptor, + bool> + edge(const V&, const V&, const adjacency_matrix_archetype& ) + { + typedef typename adjacency_matrix_archetype::edge_descriptor Descriptor; + return std::make_pair(Descriptor(), bool()); + } + + //=========================================================================== + template + struct bidirectional_graph_archetype : public Base + { + typedef incidence_graph_archetype + Incidence; + + typedef typename Base::traversal_category base_trav_cat; + struct traversal_category + : public bidirectional_graph_tag, public base_trav_cat { }; + + typedef Vertex vertex_descriptor; + typedef typename Incidence::degree_size_type degree_size_type; + typedef typename Incidence::edge_descriptor edge_descriptor; + typedef typename Incidence::out_edge_iterator out_edge_iterator; + typedef input_iterator_archetype in_edge_iterator; + + typedef bidirectional_tag directed_category; + typedef ParallelCategory edge_parallel_category; + + static vertex_descriptor null_vertex() {return vertex_descriptor();} + }; + template + V source(const typename bidirectional_graph_archetype::edge_descriptor&, + const bidirectional_graph_archetype& ) + { + return V(static_object::get()); + } + template + V target(const typename bidirectional_graph_archetype::edge_descriptor&, + const bidirectional_graph_archetype& ) + { + return V(static_object::get()); + } + + template + std::pair::out_edge_iterator, + typename bidirectional_graph_archetype::out_edge_iterator> + out_edges(const V&, const bidirectional_graph_archetype& ) + { + typedef typename bidirectional_graph_archetype::out_edge_iterator Iter; + return std::make_pair(Iter(), Iter()); + } + + template + typename bidirectional_graph_archetype::degree_size_type + out_degree(const V&, const bidirectional_graph_archetype& ) + { + return 0; + } + + template + std::pair::in_edge_iterator, + typename bidirectional_graph_archetype::in_edge_iterator> + in_edges(const V&, const bidirectional_graph_archetype& ) + { + typedef typename bidirectional_graph_archetype::in_edge_iterator Iter; + return std::make_pair(Iter(), Iter()); + } + + template + typename bidirectional_graph_archetype::degree_size_type + in_degree(const V&, const bidirectional_graph_archetype& ) + { + return 0; + } + + template + typename bidirectional_graph_archetype::degree_size_type + degree(const V&, const bidirectional_graph_archetype& ) + { + return 0; + } + + //=========================================================================== struct property_graph_archetype_tag { }; template diff --git a/libs/graph/test/graph_concepts.cpp b/libs/graph/test/graph_concepts.cpp index c2edc34..c728732 100644 --- a/libs/graph/test/graph_concepts.cpp +++ b/libs/graph/test/graph_concepts.cpp @@ -37,5 +37,21 @@ int main(int,char*[]) Graph4; BOOST_CONCEPT_ASSERT(( PropertyGraphConcept )); + typedef edge_list_graph_archetype Graph5; + BOOST_CONCEPT_ASSERT(( EdgeListGraphConcept )); + + typedef vertex_and_edge_list_graph_archetype Graph6; + BOOST_CONCEPT_ASSERT(( VertexAndEdgeListGraphConcept )); + + typedef adjacency_matrix_archetype Graph7; + BOOST_CONCEPT_ASSERT(( AdjacencyMatrixConcept )); + + typedef bidirectional_graph_archetype Graph8; + BOOST_CONCEPT_ASSERT(( BidirectionalGraphConcept )); + return 0; }