Ok, now your problem is clearer :-)
Take a look at boost::iterator_facade and boost::iterator adaptor. They implement the full iterator interface and your cycle_iterator
only as to implement a few methods like increment(), decrement():
template<class IteratorBase>
class cycle_iterator
: public boost::iterator_adaptor<
cycle_iterator, // the derived class overriding iterator behavior
IteratorBase, // the base class providing default behavior
boost::use_default, // iterator value type, will be IteratorBase::value_type
std::forward_iterator_tag, // iterator category
boost::use_default // iterator reference type
>
{
private:
IteratorBase m_itBegin;
IteratorBase m_itEnd;
public:
cycle_iterator( IteratorBase itBegin, IteratorBase itEnd )
: iterator_adaptor_(itBegin), m_itBegin(itBegin), m_itEnd(itEnd)
{}
void increment() {
/* Increment the base reference pointer. */
++base_reference();
/* Check if past-the-end element is reached and bring back the base reference to the beginning. */
if(base_reference() == m_itEnd)
base_reference() = m_itBegin;
}
// implement decrement() and advance() if necessary
};
This probably doesn't compile but should get you started.
Edit:
boost::iterator_adaptor implements the full iterator interface in terms of few functions. It provides default implementations for increment()
, decrement()
, advance()
, distance_to()
, equal_to()
and dereference()
using the base iterator passed down to the iterator_adaptor
base class.
If all you need is a forward iterator, only the increment()
method must be implemented to wrap around once you reach the end iterator. A cyclical iterator can be bidirectional if you implement decrement()
in a similar fashion. If IteratorBase
is itself a random access iterator, the cycle iterator can also be random access and method advance
and distance_to
must be implemented using modulo operations.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…