43 using Iterator =
typename std::vector<T *>::iterator;
44 using ReverseIterator = std::reverse_iterator<Iterator>;
46 Iterator begin() {
return _elements.begin(); }
47 Iterator end() {
return _elements.end(); }
49 CyclicContainer() : _elements(), _current(
nullptr )
66 void add( T * element )
68 _elements.push_back(element);
72 void setCurrent(Iterator element)
74 if ( element != _elements.end() )
81 return std::find( _elements.begin(), _elements.end(), _current );
87 Iterator current = this->current();
89 if ( current == _elements.end() )
90 return findNext( _elements.begin() );
92 Iterator next = findNext( std::next( current, 1 ) );
94 if ( next == _elements.end() )
95 return findNext( _elements.begin() );
103 Iterator current = this->current();
105 ReverseIterator rbegin;
107 if ( current == _elements.end() )
108 rbegin = _elements.rbegin();
110 rbegin = ReverseIterator( current );
112 ReverseIterator previous = findPrevious( rbegin );
114 if ( previous == _elements.rend() && rbegin != _elements.rbegin() )
115 previous = findPrevious( _elements.rbegin() );
117 if ( previous == _elements.rend() )
118 return _elements.end();
120 return find( _elements.begin(), _elements.end(), *previous );
125 Iterator findNext( Iterator begin )
127 return find_if( begin, _elements.end(), [](
const T * element) {
128 return element->isSelectable();
133 ReverseIterator findPrevious( ReverseIterator rbegin )
135 return find_if( rbegin, _elements.rend(), [](
const T * element) {
136 return element->isSelectable();
141 std::vector<T *> _elements;