You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
77 lines
3.0 KiB
77 lines
3.0 KiB
//======================================================================= |
|
// 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
|
|
|