1 //=======================================================================
2 // Copyright 1997, 1998, 1999, 2000 University of Notre Dame.
3 // Copyright 2004 The Trustees of Indiana University.
4 // Copyright 2007 University of Karlsruhe
5 // Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek, Douglas Gregor,
8 // Distributed under the Boost Software License, Version 1.0. (See
9 // accompanying file LICENSE_1_0.txt or copy at
10 // http://www.boost.org/LICENSE_1_0.txt)
11 //=======================================================================
12 #ifndef BOOST_GRAPH_LEDA_HPP
13 #define BOOST_GRAPH_LEDA_HPP
15 #include <boost/config.hpp>
16 #include <boost/iterator/iterator_facade.hpp>
17 #include <boost/graph/graph_traits.hpp>
18 #include <boost/graph/properties.hpp>
20 #include <LEDA/graph.h>
21 #include <LEDA/node_array.h>
22 #include <LEDA/node_map.h>
24 // The functions and classes in this file allows the user to
25 // treat a LEDA GRAPH object as a boost graph "as is". No
26 // wrapper is needed for the GRAPH object.
28 // Warning: this implementation relies on partial specialization
29 // for the graph_traits class (so it won't compile with Visual C++)
31 // Warning: this implementation is in alpha and has not been tested
33 #if !defined BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
36 struct leda_graph_traversal_category
:
37 public virtual bidirectional_graph_tag
,
38 public virtual adjacency_graph_tag
,
39 public virtual vertex_list_graph_tag
{ };
41 template <class vtype
, class etype
>
42 struct graph_traits
< leda::GRAPH
<vtype
,etype
> > {
43 typedef leda::node vertex_descriptor
;
44 typedef leda::edge edge_descriptor
;
46 class adjacency_iterator
47 : public iterator_facade
<adjacency_iterator
,
49 bidirectional_traversal_tag
,
54 adjacency_iterator(leda::node node
= 0,
55 const leda::GRAPH
<vtype
, etype
>* g
= 0)
58 leda::node
dereference() const { return leda::target(base
); }
60 bool equal(const adjacency_iterator
& other
) const
61 { return base
== other
.base
; }
63 void increment() { base
= g
->adj_succ(base
); }
64 void decrement() { base
= g
->adj_pred(base
); }
67 const leda::GRAPH
<vtype
, etype
>* g
;
69 friend class iterator_core_access
;
72 class out_edge_iterator
73 : public iterator_facade
<out_edge_iterator
,
75 bidirectional_traversal_tag
,
80 out_edge_iterator(leda::node node
= 0,
81 const leda::GRAPH
<vtype
, etype
>* g
= 0)
85 const leda::edge
& dereference() const { return base
; }
87 bool equal(const out_edge_iterator
& other
) const
88 { return base
== other
.base
; }
90 void increment() { base
= g
->adj_succ(base
); }
91 void decrement() { base
= g
->adj_pred(base
); }
94 const leda::GRAPH
<vtype
, etype
>* g
;
96 friend class iterator_core_access
;
99 class in_edge_iterator
100 : public iterator_facade
<in_edge_iterator
,
102 bidirectional_traversal_tag
,
107 in_edge_iterator(leda::node node
= 0,
108 const leda::GRAPH
<vtype
, etype
>* g
= 0)
109 : base(node
), g(g
) {}
112 const leda::edge
& dereference() const { return base
; }
114 bool equal(const in_edge_iterator
& other
) const
115 { return base
== other
.base
; }
117 void increment() { base
= g
->in_succ(base
); }
118 void decrement() { base
= g
->in_pred(base
); }
121 const leda::GRAPH
<vtype
, etype
>* g
;
123 friend class iterator_core_access
;
126 class vertex_iterator
127 : public iterator_facade
<vertex_iterator
,
129 bidirectional_traversal_tag
,
134 vertex_iterator(leda::node node
= 0,
135 const leda::GRAPH
<vtype
, etype
>* g
= 0)
136 : base(node
), g(g
) {}
139 const leda::node
& dereference() const { return base
; }
141 bool equal(const vertex_iterator
& other
) const
142 { return base
== other
.base
; }
144 void increment() { base
= g
->succ_node(base
); }
145 void decrement() { base
= g
->pred_node(base
); }
148 const leda::GRAPH
<vtype
, etype
>* g
;
150 friend class iterator_core_access
;
154 : public iterator_facade
<edge_iterator
,
156 bidirectional_traversal_tag
,
161 edge_iterator(leda::edge edge
= 0,
162 const leda::GRAPH
<vtype
, etype
>* g
= 0)
163 : base(edge
), g(g
) {}
166 const leda::edge
& dereference() const { return base
; }
168 bool equal(const edge_iterator
& other
) const
169 { return base
== other
.base
; }
171 void increment() { base
= g
->succ_edge(base
); }
172 void decrement() { base
= g
->pred_edge(base
); }
175 const leda::GRAPH
<vtype
, etype
>* g
;
177 friend class iterator_core_access
;
180 typedef directed_tag directed_category
;
181 typedef allow_parallel_edge_tag edge_parallel_category
; // not sure here
182 typedef leda_graph_traversal_category traversal_category
;
183 typedef int vertices_size_type
;
184 typedef int edges_size_type
;
185 typedef int degree_size_type
;
191 struct graph_traits
<leda::graph
> {
192 typedef leda::node vertex_descriptor
;
193 typedef leda::edge edge_descriptor
;
195 class adjacency_iterator
196 : public iterator_facade
<adjacency_iterator
,
198 bidirectional_traversal_tag
,
203 adjacency_iterator(leda::edge edge
= 0,
204 const leda::graph
* g
= 0)
205 : base(edge
), g(g
) {}
208 leda::node
dereference() const { return leda::target(base
); }
210 bool equal(const adjacency_iterator
& other
) const
211 { return base
== other
.base
; }
213 void increment() { base
= g
->adj_succ(base
); }
214 void decrement() { base
= g
->adj_pred(base
); }
217 const leda::graph
* g
;
219 friend class iterator_core_access
;
222 class out_edge_iterator
223 : public iterator_facade
<out_edge_iterator
,
225 bidirectional_traversal_tag
,
230 out_edge_iterator(leda::edge edge
= 0,
231 const leda::graph
* g
= 0)
232 : base(edge
), g(g
) {}
235 const leda::edge
& dereference() const { return base
; }
237 bool equal(const out_edge_iterator
& other
) const
238 { return base
== other
.base
; }
240 void increment() { base
= g
->adj_succ(base
); }
241 void decrement() { base
= g
->adj_pred(base
); }
244 const leda::graph
* g
;
246 friend class iterator_core_access
;
249 class in_edge_iterator
250 : public iterator_facade
<in_edge_iterator
,
252 bidirectional_traversal_tag
,
257 in_edge_iterator(leda::edge edge
= 0,
258 const leda::graph
* g
= 0)
259 : base(edge
), g(g
) {}
262 const leda::edge
& dereference() const { return base
; }
264 bool equal(const in_edge_iterator
& other
) const
265 { return base
== other
.base
; }
267 void increment() { base
= g
->in_succ(base
); }
268 void decrement() { base
= g
->in_pred(base
); }
271 const leda::graph
* g
;
273 friend class iterator_core_access
;
276 class vertex_iterator
277 : public iterator_facade
<vertex_iterator
,
279 bidirectional_traversal_tag
,
284 vertex_iterator(leda::node node
= 0,
285 const leda::graph
* g
= 0)
286 : base(node
), g(g
) {}
289 const leda::node
& dereference() const { return base
; }
291 bool equal(const vertex_iterator
& other
) const
292 { return base
== other
.base
; }
294 void increment() { base
= g
->succ_node(base
); }
295 void decrement() { base
= g
->pred_node(base
); }
298 const leda::graph
* g
;
300 friend class iterator_core_access
;
304 : public iterator_facade
<edge_iterator
,
306 bidirectional_traversal_tag
,
311 edge_iterator(leda::edge edge
= 0,
312 const leda::graph
* g
= 0)
313 : base(edge
), g(g
) {}
316 const leda::edge
& dereference() const { return base
; }
318 bool equal(const edge_iterator
& other
) const
319 { return base
== other
.base
; }
321 void increment() { base
= g
->succ_edge(base
); }
322 void decrement() { base
= g
->pred_edge(base
); }
325 const leda::graph
* g
;
327 friend class iterator_core_access
;
330 typedef directed_tag directed_category
;
331 typedef allow_parallel_edge_tag edge_parallel_category
; // not sure here
332 typedef leda_graph_traversal_category traversal_category
;
333 typedef int vertices_size_type
;
334 typedef int edges_size_type
;
335 typedef int degree_size_type
;
343 //===========================================================================
344 // functions for GRAPH<vtype,etype>
346 template <class vtype
, class etype
>
347 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::vertex_descriptor
348 source(typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::edge_descriptor e
,
349 const leda::GRAPH
<vtype
,etype
>& g
)
354 template <class vtype
, class etype
>
355 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::vertex_descriptor
356 target(typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::edge_descriptor e
,
357 const leda::GRAPH
<vtype
,etype
>& g
)
362 template <class vtype
, class etype
>
364 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::vertex_iterator
,
365 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::vertex_iterator
>
366 vertices(const leda::GRAPH
<vtype
,etype
>& g
)
368 typedef typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::vertex_iterator
370 return std::make_pair( Iter(g
.first_node(),&g
), Iter(0,&g
) );
373 template <class vtype
, class etype
>
375 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::edge_iterator
,
376 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::edge_iterator
>
377 edges(const leda::GRAPH
<vtype
,etype
>& g
)
379 typedef typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::edge_iterator
381 return std::make_pair( Iter(g
.first_edge(),&g
), Iter(0,&g
) );
384 template <class vtype
, class etype
>
386 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::out_edge_iterator
,
387 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::out_edge_iterator
>
389 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::vertex_descriptor u
,
390 const leda::GRAPH
<vtype
,etype
>& g
)
392 typedef typename graph_traits
< leda::GRAPH
<vtype
,etype
> >
393 ::out_edge_iterator Iter
;
394 return std::make_pair( Iter(g
.first_adj_edge(u
,0),&g
), Iter(0,&g
) );
397 template <class vtype
, class etype
>
399 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::in_edge_iterator
,
400 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::in_edge_iterator
>
402 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::vertex_descriptor u
,
403 const leda::GRAPH
<vtype
,etype
>& g
)
405 typedef typename graph_traits
< leda::GRAPH
<vtype
,etype
> >
406 ::in_edge_iterator Iter
;
407 return std::make_pair( Iter(g
.first_adj_edge(u
,1),&g
), Iter(0,&g
) );
410 template <class vtype
, class etype
>
412 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::adjacency_iterator
,
413 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::adjacency_iterator
>
415 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::vertex_descriptor u
,
416 const leda::GRAPH
<vtype
,etype
>& g
)
418 typedef typename graph_traits
< leda::GRAPH
<vtype
,etype
> >
419 ::adjacency_iterator Iter
;
420 return std::make_pair( Iter(g
.first_adj_edge(u
,0),&g
), Iter(0,&g
) );
423 template <class vtype
, class etype
>
424 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::vertices_size_type
425 num_vertices(const leda::GRAPH
<vtype
,etype
>& g
)
427 return g
.number_of_nodes();
430 template <class vtype
, class etype
>
431 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::edges_size_type
432 num_edges(const leda::GRAPH
<vtype
,etype
>& g
)
434 return g
.number_of_edges();
437 template <class vtype
, class etype
>
438 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::degree_size_type
440 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::vertex_descriptor u
,
441 const leda::GRAPH
<vtype
,etype
>& g
)
446 template <class vtype
, class etype
>
447 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::degree_size_type
449 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::vertex_descriptor u
,
450 const leda::GRAPH
<vtype
,etype
>& g
)
455 template <class vtype
, class etype
>
456 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::degree_size_type
458 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::vertex_descriptor u
,
459 const leda::GRAPH
<vtype
,etype
>& g
)
461 return g
.outdeg(u
) + g
.indeg(u
);
464 template <class vtype
, class etype
>
465 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::vertex_descriptor
466 add_vertex(leda::GRAPH
<vtype
,etype
>& g
)
471 template <class vtype
, class etype
>
472 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::vertex_descriptor
473 add_vertex(const vtype
& vp
, leda::GRAPH
<vtype
,etype
>& g
)
475 return g
.new_node(vp
);
478 template <class vtype
, class etype
>
480 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::vertex_descriptor u
,
481 leda::GRAPH
<vtype
,etype
>& g
)
483 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::out_edge_iterator ei
, ei_end
;
484 for (tie(ei
, ei_end
)=out_edges(u
,g
); ei
!=ei_end
; ei
++)
487 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::in_edge_iterator iei
, iei_end
;
488 for (tie(iei
, iei_end
)=in_edges(u
,g
); iei
!=iei_end
; iei
++)
492 template <class vtype
, class etype
>
494 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::vertex_descriptor u
,
495 leda::GRAPH
<vtype
,etype
>& g
)
500 template <class vtype
, class etype
>
502 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::edge_descriptor
,
505 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::vertex_descriptor u
,
506 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::vertex_descriptor v
,
507 leda::GRAPH
<vtype
,etype
>& g
)
509 return std::make_pair(g
.new_edge(u
, v
), true);
512 template <class vtype
, class etype
>
514 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::edge_descriptor
,
517 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::vertex_descriptor u
,
518 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::vertex_descriptor v
,
520 leda::GRAPH
<vtype
,etype
>& g
)
522 return std::make_pair(g
.new_edge(u
, v
, et
), true);
525 template <class vtype
, class etype
>
528 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::vertex_descriptor u
,
529 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::vertex_descriptor v
,
530 leda::GRAPH
<vtype
,etype
>& g
)
532 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::out_edge_iterator
534 for (boost::tie(i
,iend
) = out_edges(u
,g
); i
!= iend
; ++i
)
535 if (target(*i
,g
) == v
)
539 template <class vtype
, class etype
>
542 typename graph_traits
< leda::GRAPH
<vtype
,etype
> >::edge_descriptor e
,
543 leda::GRAPH
<vtype
,etype
>& g
)
548 //===========================================================================
549 // functions for graph (non-templated version)
551 graph_traits
<leda::graph
>::vertex_descriptor
552 source(graph_traits
<leda::graph
>::edge_descriptor e
,
553 const leda::graph
& g
)
558 graph_traits
<leda::graph
>::vertex_descriptor
559 target(graph_traits
<leda::graph
>::edge_descriptor e
,
560 const leda::graph
& g
)
566 graph_traits
<leda::graph
>::vertex_iterator
,
567 graph_traits
<leda::graph
>::vertex_iterator
>
568 vertices(const leda::graph
& g
)
570 typedef graph_traits
<leda::graph
>::vertex_iterator
572 return std::make_pair( Iter(g
.first_node(),&g
), Iter(0,&g
) );
576 graph_traits
<leda::graph
>::edge_iterator
,
577 graph_traits
<leda::graph
>::edge_iterator
>
578 edges(const leda::graph
& g
)
580 typedef graph_traits
<leda::graph
>::edge_iterator
582 return std::make_pair( Iter(g
.first_edge(),&g
), Iter(0,&g
) );
586 graph_traits
<leda::graph
>::out_edge_iterator
,
587 graph_traits
<leda::graph
>::out_edge_iterator
>
589 graph_traits
<leda::graph
>::vertex_descriptor u
, const leda::graph
& g
)
591 typedef graph_traits
<leda::graph
>::out_edge_iterator Iter
;
592 return std::make_pair( Iter(g
.first_adj_edge(u
),&g
), Iter(0,&g
) );
596 graph_traits
<leda::graph
>::in_edge_iterator
,
597 graph_traits
<leda::graph
>::in_edge_iterator
>
599 graph_traits
<leda::graph
>::vertex_descriptor u
,
600 const leda::graph
& g
)
602 typedef graph_traits
<leda::graph
>
603 ::in_edge_iterator Iter
;
604 return std::make_pair( Iter(g
.first_in_edge(u
),&g
), Iter(0,&g
) );
608 graph_traits
<leda::graph
>::adjacency_iterator
,
609 graph_traits
<leda::graph
>::adjacency_iterator
>
611 graph_traits
<leda::graph
>::vertex_descriptor u
,
612 const leda::graph
& g
)
614 typedef graph_traits
<leda::graph
>
615 ::adjacency_iterator Iter
;
616 return std::make_pair( Iter(g
.first_adj_edge(u
),&g
), Iter(0,&g
) );
619 graph_traits
<leda::graph
>::vertices_size_type
620 num_vertices(const leda::graph
& g
)
622 return g
.number_of_nodes();
625 graph_traits
<leda::graph
>::edges_size_type
626 num_edges(const leda::graph
& g
)
628 return g
.number_of_edges();
631 graph_traits
<leda::graph
>::degree_size_type
633 graph_traits
<leda::graph
>::vertex_descriptor u
,
634 const leda::graph
& g
)
639 graph_traits
<leda::graph
>::degree_size_type
641 graph_traits
<leda::graph
>::vertex_descriptor u
,
642 const leda::graph
& g
)
647 graph_traits
<leda::graph
>::degree_size_type
649 graph_traits
<leda::graph
>::vertex_descriptor u
,
650 const leda::graph
& g
)
652 return g
.outdeg(u
) + g
.indeg(u
);
655 graph_traits
<leda::graph
>::vertex_descriptor
656 add_vertex(leda::graph
& g
)
663 graph_traits
<leda::graph
>::vertex_descriptor u
,
664 graph_traits
<leda::graph
>::vertex_descriptor v
,
667 graph_traits
<leda::graph
>::out_edge_iterator
669 for (boost::tie(i
,iend
) = out_edges(u
,g
); i
!= iend
; ++i
)
670 if (target(*i
,g
) == v
)
676 graph_traits
<leda::graph
>::edge_descriptor e
,
683 graph_traits
<leda::graph
>::vertex_descriptor u
,
686 graph_traits
<leda::graph
>::out_edge_iterator ei
, ei_end
;
687 for (tie(ei
, ei_end
)=out_edges(u
,g
); ei
!=ei_end
; ei
++)
690 graph_traits
<leda::graph
>::in_edge_iterator iei
, iei_end
;
691 for (tie(iei
, iei_end
)=in_edges(u
,g
); iei
!=iei_end
; iei
++)
692 remove_edge(*iei
, g
);
696 graph_traits
<leda::graph
>::vertex_descriptor u
,
703 graph_traits
<leda::graph
>::edge_descriptor
,
706 graph_traits
<leda::graph
>::vertex_descriptor u
,
707 graph_traits
<leda::graph
>::vertex_descriptor v
,
710 return std::make_pair(g
.new_edge(u
, v
), true);
714 //===========================================================================
715 // property maps for GRAPH<vtype,etype>
717 class leda_graph_id_map
718 : public put_get_helper
<int, leda_graph_id_map
>
721 typedef readable_property_map_tag category
;
722 typedef int value_type
;
723 typedef int reference
;
724 typedef leda::node key_type
;
725 leda_graph_id_map() { }
727 long operator[](T x
) const { return x
->id(); }
729 template <class vtype
, class etype
>
730 inline leda_graph_id_map
731 get(vertex_index_t
, const leda::GRAPH
<vtype
, etype
>& g
) {
732 return leda_graph_id_map();
734 template <class vtype
, class etype
>
735 inline leda_graph_id_map
736 get(edge_index_t
, const leda::GRAPH
<vtype
, etype
>& g
) {
737 return leda_graph_id_map();
741 struct leda_property_map
{ };
744 struct leda_property_map
<vertex_index_t
> {
745 template <class vtype
, class etype
>
747 typedef leda_graph_id_map type
;
748 typedef leda_graph_id_map const_type
;
752 struct leda_property_map
<edge_index_t
> {
753 template <class vtype
, class etype
>
755 typedef leda_graph_id_map type
;
756 typedef leda_graph_id_map const_type
;
761 template <class Data
, class DataRef
, class GraphPtr
>
762 class leda_graph_data_map
763 : public put_get_helper
<DataRef
,
764 leda_graph_data_map
<Data
,DataRef
,GraphPtr
> >
767 typedef Data value_type
;
768 typedef DataRef reference
;
769 typedef void key_type
;
770 typedef lvalue_property_map_tag category
;
771 leda_graph_data_map(GraphPtr g
) : m_g(g
) { }
772 template <class NodeOrEdge
>
773 DataRef
operator[](NodeOrEdge x
) const { return (*m_g
)[x
]; }
779 struct leda_property_map
<vertex_all_t
> {
780 template <class vtype
, class etype
>
782 typedef leda_graph_data_map
<vtype
, vtype
&, leda::GRAPH
<vtype
, etype
>*> type
;
783 typedef leda_graph_data_map
<vtype
, const vtype
&,
784 const leda::GRAPH
<vtype
, etype
>*> const_type
;
787 template <class vtype
, class etype
>
788 inline typename property_map
< leda::GRAPH
<vtype
, etype
>, vertex_all_t
>::type
789 get(vertex_all_t
, leda::GRAPH
<vtype
, etype
>& g
) {
790 typedef typename property_map
< leda::GRAPH
<vtype
, etype
>, vertex_all_t
>::type
792 return pmap_type(&g
);
794 template <class vtype
, class etype
>
795 inline typename property_map
< leda::GRAPH
<vtype
, etype
>, vertex_all_t
>::const_type
796 get(vertex_all_t
, const leda::GRAPH
<vtype
, etype
>& g
) {
797 typedef typename property_map
< leda::GRAPH
<vtype
, etype
>,
798 vertex_all_t
>::const_type pmap_type
;
799 return pmap_type(&g
);
803 struct leda_property_map
<edge_all_t
> {
804 template <class vtype
, class etype
>
806 typedef leda_graph_data_map
<etype
, etype
&, leda::GRAPH
<vtype
, etype
>*> type
;
807 typedef leda_graph_data_map
<etype
, const etype
&,
808 const leda::GRAPH
<vtype
, etype
>*> const_type
;
811 template <class vtype
, class etype
>
812 inline typename property_map
< leda::GRAPH
<vtype
, etype
>, edge_all_t
>::type
813 get(edge_all_t
, leda::GRAPH
<vtype
, etype
>& g
) {
814 typedef typename property_map
< leda::GRAPH
<vtype
, etype
>, edge_all_t
>::type
816 return pmap_type(&g
);
818 template <class vtype
, class etype
>
819 inline typename property_map
< leda::GRAPH
<vtype
, etype
>, edge_all_t
>::const_type
820 get(edge_all_t
, const leda::GRAPH
<vtype
, etype
>& g
) {
821 typedef typename property_map
< leda::GRAPH
<vtype
, etype
>,
822 edge_all_t
>::const_type pmap_type
;
823 return pmap_type(&g
);
826 // property map interface to the LEDA node_array class
828 template <class E
, class ERef
, class NodeMapPtr
>
829 class leda_node_property_map
830 : public put_get_helper
<ERef
, leda_node_property_map
<E
, ERef
, NodeMapPtr
> >
833 typedef E value_type
;
834 typedef ERef reference
;
835 typedef leda::node key_type
;
836 typedef lvalue_property_map_tag category
;
837 leda_node_property_map(NodeMapPtr a
) : m_array(a
) { }
838 ERef
operator[](leda::node n
) const { return (*m_array
)[n
]; }
843 leda_node_property_map
<E
, const E
&, const leda::node_array
<E
>*>
844 make_leda_node_property_map(const leda::node_array
<E
>& a
)
846 typedef leda_node_property_map
<E
, const E
&, const leda::node_array
<E
>*>
848 return pmap_type(&a
);
851 leda_node_property_map
<E
, E
&, leda::node_array
<E
>*>
852 make_leda_node_property_map(leda::node_array
<E
>& a
)
854 typedef leda_node_property_map
<E
, E
&, leda::node_array
<E
>*> pmap_type
;
855 return pmap_type(&a
);
859 leda_node_property_map
<E
, const E
&, const leda::node_map
<E
>*>
860 make_leda_node_property_map(const leda::node_map
<E
>& a
)
862 typedef leda_node_property_map
<E
,const E
&,const leda::node_map
<E
>*>
864 return pmap_type(&a
);
867 leda_node_property_map
<E
, E
&, leda::node_map
<E
>*>
868 make_leda_node_property_map(leda::node_map
<E
>& a
)
870 typedef leda_node_property_map
<E
, E
&, leda::node_map
<E
>*> pmap_type
;
871 return pmap_type(&a
);
874 // g++ 'enumeral_type' in template unification not implemented workaround
875 template <class vtype
, class etype
, class Tag
>
876 struct property_map
<leda::GRAPH
<vtype
, etype
>, Tag
> {
878 leda_property_map
<Tag
>::template bind_
<vtype
, etype
> map_gen
;
879 typedef typename
map_gen::type type
;
880 typedef typename
map_gen::const_type const_type
;
883 template <class vtype
, class etype
, class PropertyTag
, class Key
>
885 typename
boost::property_traits
<
886 typename
boost::property_map
<leda::GRAPH
<vtype
, etype
>,PropertyTag
>::const_type
888 get(PropertyTag p
, const leda::GRAPH
<vtype
, etype
>& g
, const Key
& key
) {
889 return get(get(p
, g
), key
);
892 template <class vtype
, class etype
, class PropertyTag
, class Key
,class Value
>
894 put(PropertyTag p
, leda::GRAPH
<vtype
, etype
>& g
,
895 const Key
& key
, const Value
& value
)
897 typedef typename property_map
<leda::GRAPH
<vtype
, etype
>, PropertyTag
>::type Map
;
898 Map pmap
= get(p
, g
);
899 put(pmap
, key
, value
);
902 // property map interface to the LEDA edge_array class
904 template <class E
, class ERef
, class EdgeMapPtr
>
905 class leda_edge_property_map
906 : public put_get_helper
<ERef
, leda_edge_property_map
<E
, ERef
, EdgeMapPtr
> >
909 typedef E value_type
;
910 typedef ERef reference
;
911 typedef leda::edge key_type
;
912 typedef lvalue_property_map_tag category
;
913 leda_edge_property_map(EdgeMapPtr a
) : m_array(a
) { }
914 ERef
operator[](leda::edge n
) const { return (*m_array
)[n
]; }
919 leda_edge_property_map
<E
, const E
&, const leda::edge_array
<E
>*>
920 make_leda_node_property_map(const leda::node_array
<E
>& a
)
922 typedef leda_edge_property_map
<E
, const E
&, const leda::node_array
<E
>*>
924 return pmap_type(&a
);
927 leda_edge_property_map
<E
, E
&, leda::edge_array
<E
>*>
928 make_leda_edge_property_map(leda::edge_array
<E
>& a
)
930 typedef leda_edge_property_map
<E
, E
&, leda::edge_array
<E
>*> pmap_type
;
931 return pmap_type(&a
);
935 leda_edge_property_map
<E
, const E
&, const leda::edge_map
<E
>*>
936 make_leda_edge_property_map(const leda::edge_map
<E
>& a
)
938 typedef leda_edge_property_map
<E
,const E
&,const leda::edge_map
<E
>*>
940 return pmap_type(&a
);
943 leda_edge_property_map
<E
, E
&, leda::edge_map
<E
>*>
944 make_leda_edge_property_map(leda::edge_map
<E
>& a
)
946 typedef leda_edge_property_map
<E
, E
&, leda::edge_map
<E
>*> pmap_type
;
947 return pmap_type(&a
);
952 #endif // BOOST_GRAPH_LEDA_HPP