31 #ifndef SEEN_Circulator_H
32 #define SEEN_Circulator_H
38 template <
typename Iterator>
41 typedef std::random_access_iterator_tag iterator_category;
42 typedef typename std::iterator_traits<Iterator>::value_type value_type;
43 typedef typename std::iterator_traits<Iterator>::difference_type difference_type;
44 typedef typename std::iterator_traits<Iterator>::pointer pointer;
45 typedef typename std::iterator_traits<Iterator>::reference reference;
50 : _first(first), _last(last), _pos(pos)
52 match_random_access(iterator_category(first));
55 reference operator*()
const {
58 pointer operator->()
const {
63 if ( _first == _last )
return *
this;
65 if ( _pos == _last ) _pos = _first;
75 if ( _pos == _first ) _pos = _last;
100 difference_type operator-(
Circulator const &other) {
101 return _pos - other._pos;
104 reference operator[](
int n)
const {
109 void match_random_access(iterator_category) {}
111 Iterator _offset(
int n) {
112 difference_type range=( _last - _first );
113 difference_type offset=( _pos - _first + n );
117 offset += ( ( -offset / range ) + 1 ) * range;
118 }
else if ( offset >= range ) {
121 return _first + offset;
131 template <
typename T>
136 #endif // SEEN_Circulator_H
Definition: circulator.h:39