From 9ea98199a11ec090b6a482f7a8f56211b3168e38 Mon Sep 17 00:00:00 2001 From: YagDen <32355687+YagDen@users.noreply.github.com> Date: Mon, 29 Jul 2024 00:26:20 +0300 Subject: [PATCH] Update circular_buffer.h Adding pop_back() functional --- circular_buffer.h | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/circular_buffer.h b/circular_buffer.h index 0c3beec..f2939e6 100644 --- a/circular_buffer.h +++ b/circular_buffer.h @@ -85,6 +85,7 @@ class CircularBuffer { void push_back(const value_type& data); void push_back(value_type&& data) noexcept; void pop_front(); + void pop_back(); reference front(); reference back(); const_reference front() const; @@ -120,6 +121,7 @@ class CircularBuffer { private: void _increment_bufferstate(); void _decrement_bufferstate(); + void _decrement_bufferstate_r(); mutable std::mutex _mtx; std::unique_ptr _buff; size_type _head = 0; @@ -369,6 +371,16 @@ void CircularBuffer::pop_front(){ _decrement_bufferstate(); } +template +inline +void CircularBuffer::pop_back() { + std::lock_guard _lck(_mtx); + if (empty()) + throw std::length_error("pop_back called on empty buffer"); + _decrement_bufferstate_r(); + +} + template inline void CircularBuffer::_decrement_bufferstate(){ @@ -376,6 +388,14 @@ void CircularBuffer::_decrement_bufferstate(){ _tail = (_tail + 1)%_max_size; } +template +inline +void CircularBuffer::_decrement_bufferstate_r() { + --_size; + if (!_head) _head = _max_size; + _head--; +} + template inline typename CircularBuffer::reference CircularBuffer::operator[](size_t index) {