williamr@2
|
1 |
//=======================================================================
|
williamr@2
|
2 |
// Copyright 1997, 1998, 1999, 2000 University of Notre Dame.
|
williamr@2
|
3 |
// Copyright 2004 The Trustees of Indiana University.
|
williamr@2
|
4 |
// Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek, Douglas Gregor
|
williamr@2
|
5 |
//
|
williamr@2
|
6 |
// Distributed under the Boost Software License, Version 1.0. (See
|
williamr@2
|
7 |
// accompanying file LICENSE_1_0.txt or copy at
|
williamr@2
|
8 |
// http://www.boost.org/LICENSE_1_0.txt)
|
williamr@2
|
9 |
//=======================================================================
|
williamr@2
|
10 |
#ifndef BOOST_GRAPH_LEDA_HPP
|
williamr@2
|
11 |
#define BOOST_GRAPH_LEDA_HPP
|
williamr@2
|
12 |
|
williamr@2
|
13 |
#include <boost/config.hpp>
|
williamr@2
|
14 |
#include <boost/iterator/iterator_facade.hpp>
|
williamr@2
|
15 |
#include <boost/graph/graph_traits.hpp>
|
williamr@2
|
16 |
#include <boost/graph/properties.hpp>
|
williamr@2
|
17 |
|
williamr@2
|
18 |
#include <LEDA/graph.h>
|
williamr@2
|
19 |
#include <LEDA/node_array.h>
|
williamr@2
|
20 |
#include <LEDA/node_map.h>
|
williamr@2
|
21 |
|
williamr@2
|
22 |
// The functions and classes in this file allows the user to
|
williamr@2
|
23 |
// treat a LEDA GRAPH object as a boost graph "as is". No
|
williamr@2
|
24 |
// wrapper is needed for the GRAPH object.
|
williamr@2
|
25 |
|
williamr@2
|
26 |
// Remember to define LEDA_PREFIX so that LEDA types such as
|
williamr@2
|
27 |
// leda_edge show up as "leda_edge" and not just "edge".
|
williamr@2
|
28 |
|
williamr@2
|
29 |
// Warning: this implementation relies on partial specialization
|
williamr@2
|
30 |
// for the graph_traits class (so it won't compile with Visual C++)
|
williamr@2
|
31 |
|
williamr@2
|
32 |
// Warning: this implementation is in alpha and has not been tested
|
williamr@2
|
33 |
|
williamr@2
|
34 |
#if !defined BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
williamr@2
|
35 |
namespace boost {
|
williamr@2
|
36 |
|
williamr@2
|
37 |
struct leda_graph_traversal_category :
|
williamr@2
|
38 |
public virtual bidirectional_graph_tag,
|
williamr@2
|
39 |
public virtual adjacency_graph_tag,
|
williamr@2
|
40 |
public virtual vertex_list_graph_tag { };
|
williamr@2
|
41 |
|
williamr@2
|
42 |
template <class vtype, class etype>
|
williamr@2
|
43 |
struct graph_traits< leda::GRAPH<vtype,etype> > {
|
williamr@2
|
44 |
typedef leda_node vertex_descriptor;
|
williamr@2
|
45 |
typedef leda_edge edge_descriptor;
|
williamr@2
|
46 |
|
williamr@2
|
47 |
class adjacency_iterator
|
williamr@2
|
48 |
: public iterator_facade<adjacency_iterator,
|
williamr@2
|
49 |
leda_node,
|
williamr@2
|
50 |
bidirectional_traversal_tag,
|
williamr@2
|
51 |
leda_node,
|
williamr@2
|
52 |
const leda_node*>
|
williamr@2
|
53 |
{
|
williamr@2
|
54 |
public:
|
williamr@2
|
55 |
explicit adjacency_iterator(leda_edge edge = 0) : base(edge) {}
|
williamr@2
|
56 |
|
williamr@2
|
57 |
private:
|
williamr@2
|
58 |
leda_node dereference() const { return leda::target(base); }
|
williamr@2
|
59 |
|
williamr@2
|
60 |
bool equal(const adjacency_iterator& other) const
|
williamr@2
|
61 |
{ return base == other.base; }
|
williamr@2
|
62 |
|
williamr@2
|
63 |
void increment() { base = Succ_Adj_Edge(base, 0); }
|
williamr@2
|
64 |
void decrement() { base = Pred_Adj_Edge(base, 0); }
|
williamr@2
|
65 |
|
williamr@2
|
66 |
leda_edge base;
|
williamr@2
|
67 |
|
williamr@2
|
68 |
friend class iterator_core_access;
|
williamr@2
|
69 |
};
|
williamr@2
|
70 |
|
williamr@2
|
71 |
class out_edge_iterator
|
williamr@2
|
72 |
: public iterator_facade<out_edge_iterator,
|
williamr@2
|
73 |
leda_edge,
|
williamr@2
|
74 |
bidirectional_traversal_tag,
|
williamr@2
|
75 |
const leda_edge&,
|
williamr@2
|
76 |
const leda_edge*>
|
williamr@2
|
77 |
{
|
williamr@2
|
78 |
public:
|
williamr@2
|
79 |
explicit out_edge_iterator(leda_edge edge = 0) : base(edge) {}
|
williamr@2
|
80 |
|
williamr@2
|
81 |
private:
|
williamr@2
|
82 |
const leda_edge& dereference() const { return base; }
|
williamr@2
|
83 |
|
williamr@2
|
84 |
bool equal(const out_edge_iterator& other) const
|
williamr@2
|
85 |
{ return base == other.base; }
|
williamr@2
|
86 |
|
williamr@2
|
87 |
void increment() { base = Succ_Adj_Edge(base, 0); }
|
williamr@2
|
88 |
void decrement() { base = Pred_Adj_Edge(base, 0); }
|
williamr@2
|
89 |
|
williamr@2
|
90 |
leda_edge base;
|
williamr@2
|
91 |
|
williamr@2
|
92 |
friend class iterator_core_access;
|
williamr@2
|
93 |
};
|
williamr@2
|
94 |
|
williamr@2
|
95 |
class in_edge_iterator
|
williamr@2
|
96 |
: public iterator_facade<in_edge_iterator,
|
williamr@2
|
97 |
leda_edge,
|
williamr@2
|
98 |
bidirectional_traversal_tag,
|
williamr@2
|
99 |
const leda_edge&,
|
williamr@2
|
100 |
const leda_edge*>
|
williamr@2
|
101 |
{
|
williamr@2
|
102 |
public:
|
williamr@2
|
103 |
explicit in_edge_iterator(leda_edge edge = 0) : base(edge) {}
|
williamr@2
|
104 |
|
williamr@2
|
105 |
private:
|
williamr@2
|
106 |
const leda_edge& dereference() const { return base; }
|
williamr@2
|
107 |
|
williamr@2
|
108 |
bool equal(const in_edge_iterator& other) const
|
williamr@2
|
109 |
{ return base == other.base; }
|
williamr@2
|
110 |
|
williamr@2
|
111 |
void increment() { base = Succ_Adj_Edge(base, 1); }
|
williamr@2
|
112 |
void decrement() { base = Pred_Adj_Edge(base, 1); }
|
williamr@2
|
113 |
|
williamr@2
|
114 |
leda_edge base;
|
williamr@2
|
115 |
|
williamr@2
|
116 |
friend class iterator_core_access;
|
williamr@2
|
117 |
};
|
williamr@2
|
118 |
|
williamr@2
|
119 |
class vertex_iterator
|
williamr@2
|
120 |
: public iterator_facade<vertex_iterator,
|
williamr@2
|
121 |
leda_node,
|
williamr@2
|
122 |
bidirectional_traversal_tag,
|
williamr@2
|
123 |
const leda_node&,
|
williamr@2
|
124 |
const leda_node*>
|
williamr@2
|
125 |
{
|
williamr@2
|
126 |
public:
|
williamr@2
|
127 |
vertex_iterator(leda_node node = 0,
|
williamr@2
|
128 |
const leda::GRAPH<vtype, etype>* g = 0)
|
williamr@2
|
129 |
: base(node), g(g) {}
|
williamr@2
|
130 |
|
williamr@2
|
131 |
private:
|
williamr@2
|
132 |
const leda_node& dereference() const { return base; }
|
williamr@2
|
133 |
|
williamr@2
|
134 |
bool equal(const vertex_iterator& other) const
|
williamr@2
|
135 |
{ return base == other.base; }
|
williamr@2
|
136 |
|
williamr@2
|
137 |
void increment() { base = g->succ_node(base); }
|
williamr@2
|
138 |
void decrement() { base = g->pred_node(base); }
|
williamr@2
|
139 |
|
williamr@2
|
140 |
leda_node base;
|
williamr@2
|
141 |
const leda::GRAPH<vtype, etype>* g;
|
williamr@2
|
142 |
|
williamr@2
|
143 |
friend class iterator_core_access;
|
williamr@2
|
144 |
};
|
williamr@2
|
145 |
|
williamr@2
|
146 |
typedef directed_tag directed_category;
|
williamr@2
|
147 |
typedef allow_parallel_edge_tag edge_parallel_category; // not sure here
|
williamr@2
|
148 |
typedef leda_graph_traversal_category traversal_category;
|
williamr@2
|
149 |
typedef int vertices_size_type;
|
williamr@2
|
150 |
typedef int edges_size_type;
|
williamr@2
|
151 |
typedef int degree_size_type;
|
williamr@2
|
152 |
};
|
williamr@2
|
153 |
|
williamr@2
|
154 |
template <class vtype, class etype>
|
williamr@2
|
155 |
struct vertex_property< leda::GRAPH<vtype,etype> > {
|
williamr@2
|
156 |
typedef vtype type;
|
williamr@2
|
157 |
};
|
williamr@2
|
158 |
|
williamr@2
|
159 |
template <class vtype, class etype>
|
williamr@2
|
160 |
struct edge_property< leda::GRAPH<vtype,etype> > {
|
williamr@2
|
161 |
typedef etype type;
|
williamr@2
|
162 |
};
|
williamr@2
|
163 |
|
williamr@2
|
164 |
} // namespace boost
|
williamr@2
|
165 |
#endif
|
williamr@2
|
166 |
|
williamr@2
|
167 |
namespace boost {
|
williamr@2
|
168 |
|
williamr@2
|
169 |
template <class vtype, class etype>
|
williamr@2
|
170 |
typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor
|
williamr@2
|
171 |
source(typename graph_traits< leda::GRAPH<vtype,etype> >::edge_descriptor e,
|
williamr@2
|
172 |
const leda::GRAPH<vtype,etype>& g)
|
williamr@2
|
173 |
{
|
williamr@2
|
174 |
return source(e);
|
williamr@2
|
175 |
}
|
williamr@2
|
176 |
|
williamr@2
|
177 |
template <class vtype, class etype>
|
williamr@2
|
178 |
typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor
|
williamr@2
|
179 |
target(typename graph_traits< leda::GRAPH<vtype,etype> >::edge_descriptor e,
|
williamr@2
|
180 |
const leda::GRAPH<vtype,etype>& g)
|
williamr@2
|
181 |
{
|
williamr@2
|
182 |
return target(e);
|
williamr@2
|
183 |
}
|
williamr@2
|
184 |
|
williamr@2
|
185 |
template <class vtype, class etype>
|
williamr@2
|
186 |
inline std::pair<
|
williamr@2
|
187 |
typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_iterator,
|
williamr@2
|
188 |
typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_iterator >
|
williamr@2
|
189 |
vertices(const leda::GRAPH<vtype,etype>& g)
|
williamr@2
|
190 |
{
|
williamr@2
|
191 |
typedef typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_iterator
|
williamr@2
|
192 |
Iter;
|
williamr@2
|
193 |
return std::make_pair( Iter(g.first_node(),&g), Iter(0,&g) );
|
williamr@2
|
194 |
}
|
williamr@2
|
195 |
|
williamr@2
|
196 |
// no edges(g) function
|
williamr@2
|
197 |
|
williamr@2
|
198 |
template <class vtype, class etype>
|
williamr@2
|
199 |
inline std::pair<
|
williamr@2
|
200 |
typename graph_traits< leda::GRAPH<vtype,etype> >::out_edge_iterator,
|
williamr@2
|
201 |
typename graph_traits< leda::GRAPH<vtype,etype> >::out_edge_iterator >
|
williamr@2
|
202 |
out_edges(
|
williamr@2
|
203 |
typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor u,
|
williamr@2
|
204 |
const leda::GRAPH<vtype,etype>& g)
|
williamr@2
|
205 |
{
|
williamr@2
|
206 |
typedef typename graph_traits< leda::GRAPH<vtype,etype> >
|
williamr@2
|
207 |
::out_edge_iterator Iter;
|
williamr@2
|
208 |
return std::make_pair( Iter(First_Adj_Edge(u,0)), Iter(0) );
|
williamr@2
|
209 |
}
|
williamr@2
|
210 |
|
williamr@2
|
211 |
template <class vtype, class etype>
|
williamr@2
|
212 |
inline std::pair<
|
williamr@2
|
213 |
typename graph_traits< leda::GRAPH<vtype,etype> >::in_edge_iterator,
|
williamr@2
|
214 |
typename graph_traits< leda::GRAPH<vtype,etype> >::in_edge_iterator >
|
williamr@2
|
215 |
in_edges(
|
williamr@2
|
216 |
typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor u,
|
williamr@2
|
217 |
const leda::GRAPH<vtype,etype>& g)
|
williamr@2
|
218 |
{
|
williamr@2
|
219 |
typedef typename graph_traits< leda::GRAPH<vtype,etype> >
|
williamr@2
|
220 |
::in_edge_iterator Iter;
|
williamr@2
|
221 |
return std::make_pair( Iter(First_Adj_Edge(u,1)), Iter(0) );
|
williamr@2
|
222 |
}
|
williamr@2
|
223 |
|
williamr@2
|
224 |
template <class vtype, class etype>
|
williamr@2
|
225 |
inline std::pair<
|
williamr@2
|
226 |
typename graph_traits< leda::GRAPH<vtype,etype> >::adjacency_iterator,
|
williamr@2
|
227 |
typename graph_traits< leda::GRAPH<vtype,etype> >::adjacency_iterator >
|
williamr@2
|
228 |
adjacent_vertices(
|
williamr@2
|
229 |
typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor u,
|
williamr@2
|
230 |
const leda::GRAPH<vtype,etype>& g)
|
williamr@2
|
231 |
{
|
williamr@2
|
232 |
typedef typename graph_traits< leda::GRAPH<vtype,etype> >
|
williamr@2
|
233 |
::adjacency_iterator Iter;
|
williamr@2
|
234 |
return std::make_pair( Iter(First_Adj_Edge(u,0)), Iter(0) );
|
williamr@2
|
235 |
}
|
williamr@2
|
236 |
|
williamr@2
|
237 |
template <class vtype, class etype>
|
williamr@2
|
238 |
typename graph_traits< leda::GRAPH<vtype,etype> >::vertices_size_type
|
williamr@2
|
239 |
num_vertices(const leda::GRAPH<vtype,etype>& g)
|
williamr@2
|
240 |
{
|
williamr@2
|
241 |
return g.number_of_nodes();
|
williamr@2
|
242 |
}
|
williamr@2
|
243 |
|
williamr@2
|
244 |
template <class vtype, class etype>
|
williamr@2
|
245 |
typename graph_traits< leda::GRAPH<vtype,etype> >::edges_size_type
|
williamr@2
|
246 |
num_edges(const leda::GRAPH<vtype,etype>& g)
|
williamr@2
|
247 |
{
|
williamr@2
|
248 |
return g.number_of_edges();
|
williamr@2
|
249 |
}
|
williamr@2
|
250 |
|
williamr@2
|
251 |
template <class vtype, class etype>
|
williamr@2
|
252 |
typename graph_traits< leda::GRAPH<vtype,etype> >::degree_size_type
|
williamr@2
|
253 |
out_degree(
|
williamr@2
|
254 |
typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor u,
|
williamr@2
|
255 |
const leda::GRAPH<vtype,etype>&)
|
williamr@2
|
256 |
{
|
williamr@2
|
257 |
return outdeg(u);
|
williamr@2
|
258 |
}
|
williamr@2
|
259 |
|
williamr@2
|
260 |
template <class vtype, class etype>
|
williamr@2
|
261 |
typename graph_traits< leda::GRAPH<vtype,etype> >::degree_size_type
|
williamr@2
|
262 |
in_degree(
|
williamr@2
|
263 |
typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor u,
|
williamr@2
|
264 |
const leda::GRAPH<vtype,etype>&)
|
williamr@2
|
265 |
{
|
williamr@2
|
266 |
return indeg(u);
|
williamr@2
|
267 |
}
|
williamr@2
|
268 |
|
williamr@2
|
269 |
template <class vtype, class etype>
|
williamr@2
|
270 |
typename graph_traits< leda::GRAPH<vtype,etype> >::degree_size_type
|
williamr@2
|
271 |
degree(
|
williamr@2
|
272 |
typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor u,
|
williamr@2
|
273 |
const leda::GRAPH<vtype,etype>&)
|
williamr@2
|
274 |
{
|
williamr@2
|
275 |
return outdeg(u) + indeg(u);
|
williamr@2
|
276 |
}
|
williamr@2
|
277 |
|
williamr@2
|
278 |
template <class vtype, class etype>
|
williamr@2
|
279 |
typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor
|
williamr@2
|
280 |
add_vertex(leda::GRAPH<vtype,etype>& g)
|
williamr@2
|
281 |
{
|
williamr@2
|
282 |
return g.new_node();
|
williamr@2
|
283 |
}
|
williamr@2
|
284 |
|
williamr@2
|
285 |
template <class vtype, class etype>
|
williamr@2
|
286 |
typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor
|
williamr@2
|
287 |
add_vertex(const vtype& vp, leda::GRAPH<vtype,etype>& g)
|
williamr@2
|
288 |
{
|
williamr@2
|
289 |
return g.new_node(vp);
|
williamr@2
|
290 |
}
|
williamr@2
|
291 |
|
williamr@2
|
292 |
// Hmm, LEDA doesn't have the equivalent of clear_vertex() -JGS
|
williamr@2
|
293 |
// need to write an implementation
|
williamr@2
|
294 |
template <class vtype, class etype>
|
williamr@2
|
295 |
void clear_vertex(
|
williamr@2
|
296 |
typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor u,
|
williamr@2
|
297 |
leda::GRAPH<vtype,etype>& g)
|
williamr@2
|
298 |
{
|
williamr@2
|
299 |
g.del_node(u);
|
williamr@2
|
300 |
}
|
williamr@2
|
301 |
|
williamr@2
|
302 |
template <class vtype, class etype>
|
williamr@2
|
303 |
void remove_vertex(
|
williamr@2
|
304 |
typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor u,
|
williamr@2
|
305 |
leda::GRAPH<vtype,etype>& g)
|
williamr@2
|
306 |
{
|
williamr@2
|
307 |
g.del_node(u);
|
williamr@2
|
308 |
}
|
williamr@2
|
309 |
|
williamr@2
|
310 |
template <class vtype, class etype>
|
williamr@2
|
311 |
std::pair<
|
williamr@2
|
312 |
typename graph_traits< leda::GRAPH<vtype,etype> >::edge_descriptor,
|
williamr@2
|
313 |
bool>
|
williamr@2
|
314 |
add_edge(
|
williamr@2
|
315 |
typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor u,
|
williamr@2
|
316 |
typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor v,
|
williamr@2
|
317 |
leda::GRAPH<vtype,etype>& g)
|
williamr@2
|
318 |
{
|
williamr@2
|
319 |
return std::make_pair(g.new_edge(u, v), true);
|
williamr@2
|
320 |
}
|
williamr@2
|
321 |
|
williamr@2
|
322 |
template <class vtype, class etype>
|
williamr@2
|
323 |
std::pair<
|
williamr@2
|
324 |
typename graph_traits< leda::GRAPH<vtype,etype> >::edge_descriptor,
|
williamr@2
|
325 |
bool>
|
williamr@2
|
326 |
add_edge(
|
williamr@2
|
327 |
typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor u,
|
williamr@2
|
328 |
typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor v,
|
williamr@2
|
329 |
const etype& et,
|
williamr@2
|
330 |
leda::GRAPH<vtype,etype>& g)
|
williamr@2
|
331 |
{
|
williamr@2
|
332 |
return std::make_pair(g.new_edge(u, v, et), true);
|
williamr@2
|
333 |
}
|
williamr@2
|
334 |
|
williamr@2
|
335 |
template <class vtype, class etype>
|
williamr@2
|
336 |
void
|
williamr@2
|
337 |
remove_edge(
|
williamr@2
|
338 |
typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor u,
|
williamr@2
|
339 |
typename graph_traits< leda::GRAPH<vtype,etype> >::vertex_descriptor v,
|
williamr@2
|
340 |
leda::GRAPH<vtype,etype>& g)
|
williamr@2
|
341 |
{
|
williamr@2
|
342 |
typename graph_traits< leda::GRAPH<vtype,etype> >::out_edge_iterator
|
williamr@2
|
343 |
i,iend;
|
williamr@2
|
344 |
for (boost::tie(i,iend) = out_edges(u,g); i != iend; ++i)
|
williamr@2
|
345 |
if (target(*i,g) == v)
|
williamr@2
|
346 |
g.del_edge(*i);
|
williamr@2
|
347 |
}
|
williamr@2
|
348 |
|
williamr@2
|
349 |
template <class vtype, class etype>
|
williamr@2
|
350 |
void
|
williamr@2
|
351 |
remove_edge(
|
williamr@2
|
352 |
typename graph_traits< leda::GRAPH<vtype,etype> >::edge_descriptor e,
|
williamr@2
|
353 |
leda::GRAPH<vtype,etype>& g)
|
williamr@2
|
354 |
{
|
williamr@2
|
355 |
g.del_edge(e);
|
williamr@2
|
356 |
}
|
williamr@2
|
357 |
|
williamr@2
|
358 |
//===========================================================================
|
williamr@2
|
359 |
// property maps
|
williamr@2
|
360 |
|
williamr@2
|
361 |
class leda_graph_id_map
|
williamr@2
|
362 |
: public put_get_helper<int, leda_graph_id_map>
|
williamr@2
|
363 |
{
|
williamr@2
|
364 |
public:
|
williamr@2
|
365 |
typedef readable_property_map_tag category;
|
williamr@2
|
366 |
typedef int value_type;
|
williamr@2
|
367 |
typedef int reference;
|
williamr@2
|
368 |
typedef leda_node key_type;
|
williamr@2
|
369 |
leda_graph_id_map() { }
|
williamr@2
|
370 |
template <class T>
|
williamr@2
|
371 |
long operator[](T x) const { return x->id(); }
|
williamr@2
|
372 |
};
|
williamr@2
|
373 |
template <class vtype, class etype>
|
williamr@2
|
374 |
inline leda_graph_id_map
|
williamr@2
|
375 |
get(vertex_index_t, const leda::GRAPH<vtype, etype>& g) {
|
williamr@2
|
376 |
return leda_graph_id_map();
|
williamr@2
|
377 |
}
|
williamr@2
|
378 |
template <class vtype, class etype>
|
williamr@2
|
379 |
inline leda_graph_id_map
|
williamr@2
|
380 |
get(edge_index_t, const leda::GRAPH<vtype, etype>& g) {
|
williamr@2
|
381 |
return leda_graph_id_map();
|
williamr@2
|
382 |
}
|
williamr@2
|
383 |
|
williamr@2
|
384 |
template <class Tag>
|
williamr@2
|
385 |
struct leda_property_map { };
|
williamr@2
|
386 |
|
williamr@2
|
387 |
template <>
|
williamr@2
|
388 |
struct leda_property_map<vertex_index_t> {
|
williamr@2
|
389 |
template <class vtype, class etype>
|
williamr@2
|
390 |
struct bind_ {
|
williamr@2
|
391 |
typedef leda_graph_id_map type;
|
williamr@2
|
392 |
typedef leda_graph_id_map const_type;
|
williamr@2
|
393 |
};
|
williamr@2
|
394 |
};
|
williamr@2
|
395 |
template <>
|
williamr@2
|
396 |
struct leda_property_map<edge_index_t> {
|
williamr@2
|
397 |
template <class vtype, class etype>
|
williamr@2
|
398 |
struct bind_ {
|
williamr@2
|
399 |
typedef leda_graph_id_map type;
|
williamr@2
|
400 |
typedef leda_graph_id_map const_type;
|
williamr@2
|
401 |
};
|
williamr@2
|
402 |
};
|
williamr@2
|
403 |
|
williamr@2
|
404 |
|
williamr@2
|
405 |
template <class Data, class DataRef, class GraphPtr>
|
williamr@2
|
406 |
class leda_graph_data_map
|
williamr@2
|
407 |
: public put_get_helper<DataRef,
|
williamr@2
|
408 |
leda_graph_data_map<Data,DataRef,GraphPtr> >
|
williamr@2
|
409 |
{
|
williamr@2
|
410 |
public:
|
williamr@2
|
411 |
typedef Data value_type;
|
williamr@2
|
412 |
typedef DataRef reference;
|
williamr@2
|
413 |
typedef void key_type;
|
williamr@2
|
414 |
typedef lvalue_property_map_tag category;
|
williamr@2
|
415 |
leda_graph_data_map(GraphPtr g) : m_g(g) { }
|
williamr@2
|
416 |
template <class NodeOrEdge>
|
williamr@2
|
417 |
DataRef operator[](NodeOrEdge x) const { return (*m_g)[x]; }
|
williamr@2
|
418 |
protected:
|
williamr@2
|
419 |
GraphPtr m_g;
|
williamr@2
|
420 |
};
|
williamr@2
|
421 |
|
williamr@2
|
422 |
template <>
|
williamr@2
|
423 |
struct leda_property_map<vertex_all_t> {
|
williamr@2
|
424 |
template <class vtype, class etype>
|
williamr@2
|
425 |
struct bind_ {
|
williamr@2
|
426 |
typedef leda_graph_data_map<vtype, vtype&, leda::GRAPH<vtype, etype>*> type;
|
williamr@2
|
427 |
typedef leda_graph_data_map<vtype, const vtype&,
|
williamr@2
|
428 |
const leda::GRAPH<vtype, etype>*> const_type;
|
williamr@2
|
429 |
};
|
williamr@2
|
430 |
};
|
williamr@2
|
431 |
template <class vtype, class etype >
|
williamr@2
|
432 |
inline typename property_map< leda::GRAPH<vtype, etype>, vertex_all_t>::type
|
williamr@2
|
433 |
get(vertex_all_t, leda::GRAPH<vtype, etype>& g) {
|
williamr@2
|
434 |
typedef typename property_map< leda::GRAPH<vtype, etype>, vertex_all_t>::type
|
williamr@2
|
435 |
pmap_type;
|
williamr@2
|
436 |
return pmap_type(&g);
|
williamr@2
|
437 |
}
|
williamr@2
|
438 |
template <class vtype, class etype >
|
williamr@2
|
439 |
inline typename property_map< leda::GRAPH<vtype, etype>, vertex_all_t>::const_type
|
williamr@2
|
440 |
get(vertex_all_t, const leda::GRAPH<vtype, etype>& g) {
|
williamr@2
|
441 |
typedef typename property_map< leda::GRAPH<vtype, etype>,
|
williamr@2
|
442 |
vertex_all_t>::const_type pmap_type;
|
williamr@2
|
443 |
return pmap_type(&g);
|
williamr@2
|
444 |
}
|
williamr@2
|
445 |
|
williamr@2
|
446 |
template <>
|
williamr@2
|
447 |
struct leda_property_map<edge_all_t> {
|
williamr@2
|
448 |
template <class vtype, class etype>
|
williamr@2
|
449 |
struct bind_ {
|
williamr@2
|
450 |
typedef leda_graph_data_map<etype, etype&, leda::GRAPH<vtype, etype>*> type;
|
williamr@2
|
451 |
typedef leda_graph_data_map<etype, const etype&,
|
williamr@2
|
452 |
const leda::GRAPH<vtype, etype>*> const_type;
|
williamr@2
|
453 |
};
|
williamr@2
|
454 |
};
|
williamr@2
|
455 |
template <class vtype, class etype >
|
williamr@2
|
456 |
inline typename property_map< leda::GRAPH<vtype, etype>, edge_all_t>::type
|
williamr@2
|
457 |
get(edge_all_t, leda::GRAPH<vtype, etype>& g) {
|
williamr@2
|
458 |
typedef typename property_map< leda::GRAPH<vtype, etype>, edge_all_t>::type
|
williamr@2
|
459 |
pmap_type;
|
williamr@2
|
460 |
return pmap_type(&g);
|
williamr@2
|
461 |
}
|
williamr@2
|
462 |
template <class vtype, class etype >
|
williamr@2
|
463 |
inline typename property_map< leda::GRAPH<vtype, etype>, edge_all_t>::const_type
|
williamr@2
|
464 |
get(edge_all_t, const leda::GRAPH<vtype, etype>& g) {
|
williamr@2
|
465 |
typedef typename property_map< leda::GRAPH<vtype, etype>,
|
williamr@2
|
466 |
edge_all_t>::const_type pmap_type;
|
williamr@2
|
467 |
return pmap_type(&g);
|
williamr@2
|
468 |
}
|
williamr@2
|
469 |
|
williamr@2
|
470 |
// property map interface to the LEDA node_array class
|
williamr@2
|
471 |
|
williamr@2
|
472 |
template <class E, class ERef, class NodeMapPtr>
|
williamr@2
|
473 |
class leda_node_property_map
|
williamr@2
|
474 |
: public put_get_helper<ERef, leda_node_property_map<E, ERef, NodeMapPtr> >
|
williamr@2
|
475 |
{
|
williamr@2
|
476 |
public:
|
williamr@2
|
477 |
typedef E value_type;
|
williamr@2
|
478 |
typedef ERef reference;
|
williamr@2
|
479 |
typedef leda_node key_type;
|
williamr@2
|
480 |
typedef lvalue_property_map_tag category;
|
williamr@2
|
481 |
leda_node_property_map(NodeMapPtr a) : m_array(a) { }
|
williamr@2
|
482 |
ERef operator[](leda_node n) const { return (*m_array)[n]; }
|
williamr@2
|
483 |
protected:
|
williamr@2
|
484 |
NodeMapPtr m_array;
|
williamr@2
|
485 |
};
|
williamr@2
|
486 |
template <class E>
|
williamr@2
|
487 |
leda_node_property_map<E, const E&, const leda_node_array<E>*>
|
williamr@2
|
488 |
make_leda_node_property_map(const leda_node_array<E>& a)
|
williamr@2
|
489 |
{
|
williamr@2
|
490 |
typedef leda_node_property_map<E, const E&, const leda_node_array<E>*>
|
williamr@2
|
491 |
pmap_type;
|
williamr@2
|
492 |
return pmap_type(&a);
|
williamr@2
|
493 |
}
|
williamr@2
|
494 |
template <class E>
|
williamr@2
|
495 |
leda_node_property_map<E, E&, leda_node_array<E>*>
|
williamr@2
|
496 |
make_leda_node_property_map(leda_node_array<E>& a)
|
williamr@2
|
497 |
{
|
williamr@2
|
498 |
typedef leda_node_property_map<E, E&, leda_node_array<E>*> pmap_type;
|
williamr@2
|
499 |
return pmap_type(&a);
|
williamr@2
|
500 |
}
|
williamr@2
|
501 |
|
williamr@2
|
502 |
template <class E>
|
williamr@2
|
503 |
leda_node_property_map<E, const E&, const leda_node_map<E>*>
|
williamr@2
|
504 |
make_leda_node_property_map(const leda_node_map<E>& a)
|
williamr@2
|
505 |
{
|
williamr@2
|
506 |
typedef leda_node_property_map<E,const E&,const leda_node_map<E>*>
|
williamr@2
|
507 |
pmap_type;
|
williamr@2
|
508 |
return pmap_type(&a);
|
williamr@2
|
509 |
}
|
williamr@2
|
510 |
template <class E>
|
williamr@2
|
511 |
leda_node_property_map<E, E&, leda_node_map<E>*>
|
williamr@2
|
512 |
make_leda_node_property_map(leda_node_map<E>& a)
|
williamr@2
|
513 |
{
|
williamr@2
|
514 |
typedef leda_node_property_map<E, E&, leda_node_map<E>*> pmap_type;
|
williamr@2
|
515 |
return pmap_type(&a);
|
williamr@2
|
516 |
}
|
williamr@2
|
517 |
|
williamr@2
|
518 |
// g++ 'enumeral_type' in template unification not implemented workaround
|
williamr@2
|
519 |
template <class vtype, class etype, class Tag>
|
williamr@2
|
520 |
struct property_map<leda::GRAPH<vtype, etype>, Tag> {
|
williamr@2
|
521 |
typedef typename
|
williamr@2
|
522 |
leda_property_map<Tag>::template bind_<vtype, etype> map_gen;
|
williamr@2
|
523 |
typedef typename map_gen::type type;
|
williamr@2
|
524 |
typedef typename map_gen::const_type const_type;
|
williamr@2
|
525 |
};
|
williamr@2
|
526 |
|
williamr@2
|
527 |
template <class vtype, class etype, class PropertyTag, class Key>
|
williamr@2
|
528 |
inline
|
williamr@2
|
529 |
typename boost::property_traits<
|
williamr@2
|
530 |
typename boost::property_map<leda::GRAPH<vtype, etype>,PropertyTag>::const_type
|
williamr@2
|
531 |
>::value_type
|
williamr@2
|
532 |
get(PropertyTag p, const leda::GRAPH<vtype, etype>& g, const Key& key) {
|
williamr@2
|
533 |
return get(get(p, g), key);
|
williamr@2
|
534 |
}
|
williamr@2
|
535 |
|
williamr@2
|
536 |
template <class vtype, class etype, class PropertyTag, class Key,class Value>
|
williamr@2
|
537 |
inline void
|
williamr@2
|
538 |
put(PropertyTag p, leda::GRAPH<vtype, etype>& g,
|
williamr@2
|
539 |
const Key& key, const Value& value)
|
williamr@2
|
540 |
{
|
williamr@2
|
541 |
typedef typename property_map<leda::GRAPH<vtype, etype>, PropertyTag>::type Map;
|
williamr@2
|
542 |
Map pmap = get(p, g);
|
williamr@2
|
543 |
put(pmap, key, value);
|
williamr@2
|
544 |
}
|
williamr@2
|
545 |
|
williamr@2
|
546 |
} // namespace boost
|
williamr@2
|
547 |
|
williamr@2
|
548 |
|
williamr@2
|
549 |
#endif // BOOST_GRAPH_LEDA_HPP
|