31#ifndef ETL_SPSC_QUEUE_ATOMIC_INCLUDED
32#define ETL_SPSC_QUEUE_ATOMIC_INCLUDED
50 template <
size_t MEMORY_MODEL = etl::memory_model::MEMORY_MODEL_LARGE>
51 class queue_spsc_atomic_base
65 return read.load(etl::memory_order_acquire) ==
write.load(etl::memory_order_acquire);
84 size_type
size()
const
86 size_type write_index =
write.load(etl::memory_order_acquire);
87 size_type read_index =
read.load(etl::memory_order_acquire);
91 if (write_index >= read_index)
93 n = write_index - read_index;
107 size_type available()
const
115 size_type capacity()
const
140 static size_type get_next_index(size_type index, size_type maximum)
144 if (index == maximum) ETL_UNLIKELY
161#if defined(ETL_POLYMORPHIC_SPSC_QUEUE_ATOMIC) || defined(ETL_POLYMORPHIC_CONTAINERS)
185 template <
typename T, const
size_t MEMORY_MODEL = etl::memory_model::MEMORY_MODEL_LARGE>
186 class iqueue_spsc_atomic :
public queue_spsc_atomic_base<MEMORY_MODEL>
194 typedef T value_type;
195 typedef T& reference;
196 typedef const T& const_reference;
200 typedef typename base_t::size_type size_type;
204 using base_t::RESERVED;
205 using base_t::get_next_index;
210 bool push(const_reference value)
212 size_type write_index =
write.load(etl::memory_order_relaxed);
217 ::new (&p_buffer[write_index])
T(value);
228#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_QUEUE_ATOMIC_FORCE_CPP03_IMPLEMENTATION)
234 size_type write_index =
write.load(etl::memory_order_relaxed);
239 ::new (&p_buffer[write_index])
T(etl::move(value));
251#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_QUEUE_ATOMIC_FORCE_CPP03_IMPLEMENTATION)
256 template <
typename ...
Args>
259 size_type write_index =
write.load(etl::memory_order_relaxed);
281 size_type write_index =
write.load(etl::memory_order_relaxed);
286 ::new (&p_buffer[write_index])
T();
301 template <
typename T1>
302 bool emplace(
const T1& value1)
304 size_type write_index =
write.load(etl::memory_order_relaxed);
309 ::new (&p_buffer[write_index])
T(value1);
324 template <
typename T1,
typename T2>
325 bool emplace(
const T1& value1,
const T2& value2)
327 size_type write_index =
write.load(etl::memory_order_relaxed);
332 ::new (&p_buffer[write_index])
T(value1, value2);
347 template <
typename T1,
typename T2,
typename T3>
348 bool emplace(
const T1& value1,
const T2& value2,
const T3& value3)
350 size_type write_index =
write.load(etl::memory_order_relaxed);
355 ::new (&p_buffer[write_index])
T(value1, value2, value3);
370 template <
typename T1,
typename T2,
typename T3,
typename T4>
371 bool emplace(
const T1& value1,
const T2& value2,
const T3& value3,
const T4& value4)
373 size_type write_index =
write.load(etl::memory_order_relaxed);
378 ::new (&p_buffer[write_index])
T(value1, value2, value3, value4);
393 bool front(reference value)
395 size_type read_index =
read.load(etl::memory_order_relaxed);
397 if (read_index ==
write.load(etl::memory_order_acquire))
403 value = p_buffer[read_index];
411 bool pop(reference value)
413 size_type read_index =
read.load(etl::memory_order_relaxed);
415 if (read_index ==
write.load(etl::memory_order_acquire))
423#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_QUEUE_LOCKABLE_FORCE_CPP03_IMPLEMENTATION)
424 value = etl::move(p_buffer[read_index]);
426 value = p_buffer[read_index];
429 p_buffer[read_index].~T();
441 size_type read_index =
read.load(etl::memory_order_relaxed);
443 if (read_index ==
write.load(etl::memory_order_acquire))
451 p_buffer[read_index].~T();
463 size_type read_index =
read.load(etl::memory_order_relaxed);
465 return p_buffer[read_index];
471 const_reference front()
const
473 size_type read_index =
read.load(etl::memory_order_relaxed);
475 return p_buffer[read_index];
524 template <
typename T,
size_t SIZE, const
size_t MEMORY_MODEL = etl::memory_model::MEMORY_MODEL_LARGE>
525 class queue_spsc_atomic :
public iqueue_spsc_atomic<T, MEMORY_MODEL>
533 typedef typename base_t::size_type size_type;
537 static ETL_CONSTANT size_type
RESERVED_SIZE = size_type(SIZE + 1);
543 static ETL_CONSTANT size_type MAX_SIZE = size_type(SIZE);
567 template <
typename T,
size_t SIZE, const
size_t MEMORY_MODEL>
568 ETL_CONSTANT
typename queue_spsc_atomic<T, SIZE, MEMORY_MODEL>::size_type queue_spsc_atomic<T, SIZE, MEMORY_MODEL>::MAX_SIZE;
Definition alignment.h:231
Definition integral_limits.h:516
add_rvalue_reference
Definition type_traits_generator.h:1327
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
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