38#ifndef ETL_BIP_BUFFER_SPSC_ATOMIC_INCLUDED
39#define ETL_BIP_BUFFER_SPSC_ATOMIC_INCLUDED
63 class bip_buffer_exception:
public exception
76 class bip_buffer_reserve_invalid:
public bip_buffer_exception
89 template <
size_t Memory_Model = etl::memory_model::MEMORY_MODEL_LARGE>
90 class bip_buffer_spsc_atomic_base
110 return available() == 0;
117 size_type
size()
const
119 size_type write_index =
write.load(etl::memory_order_acquire);
120 size_type read_index =
read.load(etl::memory_order_acquire);
123 if (write_index >= read_index)
126 return write_index - read_index;
130 size_type
last_index = last.load(etl::memory_order_acquire);
133 return (write_index - 0) + (
last_index - read_index);
140 size_type available()
const
142 size_type write_index =
write.load(etl::memory_order_acquire);
143 size_type read_index =
read.load(etl::memory_order_acquire);
146 if (write_index >= read_index)
153 return read_index - 1;
162 return read_index - write_index - 1;
169 size_type capacity()
const
198 read.store(0, etl::memory_order_release);
199 write.store(0, etl::memory_order_release);
200 last.store(0, etl::memory_order_release);
206 size_type write_index =
write.load(etl::memory_order_relaxed);
207 size_type read_index =
read.load(etl::memory_order_acquire);
210 if (write_index >= read_index)
232 if (*
psize >= read_index)
236 *
psize = read_index - 1;
250 if ((write_index + *
psize) >= read_index)
252 *
psize = read_index - write_index - 1;
264 size_type write_index =
write.load(etl::memory_order_relaxed);
265 size_type read_index =
read.load(etl::memory_order_acquire);
268 if (write_index < read_index)
273 else if (
windex == write_index)
278 last.store(
windex +
wsize, etl::memory_order_release);
294 size_type read_index =
read.load(etl::memory_order_relaxed);
295 size_type write_index =
write.load(etl::memory_order_acquire);
297 if (read_index > write_index)
300 size_type
last_index = last.load(etl::memory_order_relaxed);
319 if ((write_index - read_index) < *
psize)
321 *
psize = write_index - read_index;
346#if defined(ETL_POLYMORPHIC_SPSC_BIP_BUFFER_ATOMIC) || defined(ETL_POLYMORPHIC_CONTAINERS)
364 template <
typename T, const
size_t Memory_Model = etl::memory_model::MEMORY_MODEL_LARGE>
365 class ibip_buffer_spsc_atomic :
public bip_buffer_spsc_atomic_base<Memory_Model>
371 using base_t::get_read_reserve;
372 using base_t::apply_read_reserve;
373 using base_t::get_write_reserve;
374 using base_t::apply_write_reserve;
378 typedef T value_type;
379 typedef T& reference;
380 typedef const T& const_reference;
384 typedef typename base_t::size_type size_type;
386 using base_t::max_size;
406 size_type
rindex = etl::distance(p_buffer, reserve.data());
427 size_type
reserve_size = numeric_limits<size_type>::max();
440 size_type
windex = etl::distance(p_buffer, reserve.data());
452 destroy(reader.begin(), reader.end());
492 template <
typename T, const
size_t Size, const
size_t Memory_Model = etl::memory_model::MEMORY_MODEL_LARGE>
493 class bip_buffer_spsc_atomic :
public ibip_buffer_spsc_atomic<T, Memory_Model>
501 typedef typename base_t::size_type size_type;
505 static ETL_CONSTANT size_type
Reserved_Size = size_type(Size);
511 static ETL_CONSTANT size_type MAX_SIZE = size_type(Size);
535 template <
typename T, const
size_t Size, const
size_t Memory_Model>
536 ETL_CONSTANT
typename bip_buffer_spsc_atomic<T, Size, Memory_Model>::size_type bip_buffer_spsc_atomic<T, Size, Memory_Model>::Reserved_Size;
Definition integral_limits.h:516
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:395
etl::optional< T > read(etl::bit_stream_reader &stream)
Read a checked type from a stream.
Definition bit_stream.h:1377
ETL_CONSTEXPR TContainer::size_type size(const TContainer &container)
Definition iterator.h:1187
void destroy(const T *const p)
Destroys the object.
Definition variant_pool_generator.h:370
bool write(etl::bit_stream_writer &stream, bool value)
Definition bit_stream.h:995
pair holds two objects of arbitrary type
Definition utility.h:164
ETL_CONSTEXPR pair()
Default constructor.
Definition utility.h:176
Definition memory_model.h:50