#pragma once #include template class periodic_iterator : public boost::iterator_adaptor, Iterator> { typedef boost::iterator_adaptor, Iterator> super_t; friend class boost::iterator_core_access; public: periodic_iterator() : super_t() , end() , length(1) {} periodic_iterator(Iterator begin, Iterator end) : super_t(begin) , end(end) , length(end - begin) {} private: void advance(typename super_t::difference_type n){ this->base_reference() += n; if(this->base() >= end) this->base_reference() -= length; } void increment() { advance(1); } void decrement() { advance(-1); } Iterator end; int length; }; template periodic_iterator periodic(Iterator begin, Iterator end){ return periodic_iterator(begin, end); }