1 //=======================================================================
2 // Copyright 2002 Indiana University.
3 // Copyright 2009 Trustees of Indiana University.
4 // Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek, Michael Hansen
5 //
6 // Distributed under the Boost Software License, Version 1.0. (See
7 // accompanying file LICENSE_1_0.txt or copy at
8 // http://www.boost.org/LICENSE_1_0.txt)
9 //=======================================================================
10 
11 #ifndef BOOST_GRAPH_DETAIL_INCREMENTAL_COMPONENTS_HPP
12 #define BOOST_GRAPH_DETAIL_INCREMENTAL_COMPONENTS_HPP
13 
14 #include <boost/operators.hpp>
15 
16 namespace boost {
17 
18   namespace detail {
19 
20     // Iterator for a component index linked list.  The contents of
21     // each array element represent the next index in the list.  A
22     // special value (the maximum index + 1) is used to terminate a
23     // list.
24     template <typename IndexRandomAccessIterator>
25     class component_index_iterator :
26       boost::forward_iterator_helper<component_index_iterator<IndexRandomAccessIterator>,
27                                      typename std::iterator_traits<IndexRandomAccessIterator>::value_type,
28                                      typename std::iterator_traits<IndexRandomAccessIterator>::difference_type,
29                                      typename std::iterator_traits<IndexRandomAccessIterator>::pointer,
30                                      typename std::iterator_traits<IndexRandomAccessIterator>::reference> {
31 
32     private:
33       typedef component_index_iterator<IndexRandomAccessIterator> self;
34 
35     public:
36       typedef std::forward_iterator_tag iterator_category;
37       typedef typename std::iterator_traits<IndexRandomAccessIterator>::value_type value_type;
38       typedef typename std::iterator_traits<IndexRandomAccessIterator>::difference_type reference;
39       typedef typename std::iterator_traits<IndexRandomAccessIterator>::pointer pointer;
40       typedef typename std::iterator_traits<IndexRandomAccessIterator>::reference difference_type;
41 
42       // Constructor for "begin" iterator
component_index_iterator(IndexRandomAccessIterator index_iterator,value_type begin_index)43       component_index_iterator(IndexRandomAccessIterator index_iterator,
44                                value_type begin_index) :
45         m_index_iterator(index_iterator),
46         m_current_index(begin_index) { }
47 
48       // Constructor for "end" iterator (end_index should be the linked
49       // list terminator).
component_index_iterator(value_type end_index)50       component_index_iterator(value_type end_index) :
51         m_current_index(end_index) { }
52 
operator *() const53       inline value_type operator*() const {
54         return (m_current_index);
55       }
56 
operator ++()57       self& operator++() {
58         // Move to the next element in the linked list
59         m_current_index = m_index_iterator[m_current_index];
60         return (*this);
61       }
62 
operator ==(const self & other_iterator) const63       bool operator==(const self& other_iterator) const {
64         return (m_current_index == *other_iterator);
65       }
66 
67     protected:
68       IndexRandomAccessIterator m_index_iterator;
69       value_type m_current_index;
70 
71     }; // class component_index_iterator
72 
73   } // namespace detail
74 
75 } // namespace detail
76 
77 #endif // BOOST_GRAPH_DETAIL_INCREMENTAL_COMPONENTS_HPP
78