• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //=======================================================================
2 // Copyright 2002 Indiana University.
3 // Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek
4 //
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 //=======================================================================
9 
10 #ifndef BOOST_ADJACENCY_ITERATOR_HPP
11 #define BOOST_ADJACENCY_ITERATOR_HPP
12 
13 #include <boost/detail/iterator.hpp>
14 #include <boost/iterator/iterator_adaptor.hpp>
15 #include <boost/graph/graph_traits.hpp>
16 
17 namespace boost
18 {
19 
20 template < class Graph, class Vertex, class OutEdgeIter, class Difference >
21 struct adjacency_iterator
22 : iterator_adaptor<
23       adjacency_iterator< Graph, Vertex, OutEdgeIter, Difference >, OutEdgeIter,
24       Vertex, use_default, Vertex, Difference >
25 {
26     typedef iterator_adaptor<
27         adjacency_iterator< Graph, Vertex, OutEdgeIter, Difference >,
28         OutEdgeIter, Vertex, use_default, Vertex, Difference >
29         super_t;
30 
adjacency_iteratorboost::adjacency_iterator31     inline adjacency_iterator() {}
adjacency_iteratorboost::adjacency_iterator32     inline adjacency_iterator(OutEdgeIter const& i, const Graph* g)
33     : super_t(i), m_g(g)
34     {
35     }
36 
dereferenceboost::adjacency_iterator37     inline Vertex dereference() const { return target(*this->base(), *m_g); }
38 
39     const Graph* m_g;
40 };
41 
42 template < class Graph,
43     class Vertex = typename graph_traits< Graph >::vertex_descriptor,
44     class OutEdgeIter = typename graph_traits< Graph >::out_edge_iterator >
45 class adjacency_iterator_generator
46 {
47     typedef
48         typename boost::detail::iterator_traits< OutEdgeIter >::difference_type
49             difference_type;
50 
51 public:
52     typedef adjacency_iterator< Graph, Vertex, OutEdgeIter, difference_type >
53         type;
54 };
55 
56 template < class Graph, class Vertex, class InEdgeIter, class Difference >
57 struct inv_adjacency_iterator
58 : iterator_adaptor<
59       inv_adjacency_iterator< Graph, Vertex, InEdgeIter, Difference >,
60       InEdgeIter, Vertex, use_default, Vertex, Difference >
61 {
62     typedef iterator_adaptor<
63         inv_adjacency_iterator< Graph, Vertex, InEdgeIter, Difference >,
64         InEdgeIter, Vertex, use_default, Vertex, Difference >
65         super_t;
66 
inv_adjacency_iteratorboost::inv_adjacency_iterator67     inline inv_adjacency_iterator() {}
inv_adjacency_iteratorboost::inv_adjacency_iterator68     inline inv_adjacency_iterator(InEdgeIter const& i, const Graph* g)
69     : super_t(i), m_g(g)
70     {
71     }
72 
dereferenceboost::inv_adjacency_iterator73     inline Vertex dereference() const { return source(*this->base(), *m_g); }
74 
75     const Graph* m_g;
76 };
77 
78 template < class Graph,
79     class Vertex = typename graph_traits< Graph >::vertex_descriptor,
80     class InEdgeIter = typename graph_traits< Graph >::in_edge_iterator >
81 class inv_adjacency_iterator_generator
82 {
83     typedef
84         typename boost::detail::iterator_traits< InEdgeIter >::difference_type
85             difference_type;
86 
87 public:
88     typedef inv_adjacency_iterator< Graph, Vertex, InEdgeIter, difference_type >
89         type;
90 };
91 
92 } // namespace boost
93 
94 #endif // BOOST_DETAIL_ADJACENCY_ITERATOR_HPP
95