#ifndef Ring3_H #define Ring3_H #include "cycle_facade.H" #include template class CONT=std::vector> class Ring { public: typedef typename boost::cycle_facade::iterator> iterator; typedef typename boost::cycle_facade::const_iterator> const_iterator; Ring() : _size(0) {} explicit Ring (size_t n) : _size (n), v (n+1), it (boost::make_cycle_facade (v.begin(), v.begin(), v.end())) {} Ring (const Ring& r) : _size (r._size), v (r.v), it (boost::make_cycle_facade (v.begin()+r.it.offset(), v.begin(), v.end())) {} iterator begin() { return it; } iterator end() { return it + _size; } const iterator begin() const { return it; } const iterator end() const { return it + _size; } void shift (int n=1) { it += n; } void Shift (int n=1) { shift (n); } T& operator[] (int n) { return it[n]; } const T& operator[] (int n) const { return it[n]; } size_t size() const { return _size; } void resize (size_t n) { v.resize (n+1); _size = n; it = boost::make_cycle_facade (v.begin(), v.begin(), v.end()); } void insert (iterator pos, const T& value) { size_t offset = pos.offset(); // offset from base of v v.insert (v.begin()+offset, value); it = boost::make_cycle_facade (v.begin()+it.offset(), v.begin(), v.end()); _size++; } template void insert (iterator pos, in_t in, in_t inend) { size_t offset = pos.offset(); // offset from base of v v.insert (v.begin()+offset, in, inend); it = boost::make_cycle_facade (v.begin()+it.offset(), v.begin(), v.end()); _size += inend-in;; } void erase (iterator pos) { size_t offset = pos.offset(); v.erase (v.begin()+offset); it = boost::make_cycle_facade (v.begin()+it.offset(), v.begin(), v.end()); _size--; } size_t _size; CONT v; iterator it; }; #endif