1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- //=======================================================================
- // 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
|