1 //=======================================================================
2 // Copyright 2002 Indiana University.
3 // Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek
5 // Distributed under the Boost Software License, Version 1.0. (See
6 // accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt)
8 //=======================================================================
10 #ifndef BOOST_GRAPH_ARCHETYPES_HPP
11 #define BOOST_GRAPH_ARCHETYPES_HPP
13 #include <boost/property_map/property_map.hpp>
14 #include <boost/concept_archetype.hpp>
16 namespace boost
{ // should use a different namespace for this
19 struct null_graph_archetype
: public null_archetype
<> {
20 struct traversal_category
{ };
24 //===========================================================================
25 template <typename Vertex
, typename Directed
, typename ParallelCategory
,
26 typename Base
= detail::null_graph_archetype
>
27 struct incidence_graph_archetype
: public Base
29 typedef typename
Base::traversal_category base_trav_cat
;
30 struct traversal_category
31 : public incidence_graph_tag
, public base_trav_cat
{ };
33 typedef immutable_graph_tag mutability_category
;
35 typedef Vertex vertex_descriptor
;
36 typedef unsigned int degree_size_type
;
37 typedef unsigned int vertices_size_type
;
38 typedef unsigned int edges_size_type
;
39 struct edge_descriptor
{
41 edge_descriptor(const detail::dummy_constructor
&) { }
42 bool operator==(const edge_descriptor
&) const { return false; }
43 bool operator!=(const edge_descriptor
&) const { return false; }
45 typedef input_iterator_archetype
<edge_descriptor
> out_edge_iterator
;
47 typedef Directed directed_category
;
48 typedef ParallelCategory edge_parallel_category
;
50 typedef void adjacency_iterator
;
51 typedef void in_edge_iterator
;
52 typedef void vertex_iterator
;
53 typedef void edge_iterator
;
55 template <typename V
, typename D
, typename P
, typename B
>
56 V
source(const typename incidence_graph_archetype
<V
,D
,P
,B
>::edge_descriptor
&,
57 const incidence_graph_archetype
<V
,D
,P
,B
>& )
59 return V(static_object
<detail::dummy_constructor
>::get());
61 template <typename V
, typename D
, typename P
, typename B
>
62 V
target(const typename incidence_graph_archetype
<V
,D
,P
,B
>::edge_descriptor
&,
63 const incidence_graph_archetype
<V
,D
,P
,B
>& )
65 return V(static_object
<detail::dummy_constructor
>::get());
68 template <typename V
, typename D
, typename P
, typename B
>
69 std::pair
<typename incidence_graph_archetype
<V
,D
,P
,B
>::out_edge_iterator
,
70 typename incidence_graph_archetype
<V
,D
,P
,B
>::out_edge_iterator
>
71 out_edges(const V
&, const incidence_graph_archetype
<V
,D
,P
,B
>& )
73 typedef typename incidence_graph_archetype
<V
,D
,P
,B
>::out_edge_iterator Iter
;
74 return std::make_pair(Iter(), Iter());
77 template <typename V
, typename D
, typename P
, typename B
>
78 typename incidence_graph_archetype
<V
,D
,P
,B
>::degree_size_type
79 out_degree(const V
&, const incidence_graph_archetype
<V
,D
,P
,B
>& )
84 //===========================================================================
85 template <typename Vertex
, typename Directed
, typename ParallelCategory
,
86 typename Base
= detail::null_graph_archetype
>
87 struct adjacency_graph_archetype
: public Base
89 typedef typename
Base::traversal_category base_trav_cat
;
90 struct traversal_category
91 : public adjacency_graph_tag
, public base_trav_cat
{ };
92 typedef Vertex vertex_descriptor
;
93 typedef unsigned int degree_size_type
;
94 typedef unsigned int vertices_size_type
;
95 typedef unsigned int edges_size_type
;
96 typedef void edge_descriptor
;
97 typedef input_iterator_archetype
<Vertex
> adjacency_iterator
;
99 typedef Directed directed_category
;
100 typedef ParallelCategory edge_parallel_category
;
102 typedef void in_edge_iterator
;
103 typedef void out_edge_iterator
;
104 typedef void vertex_iterator
;
105 typedef void edge_iterator
;
108 template <typename V
, typename D
, typename P
, typename B
>
109 std::pair
<typename adjacency_graph_archetype
<V
,D
,P
,B
>::adjacency_iterator
,
110 typename adjacency_graph_archetype
<V
,D
,P
,B
>::adjacency_iterator
>
111 adjacent_vertices(const V
&, const adjacency_graph_archetype
<V
,D
,P
,B
>& )
113 typedef typename adjacency_graph_archetype
<V
,D
,P
,B
>::adjacency_iterator Iter
;
114 return std::make_pair(Iter(), Iter());
117 template <typename V
, typename D
, typename P
, typename B
>
118 typename adjacency_graph_archetype
<V
,D
,P
,B
>::degree_size_type
119 out_degree(const V
&, const adjacency_graph_archetype
<V
,D
,P
,B
>& )
124 //===========================================================================
125 template <typename Vertex
, typename Directed
, typename ParallelCategory
,
126 typename Base
= detail::null_graph_archetype
>
127 struct vertex_list_graph_archetype
: public Base
129 typedef incidence_graph_archetype
<Vertex
, Directed
, ParallelCategory
>
131 typedef adjacency_graph_archetype
<Vertex
, Directed
, ParallelCategory
>
134 typedef typename
Base::traversal_category base_trav_cat
;
135 struct traversal_category
136 : public vertex_list_graph_tag
, public base_trav_cat
{ };
138 typedef immutable_graph_tag mutability_category
;
140 typedef Vertex vertex_descriptor
;
141 typedef unsigned int degree_size_type
;
142 typedef typename
Incidence::edge_descriptor edge_descriptor
;
143 typedef typename
Incidence::out_edge_iterator out_edge_iterator
;
144 typedef typename
Adjacency::adjacency_iterator adjacency_iterator
;
146 typedef input_iterator_archetype
<Vertex
> vertex_iterator
;
147 typedef unsigned int vertices_size_type
;
148 typedef unsigned int edges_size_type
;
150 typedef Directed directed_category
;
151 typedef ParallelCategory edge_parallel_category
;
153 typedef void in_edge_iterator
;
154 typedef void edge_iterator
;
157 template <typename V
, typename D
, typename P
, typename B
>
158 std::pair
<typename vertex_list_graph_archetype
<V
,D
,P
,B
>::vertex_iterator
,
159 typename vertex_list_graph_archetype
<V
,D
,P
,B
>::vertex_iterator
>
160 vertices(const vertex_list_graph_archetype
<V
,D
,P
,B
>& )
162 typedef typename vertex_list_graph_archetype
<V
,D
,P
,B
>::vertex_iterator Iter
;
163 return std::make_pair(Iter(), Iter());
166 template <typename V
, typename D
, typename P
, typename B
>
167 typename vertex_list_graph_archetype
<V
,D
,P
,B
>::vertices_size_type
168 num_vertices(const vertex_list_graph_archetype
<V
,D
,P
,B
>& )
173 // ambiguously inherited from incidence graph and adjacency graph
174 template <typename V
, typename D
, typename P
, typename B
>
175 typename vertex_list_graph_archetype
<V
,D
,P
,B
>::degree_size_type
176 out_degree(const V
&, const vertex_list_graph_archetype
<V
,D
,P
,B
>& )
181 //===========================================================================
183 struct property_graph_archetype_tag
{ };
185 template <typename GraphArchetype
, typename Property
, typename ValueArch
>
186 struct property_graph_archetype
: public GraphArchetype
188 typedef property_graph_archetype_tag graph_tag
;
189 typedef ValueArch vertex_property_type
;
190 typedef ValueArch edge_property_type
;
193 struct choose_edge_property_map_archetype
{
194 template <typename Graph
, typename Property
, typename Tag
>
196 typedef mutable_lvalue_property_map_archetype
197 <typename
Graph::edge_descriptor
, Property
> type
;
198 typedef lvalue_property_map_archetype
199 <typename
Graph::edge_descriptor
, Property
> const_type
;
203 struct edge_property_selector
<property_graph_archetype_tag
> {
204 typedef choose_edge_property_map_archetype type
;
207 struct choose_vertex_property_map_archetype
{
208 template <typename Graph
, typename Property
, typename Tag
>
210 typedef mutable_lvalue_property_map_archetype
211 <typename
Graph::vertex_descriptor
, Property
> type
;
212 typedef lvalue_property_map_archetype
213 <typename
Graph::vertex_descriptor
, Property
> const_type
;
218 struct vertex_property_selector
<property_graph_archetype_tag
> {
219 typedef choose_vertex_property_map_archetype type
;
222 template <typename G
, typename P
, typename V
>
223 typename property_map
<property_graph_archetype
<G
, P
, V
>, P
>::type
224 get(P
, property_graph_archetype
<G
, P
, V
>&) {
225 typename property_map
<property_graph_archetype
<G
, P
, V
>, P
>::type pmap
;
229 template <typename G
, typename P
, typename V
>
230 typename property_map
<property_graph_archetype
<G
, P
, V
>, P
>::const_type
231 get(P
, const property_graph_archetype
<G
, P
, V
>&) {
232 typename property_map
<property_graph_archetype
<G
, P
, V
>, P
>::const_type pmap
;
236 template <typename G
, typename P
, typename K
, typename V
>
237 typename property_traits
<typename property_map
<property_graph_archetype
<G
, P
, V
>, P
>::const_type
>::value_type
238 get(P p
, const property_graph_archetype
<G
, P
, V
>& g
, K k
) {
239 return get( get(p
, g
), k
);
242 template <typename G
, typename P
, typename V
, typename Key
>
244 put(P p
, property_graph_archetype
<G
, P
, V
>& g
,
245 const Key
& key
, const V
& value
)
247 typedef typename
boost::property_map
<property_graph_archetype
<G
, P
, V
>, P
>::type Map
;
248 Map pmap
= get(p
, g
);
249 put(pmap
, key
, value
);
252 struct color_value_archetype
{
253 color_value_archetype() { }
254 color_value_archetype(detail::dummy_constructor
) { }
255 bool operator==(const color_value_archetype
& ) const { return true; }
256 bool operator!=(const color_value_archetype
& ) const { return true; }
259 struct color_traits
<color_value_archetype
> {
260 static color_value_archetype
white()
262 return color_value_archetype
263 (static_object
<detail::dummy_constructor
>::get());
265 static color_value_archetype
gray()
267 return color_value_archetype
268 (static_object
<detail::dummy_constructor
>::get());
270 static color_value_archetype
black()
272 return color_value_archetype
273 (static_object
<detail::dummy_constructor
>::get());
277 template <typename T
>
278 class buffer_archetype
{
280 void push(const T
&) {}
282 T
& top() { return static_object
<T
>::get(); }
283 const T
& top() const { return static_object
<T
>::get(); }
284 bool empty() const { return true; }
290 #endif // BOOST_GRAPH_ARCHETYPES_HPP