| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- //=======================================================================
- // Copyright 2002 Indiana University.
- // Copyright 2009 Trustees of Indiana University.
- // Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek, Michael Hansen
- //
- // Distributed under the Boost Software License, Version 1.0. (See
- // accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- //=======================================================================
- #ifndef BOOST_GRAPH_DETAIL_INCREMENTAL_COMPONENTS_HPP
- #define BOOST_GRAPH_DETAIL_INCREMENTAL_COMPONENTS_HPP
- #include <boost/operators.hpp>
- namespace boost
- {
- namespace detail
- {
- // Iterator for a component index linked list. The contents of
- // each array element represent the next index in the list. A
- // special value (the maximum index + 1) is used to terminate a
- // list.
- template < typename IndexRandomAccessIterator >
- class component_index_iterator
- : boost::forward_iterator_helper<
- component_index_iterator< IndexRandomAccessIterator >,
- typename std::iterator_traits<
- IndexRandomAccessIterator >::value_type,
- typename std::iterator_traits<
- IndexRandomAccessIterator >::difference_type,
- typename std::iterator_traits< IndexRandomAccessIterator >::pointer,
- typename std::iterator_traits<
- IndexRandomAccessIterator >::reference >
- {
- private:
- typedef component_index_iterator< IndexRandomAccessIterator > self;
- public:
- typedef std::forward_iterator_tag iterator_category;
- typedef typename std::iterator_traits<
- IndexRandomAccessIterator >::value_type value_type;
- typedef typename std::iterator_traits<
- IndexRandomAccessIterator >::difference_type reference;
- typedef
- typename std::iterator_traits< IndexRandomAccessIterator >::pointer
- pointer;
- typedef typename std::iterator_traits<
- IndexRandomAccessIterator >::reference difference_type;
- // Constructor for "begin" iterator
- component_index_iterator(
- IndexRandomAccessIterator index_iterator, value_type begin_index)
- : m_index_iterator(index_iterator), m_current_index(begin_index)
- {
- }
- // Constructor for "end" iterator (end_index should be the linked
- // list terminator).
- component_index_iterator(value_type end_index)
- : m_current_index(end_index)
- {
- }
- inline value_type operator*() const { return (m_current_index); }
- self& operator++()
- {
- // Move to the next element in the linked list
- m_current_index = m_index_iterator[m_current_index];
- return (*this);
- }
- bool operator==(const self& other_iterator) const
- {
- return (m_current_index == *other_iterator);
- }
- protected:
- IndexRandomAccessIterator m_index_iterator;
- value_type m_current_index;
- }; // class component_index_iterator
- } // namespace detail
- } // namespace detail
- #endif // BOOST_GRAPH_DETAIL_INCREMENTAL_COMPONENTS_HPP
|