31#ifndef ETL_CIRCULAR_BUFFER_INCLUDED
32#define ETL_CIRCULAR_BUFFER_INCLUDED
42#include "static_assert.h"
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>
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;
313 current %= picb->buffer_size;
323 return (this->
operator+=(-n));
355 return (
lhs.current ==
rhs.current);
372 const size_t buffer_size =
lhs.container().max_size() + 1UL;
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;
584 current %= picb->buffer_size;
594 return (this->
operator+=(-n));
626 return (
lhs.current ==
rhs.current);
643 const size_t buffer_size =
lhs.container().max_size() + 1UL;
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];
882 this->increment_out();
886 ETL_INCREMENT_DEBUG_COUNT;
898 ::new (&pbuffer[
in])
T(etl::move(
item));
910 ETL_INCREMENT_DEBUG_COUNT;
918 template <
typename TIterator>
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;
1031 template <
typename TIterator1,
typename TIterator2>
1043 template <
typename TIterator>
1046 const difference_type index =
other.get_index();
1048 const size_t buffer_size =
other.container().buffer_size;
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));
1358 using ETL_OR_STD::swap;
1363 swap(this->buffer_size,
other.buffer_size);
1365#if defined(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...)
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>
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
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
size_t max_size() const
Returns the maximum number of items in the variant_pool.
Definition variant_pool_generator.h:281
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
Definition type_traits_generator.h:2069
Definition type_traits_generator.h:2055
iterator
Definition iterator.h:399
pair holds two objects of arbitrary type
Definition utility.h:164