Ticket #8307: add_archetypes.patch

File add_archetypes.patch, 11.4 KB (added by redboltz@…, 10 years ago)
  • boost/graph/graph_archetypes.hpp

     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 b namespace boost { // should use a different namespace for this  
    187187  }
    188188
    189189  //===========================================================================
     190  template <typename Vertex, typename Directed, typename ParallelCategory,
     191    typename Base = detail::null_graph_archetype >
     192  struct edge_list_graph_archetype : public Base
     193  {
     194    typedef typename Base::traversal_category base_trav_cat;
     195    struct traversal_category
     196      : public edge_list_graph_tag, public base_trav_cat { };
     197
     198    typedef Vertex vertex_descriptor;
     199    typedef unsigned int edges_size_type;
     200    typedef Directed directed_category;
     201    typedef ParallelCategory edge_parallel_category;
     202
     203    struct edge_descriptor {
     204      edge_descriptor() { }
     205      edge_descriptor(const detail::dummy_constructor&) { }
     206      bool operator==(const edge_descriptor&) const { return false; }
     207      bool operator!=(const edge_descriptor&) const { return false; }
     208    };
     209    typedef input_iterator_archetype<edge_descriptor> edge_iterator;
     210
     211    static vertex_descriptor null_vertex() {return vertex_descriptor();}
     212  };
     213 
     214  template <typename V, typename D, typename P, typename B>
     215  std::pair<typename edge_list_graph_archetype<V,D,P,B>::edge_iterator,
     216            typename edge_list_graph_archetype<V,D,P,B>::edge_iterator>
     217  edges(const edge_list_graph_archetype<V,D,P,B>& )
     218  {
     219    typedef typename edge_list_graph_archetype<V,D,P,B>::edge_iterator Iter;
     220    return std::make_pair(Iter(), Iter());
     221  }
     222
     223  template <typename V, typename D, typename P, typename B>
     224  typename edge_list_graph_archetype<V,D,P,B>::edges_size_type
     225  num_edges(const edge_list_graph_archetype<V,D,P,B>& )
     226  {
     227    return 0;
     228  }
     229
     230  template <typename V, typename D, typename P, typename B>
     231  V source(const typename edge_list_graph_archetype<V,D,P,B>::edge_descriptor&,
     232           const edge_list_graph_archetype<V,D,P,B>& )
     233  {
     234    return V(static_object<detail::dummy_constructor>::get());
     235  }
     236
     237  template <typename V, typename D, typename P, typename B>
     238  V target(const typename edge_list_graph_archetype<V,D,P,B>::edge_descriptor&,
     239           const edge_list_graph_archetype<V,D,P,B>& )
     240  {
     241    return V(static_object<detail::dummy_constructor>::get());
     242  }
     243
     244  //===========================================================================
     245  template <typename Vertex, typename Directed, typename ParallelCategory,
     246    typename Base = detail::null_graph_archetype >
     247  struct vertex_and_edge_list_graph_archetype : public Base
     248  {
     249    typedef typename Base::traversal_category base_trav_cat;
     250    struct traversal_category
     251      : public vertex_list_graph_tag,
     252        public edge_list_graph_tag,
     253        public base_trav_cat { };
     254
     255    typedef vertex_list_graph_archetype<Vertex, Directed, ParallelCategory>
     256      VertexList;
     257    typedef edge_list_graph_archetype<Vertex, Directed, ParallelCategory>
     258      EdgeList;
     259
     260    typedef Directed directed_category;
     261    typedef ParallelCategory edge_parallel_category;
     262
     263    typedef Vertex vertex_descriptor;
     264
     265    typedef typename VertexList::out_edge_iterator out_edge_iterator;
     266    typedef typename VertexList::adjacency_iterator adjacency_iterator;
     267
     268    typedef typename VertexList::vertices_size_type vertices_size_type;
     269    typedef typename VertexList::vertex_iterator vertex_iterator;
     270
     271    typedef typename EdgeList::edge_descriptor edge_descriptor;
     272    typedef typename EdgeList::edge_iterator edge_iterator;
     273    typedef typename EdgeList::edges_size_type edges_size_type;
     274
     275    static vertex_descriptor null_vertex() {return vertex_descriptor();}
     276  };
     277
     278  template <typename V, typename D, typename P, typename B>
     279  std::pair<typename vertex_and_edge_list_graph_archetype<V,D,P,B>::vertex_iterator,
     280            typename vertex_and_edge_list_graph_archetype<V,D,P,B>::vertex_iterator>
     281  vertices(const vertex_and_edge_list_graph_archetype<V,D,P,B>& )
     282  {
     283    typedef typename vertex_and_edge_list_graph_archetype<V,D,P,B>::vertex_iterator Iter;
     284    return std::make_pair(Iter(), Iter());
     285  }
     286
     287  template <typename V, typename D, typename P, typename B>
     288  typename vertex_and_edge_list_graph_archetype<V,D,P,B>::vertices_size_type
     289  num_vertices(const vertex_and_edge_list_graph_archetype<V,D,P,B>& )
     290  {
     291    return 0;
     292  }
     293
     294  template <typename V, typename D, typename P, typename B>
     295  typename vertex_and_edge_list_graph_archetype<V,D,P,B>::degree_size_type
     296  out_degree(const V&, const vertex_and_edge_list_graph_archetype<V,D,P,B>& )
     297  {
     298    return 0;
     299  }
     300
     301  template <typename V, typename D, typename P, typename B>
     302  std::pair<typename vertex_and_edge_list_graph_archetype<V,D,P,B>::edge_iterator,
     303            typename vertex_and_edge_list_graph_archetype<V,D,P,B>::edge_iterator>
     304  edges(const vertex_and_edge_list_graph_archetype<V,D,P,B>& )
     305  {
     306    typedef typename vertex_and_edge_list_graph_archetype<V,D,P,B>::edge_iterator Iter;
     307    return std::make_pair(Iter(), Iter());
     308  }
     309
     310  template <typename V, typename D, typename P, typename B>
     311  typename vertex_and_edge_list_graph_archetype<V,D,P,B>::edges_size_type
     312  num_edges(const vertex_and_edge_list_graph_archetype<V,D,P,B>& )
     313  {
     314    return 0;
     315  }
    190316
     317  template <typename V, typename D, typename P, typename B>
     318  V source(const typename vertex_and_edge_list_graph_archetype<V,D,P,B>::edge_descriptor&,
     319           const vertex_and_edge_list_graph_archetype<V,D,P,B>& )
     320  {
     321    return V(static_object<detail::dummy_constructor>::get());
     322  }
     323
     324  template <typename V, typename D, typename P, typename B>
     325  V target(const typename vertex_and_edge_list_graph_archetype<V,D,P,B>::edge_descriptor&,
     326           const vertex_and_edge_list_graph_archetype<V,D,P,B>& )
     327  {
     328    return V(static_object<detail::dummy_constructor>::get());
     329  }
     330
     331  //===========================================================================
     332  template <typename Vertex, typename Directed, typename ParallelCategory,
     333    typename Base = detail::null_graph_archetype >
     334  struct adjacency_matrix_archetype : public Base
     335  {
     336    typedef typename Base::traversal_category base_trav_cat;
     337    struct traversal_category
     338      : public adjacency_matrix_tag, public base_trav_cat { };
     339    typedef Vertex vertex_descriptor;
     340    struct edge_descriptor {
     341      edge_descriptor() { }
     342      edge_descriptor(const detail::dummy_constructor&) { }
     343      bool operator==(const edge_descriptor&) const { return false; }
     344      bool operator!=(const edge_descriptor&) const { return false; }
     345    };
     346
     347    typedef Directed directed_category;
     348    typedef ParallelCategory edge_parallel_category;
     349
     350    static vertex_descriptor null_vertex() {return vertex_descriptor();}
     351  };
     352 
     353  template <typename V, typename D, typename P, typename B>
     354  std::pair<typename adjacency_matrix_archetype<V,D,P,B>::edge_descriptor,
     355            bool>
     356  edge(const V&, const V&, const adjacency_matrix_archetype<V,D,P,B>& )
     357  {
     358    typedef typename adjacency_matrix_archetype<V,D,P,B>::edge_descriptor Descriptor;
     359    return std::make_pair(Descriptor(), bool());
     360  }
     361
     362  //===========================================================================
     363  template <typename Vertex, typename ParallelCategory,
     364    typename Base = detail::null_graph_archetype >
     365  struct bidirectional_graph_archetype : public Base
     366  {
     367    typedef incidence_graph_archetype<Vertex, bidirectional_tag, ParallelCategory>
     368      Incidence;
     369
     370    typedef typename Base::traversal_category base_trav_cat;
     371    struct traversal_category
     372      : public bidirectional_graph_tag, public base_trav_cat { };
     373
     374    typedef Vertex vertex_descriptor;
     375    typedef typename Incidence::degree_size_type degree_size_type;
     376    typedef typename Incidence::edge_descriptor edge_descriptor;
     377    typedef typename Incidence::out_edge_iterator out_edge_iterator;
     378    typedef input_iterator_archetype<edge_descriptor> in_edge_iterator;
     379
     380    typedef bidirectional_tag directed_category;
     381    typedef ParallelCategory edge_parallel_category;
     382
     383    static vertex_descriptor null_vertex() {return vertex_descriptor();}
     384  };
     385  template <typename V, typename P, typename B>
     386  V source(const typename bidirectional_graph_archetype<V,P,B>::edge_descriptor&,
     387           const bidirectional_graph_archetype<V,P,B>& )
     388  {
     389    return V(static_object<detail::dummy_constructor>::get());
     390  }
     391  template <typename V, typename P, typename B>
     392  V target(const typename bidirectional_graph_archetype<V,P,B>::edge_descriptor&,
     393           const bidirectional_graph_archetype<V,P,B>& )
     394  {
     395    return V(static_object<detail::dummy_constructor>::get());
     396  }
     397 
     398  template <typename V, typename P, typename B>
     399  std::pair<typename bidirectional_graph_archetype<V,P,B>::out_edge_iterator,
     400            typename bidirectional_graph_archetype<V,P,B>::out_edge_iterator>
     401  out_edges(const V&, const bidirectional_graph_archetype<V,P,B>& )
     402  {
     403    typedef typename bidirectional_graph_archetype<V,P,B>::out_edge_iterator Iter;
     404    return std::make_pair(Iter(), Iter());
     405  }
     406 
     407  template <typename V, typename P, typename B>
     408  typename bidirectional_graph_archetype<V,P,B>::degree_size_type
     409  out_degree(const V&, const bidirectional_graph_archetype<V,P,B>& )
     410  {
     411    return 0;
     412  }
     413
     414  template <typename V, typename P, typename B>
     415  std::pair<typename bidirectional_graph_archetype<V,P,B>::in_edge_iterator,
     416            typename bidirectional_graph_archetype<V,P,B>::in_edge_iterator>
     417  in_edges(const V&, const bidirectional_graph_archetype<V,P,B>& )
     418  {
     419    typedef typename bidirectional_graph_archetype<V,P,B>::in_edge_iterator Iter;
     420    return std::make_pair(Iter(), Iter());
     421  }
     422 
     423  template <typename V, typename P, typename B>
     424  typename bidirectional_graph_archetype<V,P,B>::degree_size_type
     425  in_degree(const V&, const bidirectional_graph_archetype<V,P,B>& )
     426  {
     427    return 0;
     428  }
     429
     430  template <typename V, typename P, typename B>
     431  typename bidirectional_graph_archetype<V,P,B>::degree_size_type
     432  degree(const V&, const bidirectional_graph_archetype<V,P,B>& )
     433  {
     434    return 0;
     435  }
     436
     437  //===========================================================================
    191438  struct property_graph_archetype_tag { };
    192439
    193440  template <typename GraphArchetype, typename Property, typename ValueArch>
  • libs/graph/test/graph_concepts.cpp

    diff --git a/libs/graph/test/graph_concepts.cpp b/libs/graph/test/graph_concepts.cpp
    index c2edc34..c728732 100644
    a b int main(int,char*[])  
    3737    Graph4;
    3838  BOOST_CONCEPT_ASSERT(( PropertyGraphConcept<Graph4, Vertex, vertex_color_t> ));
    3939
     40  typedef edge_list_graph_archetype<Vertex, directed_tag,
     41    allow_parallel_edge_tag> Graph5;
     42  BOOST_CONCEPT_ASSERT(( EdgeListGraphConcept<Graph5> ));
     43
     44  typedef vertex_and_edge_list_graph_archetype<Vertex, directed_tag,
     45    allow_parallel_edge_tag> Graph6;
     46  BOOST_CONCEPT_ASSERT(( VertexAndEdgeListGraphConcept<Graph6> ));
     47
     48  typedef adjacency_matrix_archetype<Vertex, directed_tag,
     49    allow_parallel_edge_tag> Graph7;
     50  BOOST_CONCEPT_ASSERT(( AdjacencyMatrixConcept<Graph7> ));
     51
     52  typedef bidirectional_graph_archetype<Vertex,
     53    allow_parallel_edge_tag> Graph8;
     54  BOOST_CONCEPT_ASSERT(( BidirectionalGraphConcept<Graph8> ));
     55
    4056  return 0;
    4157}