Chris@16
|
1 //=======================================================================
|
Chris@16
|
2 // Copyright 2002 Indiana University.
|
Chris@16
|
3 // Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek
|
Chris@16
|
4 //
|
Chris@16
|
5 // Distributed under the Boost Software License, Version 1.0. (See
|
Chris@16
|
6 // accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
7 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
8 //=======================================================================
|
Chris@16
|
9
|
Chris@16
|
10 #ifndef BOOST_ADJACENCY_ITERATOR_HPP
|
Chris@16
|
11 #define BOOST_ADJACENCY_ITERATOR_HPP
|
Chris@16
|
12
|
Chris@16
|
13 #include <boost/iterator/iterator_adaptor.hpp>
|
Chris@16
|
14 #include <boost/graph/graph_traits.hpp>
|
Chris@16
|
15
|
Chris@16
|
16 namespace boost
|
Chris@16
|
17 {
|
Chris@16
|
18
|
Chris@16
|
19 template <class Graph, class Vertex, class OutEdgeIter, class Difference>
|
Chris@16
|
20 struct adjacency_iterator
|
Chris@16
|
21 : iterator_adaptor<
|
Chris@16
|
22 adjacency_iterator<Graph,Vertex,OutEdgeIter,Difference>
|
Chris@16
|
23 , OutEdgeIter
|
Chris@16
|
24 , Vertex
|
Chris@16
|
25 , use_default
|
Chris@16
|
26 , Vertex
|
Chris@16
|
27 , Difference
|
Chris@16
|
28 >
|
Chris@16
|
29 {
|
Chris@16
|
30 typedef iterator_adaptor<
|
Chris@16
|
31 adjacency_iterator<Graph,Vertex,OutEdgeIter,Difference>
|
Chris@16
|
32 , OutEdgeIter
|
Chris@16
|
33 , Vertex
|
Chris@16
|
34 , use_default
|
Chris@16
|
35 , Vertex
|
Chris@16
|
36 , Difference
|
Chris@16
|
37 > super_t;
|
Chris@16
|
38
|
Chris@16
|
39 inline adjacency_iterator() {}
|
Chris@16
|
40 inline adjacency_iterator(OutEdgeIter const& i, const Graph* g) : super_t(i), m_g(g) { }
|
Chris@16
|
41
|
Chris@16
|
42 inline Vertex
|
Chris@16
|
43 dereference() const
|
Chris@16
|
44 { return target(*this->base(), *m_g); }
|
Chris@16
|
45
|
Chris@16
|
46 const Graph* m_g;
|
Chris@16
|
47 };
|
Chris@16
|
48
|
Chris@16
|
49 template <class Graph,
|
Chris@16
|
50 class Vertex = typename graph_traits<Graph>::vertex_descriptor,
|
Chris@16
|
51 class OutEdgeIter=typename graph_traits<Graph>::out_edge_iterator>
|
Chris@16
|
52 class adjacency_iterator_generator
|
Chris@16
|
53 {
|
Chris@16
|
54 typedef typename boost::detail::iterator_traits<OutEdgeIter>
|
Chris@16
|
55 ::difference_type difference_type;
|
Chris@16
|
56 public:
|
Chris@16
|
57 typedef adjacency_iterator<Graph,Vertex,OutEdgeIter,difference_type> type;
|
Chris@16
|
58 };
|
Chris@16
|
59
|
Chris@16
|
60 template <class Graph, class Vertex, class InEdgeIter, class Difference>
|
Chris@16
|
61 struct inv_adjacency_iterator
|
Chris@16
|
62 : iterator_adaptor<
|
Chris@16
|
63 inv_adjacency_iterator<Graph,Vertex,InEdgeIter,Difference>
|
Chris@16
|
64 , InEdgeIter
|
Chris@16
|
65 , Vertex
|
Chris@16
|
66 , use_default
|
Chris@16
|
67 , Vertex
|
Chris@16
|
68 , Difference
|
Chris@16
|
69 >
|
Chris@16
|
70 {
|
Chris@16
|
71 typedef iterator_adaptor<
|
Chris@16
|
72 inv_adjacency_iterator<Graph,Vertex,InEdgeIter,Difference>
|
Chris@16
|
73 , InEdgeIter
|
Chris@16
|
74 , Vertex
|
Chris@16
|
75 , use_default
|
Chris@16
|
76 , Vertex
|
Chris@16
|
77 , Difference
|
Chris@16
|
78 > super_t;
|
Chris@16
|
79
|
Chris@16
|
80 inline inv_adjacency_iterator() { }
|
Chris@16
|
81 inline inv_adjacency_iterator(InEdgeIter const& i, const Graph* g) : super_t(i), m_g(g) { }
|
Chris@16
|
82
|
Chris@16
|
83 inline Vertex
|
Chris@16
|
84 dereference() const
|
Chris@16
|
85 { return source(*this->base(), *m_g); }
|
Chris@16
|
86
|
Chris@16
|
87 const Graph* m_g;
|
Chris@16
|
88 };
|
Chris@16
|
89
|
Chris@16
|
90 template <class Graph,
|
Chris@16
|
91 class Vertex = typename graph_traits<Graph>::vertex_descriptor,
|
Chris@16
|
92 class InEdgeIter = typename graph_traits<Graph>::in_edge_iterator>
|
Chris@16
|
93 class inv_adjacency_iterator_generator {
|
Chris@16
|
94 typedef typename boost::detail::iterator_traits<InEdgeIter>
|
Chris@16
|
95 ::difference_type difference_type;
|
Chris@16
|
96 public:
|
Chris@16
|
97 typedef inv_adjacency_iterator<Graph, Vertex, InEdgeIter, difference_type> type;
|
Chris@16
|
98 };
|
Chris@16
|
99
|
Chris@16
|
100 } // namespace boost
|
Chris@16
|
101
|
Chris@16
|
102 #endif // BOOST_DETAIL_ADJACENCY_ITERATOR_HPP
|