15#if __has_include("defs.h")
31 using difference_type = std::ptrdiff_t;
33 using reference = T
const&;
34 using pointer = T
const*;
35 using iterator_category = std::bidirectional_iterator_tag;
46 if (pos == (
size_t)(-1))
47 throw std::range_error (
"Ring buffer iterator at end!");
48 return ring->buf[pos];
54 if (pos == (
size_t)(-1))
55 throw std::range_error (
"Ring buffer iterator at end!");
56 return ring->buf[pos];
62 if (pos == (
size_t)(-1))
63 throw std::range_error (
"Ring buffer iterator at end!");
64 return &ring->buf[pos];
70 if (pos == (
size_t)(-1))
71 throw std::range_error (
"Ring buffer iterator at end!");
72 return &ring->buf[pos];
79 pos = ring->increment (pos);
86 pos = ring->increment (pos);
94 pos = ring->decrement (pos);
101 pos = ring->decrement (pos);
108 return (ring == it.ring) && (pos == it.pos);
132 tmp.pos = ring->add (pos, inc);
139 pos = ring->add (pos, inc);
147 tmp.pos = ring->subtract (pos, dec);
154 pos = ring->subtract (pos, dec);
161 assert (ring == other.ring);
162 size_t p1 = (pos != -1) ? pos
163 : (ring->back_idx == ring->front_idx) ? ring->sz
165 size_t p2 = (other.pos != -1) ? other.pos
166 : (ring->back_idx == ring->front_idx) ? ring->sz
171 return ring->cap - p2 + p1;
177 , pos (ring->sz?pos_: -1)
190 using difference_type = std::ptrdiff_t;
191 using value_type = T;
192 using reference = T&;
194 using iterator_category = std::bidirectional_iterator_tag;
293 : buf (std::unique_ptr<T[]> (new T[
size]))
310 : front_idx (other.front_idx)
311 , back_idx (other.back_idx)
317 buf = std::unique_ptr<T[]> (new T[other.cap]);
318 for (size_t i = 0; i < sz; i++)
320 size_t idx = (front_idx + i) % cap;
321 buf[idx] = other.buf[idx];
328 : buf (std::unique_ptr<T[]> (new T[il.
size ()]))
335 for (
const auto v : il)
336 buf[i++] = std::move (v);
344 front_idx = rhs.front_idx;
345 back_idx = rhs.back_idx;
350 buf.reset (
new T[rhs.cap]);
351 for (
size_t i = 0; i < sz; i++)
353 size_t idx = (front_idx + i) % cap;
354 buf[idx] = rhs.buf[idx];
366 if (cap == other.cap && sz == other.sz)
368 for (
size_t i = 0; i < sz; i++)
370 size_t idx1 = (front_idx + i) % cap;
371 size_t idx2 = (other.front_idx + i) % other.cap;
372 if (buf[idx1] != other.buf[idx2])
387 operator std::vector<T> ()
const
389 std::vector<T> v (sz);
390 for (
size_t i = 0; i < sz; i++)
391 v[i] = buf[(front_idx + i) % cap];
402 if (sz && back_idx == front_idx)
403 front_idx = (front_idx + 1) % cap;
406 buf[back_idx] = item;
407 back_idx = (back_idx + 1) % cap;
431 return iterator (
this, (
size_t)(-1));
451 throw std::range_error (
"ring_buffer::pop_front - empty container");
453 front_idx = (front_idx + 1) % cap;
462 throw std::range_error (
"ring_buffer::front - empty container");
464 return buf[front_idx];
472 throw std::range_error (
"ring_buffer::front - empty container");
474 return buf[front_idx];
482 throw std::range_error (
"ring_buffer::back - empty container");
484 return buf[(back_idx + cap - 1) % cap];
492 throw std::range_error (
"ring_buffer::back - empty container");
494 return buf[(back_idx + cap - 1) % cap];
502 if (ptr.ring !=
this)
503 throw std::runtime_error (
"ring_buffer<>::erase - Invalid iterator");
507 size_t pos = ptr.pos == (size_t)-1 ? back_idx : ptr.pos;
509 if ((front_idx < back_idx && (pos < front_idx || pos >= back_idx))
510 || (front_idx > back_idx && (pos < back_idx || pos >= front_idx)))
511 throw std::range_error (
"ring_buffer<>::erase - Bad iterator position");
513 for (
auto p = pos; p != front_idx; )
515 auto pp = decrement (p);
516 assert (pp != (
size_t)-1);
521 if (pos == front_idx)
522 pos = increment (pos);
523 front_idx = (front_idx + 1) % cap;
530 front_idx = back_idx;
555 std::unique_ptr<T[]> newbuf (new_cap ?
new T[new_cap] :
nullptr);
560 for (
size_t i = 0; i < sz; i++)
561 newbuf[i] = buf[(front_idx + i) % cap];
568 back_idx = cap ? (front_idx + sz) % cap : 0;
579 size_t increment (
size_t pos)
const
581 if (cap && pos != (
size_t)-1)
582 pos = (pos + 1) % cap;
589 size_t decrement (
size_t pos)
const
593 if (pos == (
size_t)-1)
594 pos = (back_idx + cap - 1) % cap;
595 else if (pos != front_idx)
596 pos = (pos + cap - 1) % cap;
602 size_t add (
size_t oldpos,
size_t delta)
const
604 if (cap && oldpos != -1)
606 size_t np = oldpos + (delta % cap);
607 if (np >= cap && np >= back_idx + cap)
617 size_t subtract (
size_t oldpos,
size_t delta)
const
621 size_t np = (oldpos == (size_t)-1 ? back_idx : oldpos) - (delta % cap) + cap;
631 std::unique_ptr<T[]> buf;
Iterator through the circular buffer.
Definition ringbuf.h:28
bool operator!=(const const_iterator &it) const
Inequality comparison.
Definition ringbuf.h:112
const_iterator()
Default constructor.
Definition ringbuf.h:38
const_iterator & operator+=(size_t inc)
Addition assignment operator.
Definition ringbuf.h:137
const_iterator & operator--()
Decrement operator (prefix)
Definition ringbuf.h:99
const_iterator & operator=(const const_iterator &rhs)
Assignment operator.
Definition ringbuf.h:118
reference operator*()
Dereference operator.
Definition ringbuf.h:44
const_iterator operator-(size_t dec) const
Subtraction operator.
Definition ringbuf.h:144
const pointer operator->() const
Object pointer (const version)
Definition ringbuf.h:68
pointer operator->()
Object pointer.
Definition ringbuf.h:60
const_iterator & operator-=(size_t dec)
Subtraction assignment operator.
Definition ringbuf.h:152
const_iterator operator+(size_t inc) const
Addition operator.
Definition ringbuf.h:129
bool operator==(const const_iterator &it) const
Equality comparison.
Definition ringbuf.h:106
const_iterator & operator++()
Increment operator (prefix)
Definition ringbuf.h:84
iterator()
Default constructor.
Definition ringbuf.h:198
reference operator*()
Dereference operator.
Definition ringbuf.h:207
iterator & operator++()
Increment operator (prefix)
Definition ringbuf.h:225
iterator & operator--()
Decrement operator (prefix)
Definition ringbuf.h:238
iterator operator+(size_t inc) const
Addition operator.
Definition ringbuf.h:252
iterator & operator=(const const_iterator &rhs)
Assignment operator.
Definition ringbuf.h:245
iterator & operator-=(size_t dec)
Subtraction assignment operator.
Definition ringbuf.h:271
iterator operator-(size_t dec) const
Subtraction operator.
Definition ringbuf.h:265
iterator & operator+=(size_t inc)
Addition assignment operator.
Definition ringbuf.h:258
pointer operator->()
Object pointer.
Definition ringbuf.h:213
Circular buffer.
Definition ringbuf.h:24
void pop_front()
Remove oldest element from buffer.
Definition ringbuf.h:447
void clear(void)
Remove all elements from buffer.
Definition ringbuf.h:528
size_t size() const
Return number of elements in buffer.
Definition ringbuf.h:572
ring_buffer(const ring_buffer &other)
Copy constructor.
Definition ringbuf.h:309
T & front()
Return a reference to first (oldest) element in buffer.
Definition ringbuf.h:458
void push_back(const T &item)
Inserts new element in buffer.
Definition ringbuf.h:397
ring_buffer()
Default constructor.
Definition ringbuf.h:301
bool empty(void)
Return true if buffer is empty.
Definition ringbuf.h:535
const T & front() const
Return a reference to first (oldest) element in buffer.
Definition ringbuf.h:468
ring_buffer(std::initializer_list< T > il)
Initializer list constructor.
Definition ringbuf.h:327
bool full(void) const
Return true if buffer is full.
Definition ringbuf.h:541
const_iterator begin() const
Return a const iterator pointing to first (oldest) element in buffer.
Definition ringbuf.h:417
void resize(size_t new_cap)
(Re)allocate buffer with a different capacity
Definition ringbuf.h:553
size_t capacity(void) const
Return maximum buffer size.
Definition ringbuf.h:547
const T & back() const
Return reference to last (newest) element in buffer.
Definition ringbuf.h:488
const_iterator cbegin()
Return a const iterator pointing to first (oldest) element in buffer.
Definition ringbuf.h:423
iterator end()
Return an iterator pointing past the last (newest) element in buffer.
Definition ringbuf.h:429
T & back()
Return reference to last (newest) element in buffer.
Definition ringbuf.h:478
const_iterator end() const
Return a const iterator pointing past the last (newest) element in buffer.
Definition ringbuf.h:435
iterator erase(const_iterator &ptr)
Definition ringbuf.h:499
ring_buffer(size_t size)
Constructor.
Definition ringbuf.h:292
const_iterator cend()
Return an iterator pointing past the last (newest) element in buffer.
Definition ringbuf.h:441
iterator begin()
Return an iterator pointing to first (oldest) element in buffer.
Definition ringbuf.h:411
bool operator!=(const timeval &t1, const timeval &t2)
"Not equal" operator
Definition tvops.h:73
bool operator==(const timeval &t1, const timeval &t2)
Equality operator.
Definition tvops.h:31