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 <iterator>
14#include <boost/iterator/iterator_adaptor.hpp>
15#include <boost/graph/graph_traits.hpp>
16
17namespace boost
18{
19
20template < class Graph, class Vertex, class OutEdgeIter, class Difference >
21struct 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
31 inline adjacency_iterator() {}
32 inline adjacency_iterator(OutEdgeIter const& i, const Graph* g)
33 : super_t(i), m_g(g)
34 {
35 }
36
37 inline Vertex dereference() const { return target(*this->base(), *m_g); }
38
39 const Graph* m_g;
40};
41
42template < class Graph,
43 class Vertex = typename graph_traits< Graph >::vertex_descriptor,
44 class OutEdgeIter = typename graph_traits< Graph >::out_edge_iterator >
45class adjacency_iterator_generator
46{
47 typedef
48 typename std::iterator_traits< OutEdgeIter >::difference_type
49 difference_type;
50
51public:
52 typedef adjacency_iterator< Graph, Vertex, OutEdgeIter, difference_type >
53 type;
54};
55
56template < class Graph, class Vertex, class InEdgeIter, class Difference >
57struct 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
67 inline inv_adjacency_iterator() {}
68 inline inv_adjacency_iterator(InEdgeIter const& i, const Graph* g)
69 : super_t(i), m_g(g)
70 {
71 }
72
73 inline Vertex dereference() const { return source(*this->base(), *m_g); }
74
75 const Graph* m_g;
76};
77
78template < class Graph,
79 class Vertex = typename graph_traits< Graph >::vertex_descriptor,
80 class InEdgeIter = typename graph_traits< Graph >::in_edge_iterator >
81class inv_adjacency_iterator_generator
82{
83 typedef
84 typename std::iterator_traits< InEdgeIter >::difference_type
85 difference_type;
86
87public:
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