31#ifndef ETL_CIRCULAR_BUFFER_INCLUDED
32#define ETL_CIRCULAR_BUFFER_INCLUDED
42#include "static_assert.h"
55 :
exception(reason_, file_name_, line_number_)
81 :
circular_buffer_exception(ETL_ERROR_TEXT(
"circular_buffer:type", ETL_CIRCULAR_BUFFER_FILE_ID
"B"), file_name_, line_number_)
114 if (i == buffer_size) ETL_UNLIKELY
125 return max_size() - size();
131 return buffer_size - 1U;
137 return buffer_size - 1U;
143 circular_buffer_base(
size_type buffer_size_)
144 : buffer_size(buffer_size_)
154 if (
in == buffer_size) ETL_UNLIKELY
164 if (
out == buffer_size) ETL_UNLIKELY
173 ETL_DECLARE_DEBUG_COUNT
179 template <
typename T>
184 typedef T value_type;
185 typedef T& reference;
186 typedef const T& const_reference;
188 typedef T&& rvalue_reference;
191 typedef const T* const_pointer;
193 typedef typename etl::iterator_traits<pointer>::difference_type difference_type;
218 , current(other.current)
228 current = other.current;
238 return picb->pbuffer[current];
246 return &picb->pbuffer[current];
257 if (current == picb->buffer_size)
285 current = picb->buffer_size - 1;
312 current +=
size_type(picb->buffer_size + n);
313 current %= picb->buffer_size;
323 return (this->
operator+=(-n));
355 return (lhs.current == rhs.current);
363 return !(lhs == rhs);
369 const difference_type lhs_index = lhs.get_index();
370 const difference_type rhs_index = rhs.get_index();
371 const difference_type reference_index = lhs.container().
begin().get_index();
372 const size_t buffer_size = lhs.container().max_size() + 1UL;
374 const difference_type lhs_distance = (lhs_index < reference_index) ? buffer_size + lhs_index - reference_index : lhs_index - reference_index;
375 const difference_type rhs_distance = (rhs_index < reference_index) ? buffer_size + rhs_index - reference_index : rhs_index - reference_index;
377 return lhs_distance < rhs_distance;
399 difference_type get_index()
const
405 const icircular_buffer& container()
const
411 pointer get_buffer()
const
419 difference_type distance(difference_type firstIndex, difference_type index)
const
421 if (index < firstIndex)
423 return picb->buffer_size + current - firstIndex;
427 return index - firstIndex;
469 , current(other.current)
478 , current(other.current)
488 current = other.current;
499 current = other.current;
509 return picb->pbuffer[current];
517 return &(picb->pbuffer[current]);
528 if (current == picb->buffer_size)
556 current = picb->buffer_size - 1;
583 current +=
size_type(picb->buffer_size + n);
584 current %= picb->buffer_size;
594 return (this->
operator+=(-n));
626 return (lhs.current == rhs.current);
634 return !(lhs == rhs);
640 const difference_type lhs_index = lhs.get_index();
641 const difference_type rhs_index = rhs.get_index();
642 const difference_type reference_index = lhs.container().
begin().get_index();
643 const size_t buffer_size = lhs.container().max_size() + 1UL;
645 const difference_type lhs_distance = (lhs_index < reference_index) ? buffer_size + lhs_index - reference_index : lhs_index - reference_index;
646 const difference_type rhs_distance = (rhs_index < reference_index) ? buffer_size + rhs_index - reference_index : rhs_index - reference_index;
648 return lhs_distance < rhs_distance;
670 difference_type get_index()
const
676 const icircular_buffer& container()
const
682 pointer get_buffer()
const
705 friend class const_iterator;
836 return pbuffer[
in == 0U ? buffer_size - 1 :
in - 1U];
847 return pbuffer[
in == 0U ? buffer_size - 1 :
in - 1U];
855 return pbuffer[(
out + index) % buffer_size];
864 return pbuffer[(
out + index) % buffer_size];
872 void push(const_reference item)
874 ::new (&pbuffer[
in]) T(item);
882 this->increment_out();
886 ETL_INCREMENT_DEBUG_COUNT;
896 void push(rvalue_reference item)
898 ::new (&pbuffer[
in]) T(etl::move(item));
910 ETL_INCREMENT_DEBUG_COUNT;
918 template <
typename TIterator>
919 void push(TIterator first,
const TIterator& last)
921 while (first != last)
936 ETL_DECREMENT_DEBUG_COUNT
959 ETL_RESET_DEBUG_COUNT
978#ifdef ETL_ICIRCULAR_BUFFER_REPAIR_ENABLE
982 virtual void repair() = 0;
1006 return distance(lhs.base(), rhs.base());
1014 return distance(lhs.base(), rhs.base());
1031 template <
typename TIterator1,
typename TIterator2>
1032 static difference_type
distance(
const TIterator1& range_begin,
const TIterator2& range_end)
1034 difference_type distance1 =
distance(range_begin);
1035 difference_type distance2 =
distance(range_end);
1037 return distance2 - distance1;
1043 template <
typename TIterator>
1044 static difference_type
distance(
const TIterator& other)
1046 const difference_type index = other.get_index();
1047 const difference_type reference_index = other.container().out;
1048 const size_t buffer_size = other.container().buffer_size;
1050 if (index < reference_index)
1052 return buffer_size + index - reference_index;
1056 return index - reference_index;
1075#if defined(ETL_POLYMORPHIC_CIRCULAR_BUFFER) || defined(ETL_POLYMORPHIC_CONTAINERS)
1092 template <
typename T,
size_t MAX_SIZE_>
1097 ETL_STATIC_ASSERT((MAX_SIZE_ > 0U),
"Zero capacity etl::circular_buffer is not valid");
1113 template <
typename TIterator>
1117 while (first != last)
1124#if ETL_HAS_INITIALIZER_LIST
1131 this->
push(init.begin(), init.end());
1171 while (itr != other.end())
1173 this->
push(etl::move(*itr));
1190 this->
push(etl::move(*itr));
1210#ifdef ETL_ICIRCULAR_BUFFER_REPAIR_ENABLE
1214#ifdef ETL_ICIRCULAR_BUFFER_REPAIR_ENABLE
1229 template <
typename T,
size_t MAX_SIZE_>
1236 template <
typename T>
1262 template <
typename TIterator>
1266 while (first != last)
1273#if ETL_HAS_INITIALIZER_LIST
1280 this->
push(init.begin(), init.end());
1326 while (itr != other.end())
1328 this->
push(etl::move(*itr));
1345 this->
push(etl::move(*itr));
1360 swap(this->
in, other.in);
1362 swap(this->pbuffer, other.pbuffer);
1363 swap(this->buffer_size, other.buffer_size);
1365#if defined(ETL_DEBUG_COUNT)
1366 this->etl_debug_count.swap(other.etl_debug_count);
1375 this->pbuffer =
reinterpret_cast<T*
>(buffer);
1383 return this->pbuffer != ETL_NULLPTR;
1397#ifdef ETL_ICIRCULAR_BUFFER_REPAIR_ENABLE
1401#ifdef ETL_ICIRCULAR_BUFFER_REPAIR_ENABLE
1411#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
1412 template <
typename T,
typename... Ts>
1413 circular_buffer(T, Ts...)
1414 ->circular_buffer<etl::enable_if_t<(etl::is_same_v<T, Ts> && ...), T>, 1U +
sizeof...(Ts)>;
1420 template <
typename T>
1429 template <
typename T>
1432 return (lhs.size() == rhs.size()) && etl::equal(lhs.
begin(), lhs.
end(), rhs.
begin());
1438 template <
typename T>
1441 return !(lhs == rhs);
Definition: circular_buffer.h:90
size_t size_type
The type used for determining the size of queue.
Definition: circular_buffer.h:94
size_type out
Index to the next read.
Definition: circular_buffer.h:172
size_type in
Index to the next write.
Definition: circular_buffer.h:171
Empty exception for the circular_buffer.
Definition: circular_buffer.h:64
Exception for the circular_buffer.
Definition: circular_buffer.h:51
Definition: circular_buffer.h:1238
void swap(circular_buffer_ext &other) ETL_NOEXCEPT
Swap with another circular buffer.
Definition: circular_buffer.h:1356
circular_buffer_ext & operator=(const circular_buffer_ext &other)
Assignment operator.
Definition: circular_buffer.h:1304
circular_buffer_ext(size_t max_size)
Definition: circular_buffer.h:1253
void set_buffer(void *buffer)
set_buffer
Definition: circular_buffer.h:1373
circular_buffer_ext(const circular_buffer_ext &other) ETL_DELETE
Copy Constructor (Deleted)
bool is_valid() const
set_buffer
Definition: circular_buffer.h:1381
circular_buffer_ext(void *buffer, size_t max_size)
Constructor.
Definition: circular_buffer.h:1244
circular_buffer_ext(const circular_buffer_ext &other, void *buffer, size_t max_size)
Construct a copy.
Definition: circular_buffer.h:1287
~circular_buffer_ext()
Destructor.
Definition: circular_buffer.h:1389
circular_buffer_ext(TIterator first, const TIterator &last, void *buffer, size_t max_size, typename etl::enable_if<!etl::is_integral< TIterator >::value, int >::type=0)
Definition: circular_buffer.h:1263
void repair()
Fix the internal pointers after a low level memory copy.
Definition: circular_buffer.h:1400
Incompatible type exception.
Definition: circular_buffer.h:77
Definition: circular_buffer.h:1094
circular_buffer(TIterator first, const TIterator &last, typename etl::enable_if<!etl::is_integral< TIterator >::value, int >::type=0)
Definition: circular_buffer.h:1114
circular_buffer & operator=(const circular_buffer &other)
Assignment operator.
Definition: circular_buffer.h:1150
circular_buffer(const circular_buffer &other)
Copy Constructor.
Definition: circular_buffer.h:1138
~circular_buffer()
Destructor.
Definition: circular_buffer.h:1202
void repair()
Fix the internal pointers after a low level memory copy.
Definition: circular_buffer.h:1213
circular_buffer()
Constructor.
Definition: circular_buffer.h:1104
Iterator iterating through the circular buffer.
Definition: circular_buffer.h:450
const_iterator & operator-=(int n)
Subtract offset.
Definition: circular_buffer.h:592
const_iterator()
Constructor.
Definition: circular_buffer.h:458
const_iterator(const icircular_buffer< T > *picb_, size_type current_)
Protected constructor. Only icircular_buffer can create one.
Definition: circular_buffer.h:692
const_iterator(const typename icircular_buffer::iterator &other)
Copy Constructor from iterator.
Definition: circular_buffer.h:467
friend bool operator!=(const const_iterator &lhs, const const_iterator &rhs)
Inequality operator.
Definition: circular_buffer.h:632
const_iterator & operator+=(int n)
Add offset.
Definition: circular_buffer.h:581
const_iterator & operator--()
Pre-decrement.
Definition: circular_buffer.h:551
friend bool operator==(const const_iterator &lhs, const const_iterator &rhs)
Equality operator.
Definition: circular_buffer.h:624
const_iterator(const const_iterator &other)
Copy Constructor from const iterator.
Definition: circular_buffer.h:476
const_iterator & operator++()
Pre-increment.
Definition: circular_buffer.h:523
const_reference operator*() const
Definition: circular_buffer.h:507
friend const_iterator operator-(const const_iterator &lhs, int n)
Subtract offset.
Definition: circular_buffer.h:612
const_pointer operator->() const
-> operator
Definition: circular_buffer.h:515
friend const_iterator operator+(const const_iterator &lhs, int n)
Add offset.
Definition: circular_buffer.h:600
const_iterator & operator=(const typename icircular_buffer::iterator &other)
Assignment operator.
Definition: circular_buffer.h:485
Iterator iterating through the circular buffer.
Definition: circular_buffer.h:199
iterator(const icircular_buffer< T > *picb_, size_type current_)
Protected constructor. Only icircular_buffer can create one.
Definition: circular_buffer.h:434
iterator & operator+=(int n)
Add offset.
Definition: circular_buffer.h:310
friend bool operator==(const iterator &lhs, const iterator &rhs)
Equality operator.
Definition: circular_buffer.h:353
iterator & operator--()
Pre-decrement.
Definition: circular_buffer.h:280
friend iterator operator-(const iterator &lhs, int n)
Subtract offset.
Definition: circular_buffer.h:341
pointer operator->() const
-> operator
Definition: circular_buffer.h:244
iterator & operator-=(int n)
Subtract offset.
Definition: circular_buffer.h:321
friend iterator operator+(const iterator &lhs, int n)
Add offset.
Definition: circular_buffer.h:329
reference operator*() const
Definition: circular_buffer.h:236
iterator & operator=(const iterator &other)
Assignment operator.
Definition: circular_buffer.h:225
iterator()
Constructor.
Definition: circular_buffer.h:207
friend bool operator!=(const iterator &lhs, const iterator &rhs)
Inequality operator.
Definition: circular_buffer.h:361
iterator & operator++()
Pre-increment.
Definition: circular_buffer.h:252
iterator(const iterator &other)
Copy Constructor.
Definition: circular_buffer.h:216
Definition: circular_buffer.h:181
static difference_type distance(const TIterator1 &range_begin, const TIterator2 &range_end)
Measures the distance between two iterators.
Definition: circular_buffer.h:1032
void fill(const T &value)
Fills the buffer.
Definition: circular_buffer.h:973
const_reverse_iterator rend() const
Gets a const reverse iterator to the end of the buffer.
Definition: circular_buffer.h:793
void pop()
pop
Definition: circular_buffer.h:931
reverse_iterator rend()
Gets a reverse iterator to the end of the buffer.
Definition: circular_buffer.h:785
const_reverse_iterator rbegin() const
Gets a const reverse iterator to the start of the buffer.
Definition: circular_buffer.h:769
void push(TIterator first, const TIterator &last)
Push a buffer from an iterator range.
Definition: circular_buffer.h:919
friend difference_type operator-(const iterator &lhs, const iterator &rhs)
Definition: circular_buffer.h:988
const_iterator end() const
Gets a const iterator to the end of the buffer.
Definition: circular_buffer.h:745
const_reference back() const
Definition: circular_buffer.h:843
iterator end()
Gets an iterator to the end of the buffer.
Definition: circular_buffer.h:737
iterator begin()
Gets an iterator to the start of the buffer.
Definition: circular_buffer.h:713
const_iterator begin() const
Gets a const iterator to the start of the buffer.
Definition: circular_buffer.h:721
const_iterator cbegin() const
Gets a const iterator to the start of the buffer.
Definition: circular_buffer.h:729
const_reverse_iterator crend() const
Gets a const reverse iterator to the end of the buffer.
Definition: circular_buffer.h:801
reference front()
Definition: circular_buffer.h:810
void clear()
Clears the buffer.
Definition: circular_buffer.h:953
void repair_buffer(T *pbuffer_)
Fix the internal pointers after a low level memory copy.
Definition: circular_buffer.h:1063
reference back()
Definition: circular_buffer.h:832
icircular_buffer(pointer pbuffer_, size_type max_length)
Protected constructor.
Definition: circular_buffer.h:1022
reverse_iterator rbegin()
Gets a reverse iterator to the start of the buffer.
Definition: circular_buffer.h:761
void pop(size_type n)
pop(n)
Definition: circular_buffer.h:942
reference operator[](size_t index)
Get a reference to the item.
Definition: circular_buffer.h:853
void push(const_reference item)
Definition: circular_buffer.h:872
const_iterator cend() const
Gets a const iterator to the end of the buffer.
Definition: circular_buffer.h:753
const_reverse_iterator crbegin() const
Gets a const reverse iterator to the start of the buffer.
Definition: circular_buffer.h:777
static difference_type distance(const TIterator &other)
Measures the distance from the _begin iterator to the specified iterator.
Definition: circular_buffer.h:1044
~icircular_buffer()
Destructor.
Definition: circular_buffer.h:1082
const_reference front() const
Definition: circular_buffer.h:821
Definition: iterator.h:228
#define ETL_ASSERT(b, e)
Definition: error_handler.h:316
ETL_CONSTEXPR exception(string_type reason_, string_type, numeric_type line_)
Constructor.
Definition: exception.h:69
Definition: exception.h:47
enable_if
Definition: type_traits_generator.h:1191
is_integral
Definition: type_traits_generator.h:1001
bitset_ext
Definition: absolute.h:38
bool operator>(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:684
size_t max_size() const
Returns the maximum number of items in the variant_pool.
Definition: variant_pool_generator.h:281
void swap(etl::circular_buffer_ext< T > &lhs, etl::circular_buffer_ext< T > &rhs)
Template deduction guides.
Definition: circular_buffer.h:1421
bool operator>=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:696
bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:645
void swap(etl::array< T, SIZE > &lhs, etl::array< T, SIZE > &rhs)
Template deduction guides.
Definition: array.h:621
bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:633
bool operator<(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:657
bool operator<=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:672
Definition: type_traits_generator.h:2069
Definition: type_traits_generator.h:2055
iterator
Definition: iterator.h:399