31#ifndef ETL_QUEUE_LOCKABLE_INCLUDED
32#define ETL_QUEUE_LOCKABLE_INCLUDED
54 queue_lockable_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
55 :
exception(reason_, file_name_, line_number_)
64 class queue_lockable_empty :
public queue_lockable_exception
68 queue_lockable_empty(string_type file_name_, numeric_type line_number_)
69 : queue_lockable_exception(ETL_ERROR_TEXT(
"queue_lockable:empty", ETL_QUEUE_SPSC_LOCKABLE_FILE_ID
"A"), file_name_, line_number_)
74 template <
size_t VMemory_Model = etl::memory_model::MEMORY_MODEL_LARGE>
75 class queue_lockable_base
93 return available_implementation();
103 size_type result = available_implementation();
116 return empty_implementation();
126 size_type result = empty_implementation();
139 return full_implementation();
149 size_type result = full_implementation();
162 return size_implementation();
172 size_type result = size_implementation();
201 , Max_Size(max_size_)
212 if (index == maximum) ETL_UNLIKELY
224 virtual void unlock()
const = 0;
236 size_type available_implementation()
const
244 bool empty_implementation()
const
252 bool full_implementation()
const
273 template <
typename T, const
size_t VMemory_Model = etl::memory_model::MEMORY_MODEL_LARGE>
278 typedef queue_lockable_base<VMemory_Model> base_t;
286 typedef T&& rvalue_reference;
295 return push_implementation(value);
305 bool result = push_implementation(value);
312#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_QUEUE_LOCKABLE_FORCE_CPP03_IMPLEMENTATION)
318 return push_implementation(value);
324 bool push(rvalue_reference value)
328 bool result = push_implementation(etl::move(value));
336#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_QUEUE_LOCKABLE_FORCE_CPP03_IMPLEMENTATION)
340 template <
typename... Args>
343 return emplace_implementation(etl::forward<Args>(args)...);
349 template <
typename... Args>
354 bool result = emplace_implementation(etl::forward<Args>(args)...);
364 template <
typename T1>
367 return emplace_implementation(value1);
373 template <
typename T1,
typename T2>
376 return emplace_implementation(value1, value2);
382 template <
typename T1,
typename T2,
typename T3>
385 return emplace_implementation(value1, value2, value3);
391 template <
typename T1,
typename T2,
typename T3,
typename T4>
392 bool emplace_unlocked(
const T1& value1,
const T2& value2,
const T3& value3,
const T4& value4)
394 return emplace_implementation(value1, value2, value3, value4);
404 bool result = emplace_implementation();
414 template <
typename T1>
419 bool result = emplace_implementation(value1);
429 template <
typename T1,
typename T2>
430 bool emplace(
const T1& value1,
const T2& value2)
434 bool result = emplace_implementation(value1, value2);
444 template <
typename T1,
typename T2,
typename T3>
445 bool emplace(
const T1& value1,
const T2& value2,
const T3& value3)
449 bool result = emplace_implementation(value1, value2, value3);
459 template <
typename T1,
typename T2,
typename T3,
typename T4>
460 bool emplace(
const T1& value1,
const T2& value2,
const T3& value3,
const T4& value4)
464 bool result = emplace_implementation(value1, value2, value3, value4);
477 return pop_implementation();
487 bool result = pop_implementation();
499 return pop_implementation(value);
509 bool result = pop_implementation(value);
524 return front_implementation();
535 return front_implementation();
545#if ETL_CHECKING_EXTRA
549 reference inner_result = front_implementation();
562 reference result = front_implementation();
574#if ETL_CHECKING_EXTRA
578 const_reference inner_result = front_implementation();
591 const_reference result = front_implementation();
601 while (pop_implementation())
614 if ETL_IF_CONSTEXPR (etl::is_trivially_destructible<T>::value)
616 this->write_index = 0;
617 this->read_index = 0;
618 this->current_size = 0;
622 while (pop_implementation())
638 , p_buffer(p_buffer_)
649 if (this->current_size != this->Max_Size)
651 ::new (&p_buffer[this->write_index]) T(value);
653 this->write_index = this->
get_next_index(this->write_index, this->Max_Size);
655 ++this->current_size;
664#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_QUEUE_LOCKABLE_FORCE_CPP03_IMPLEMENTATION)
668 bool push_implementation(rvalue_reference value)
672 ::new (&p_buffer[this->
write_index]) T(etl::move(value));
686#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_QUEUE_LOCKABLE_FORCE_CPP03_IMPLEMENTATION)
690 template <
typename... Args>
691 bool emplace_implementation(Args&&... args)
695 ::new (&p_buffer[this->
write_index]) T(etl::forward<Args>(args)...);
711 template <
typename T1>
712 bool emplace_implementation(
const T1& value1)
732 template <
typename T1,
typename T2>
733 bool emplace_implementation(
const T1& value1,
const T2& value2)
737 ::new (&p_buffer[this->
write_index]) T(value1, value2);
753 template <
typename T1,
typename T2,
typename T3>
754 bool emplace_implementation(
const T1& value1,
const T2& value2,
const T3& value3)
758 ::new (&p_buffer[this->
write_index]) T(value1, value2, value3);
774 template <
typename T1,
typename T2,
typename T3,
typename T4>
775 bool emplace_implementation(
const T1& value1,
const T2& value2,
const T3& value3,
const T4& value4)
779 ::new (&p_buffer[this->
write_index]) T(value1, value2, value3, value4);
796 bool pop_implementation()
824#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_QUEUE_LOCKABLE_FORCE_CPP03_IMPLEMENTATION)
825 value = etl::move(p_buffer[this->
read_index]);
875 template <
typename T,
size_t VSize,
size_t VMemory_Model = etl::memory_model::MEMORY_MODEL_LARGE>
888 static ETL_CONSTANT size_type Max_Size =
size_type(VSize);
889 static ETL_CONSTANT size_type Memory_Model =
size_type(VMemory_Model);
896 : base_t(reinterpret_cast<T*>(buffer.raw), Max_Size)
925 template <
typename T,
size_t VSize,
size_t VMemory_Model>
928 template <
typename T,
size_t VSize,
size_t VMemory_Model>
This is the base for all queues that contain a particular type.
Definition queue_lockable.h:275
bool pop(reference value)
Pop a value from the queue.
Definition queue_lockable.h:505
reference front_unlocked()
Definition queue_lockable.h:521
bool pop_unlocked(reference value)
Pop a value from the queue without locking.
Definition queue_lockable.h:497
bool pop()
Pop a value from the queue and discard.
Definition queue_lockable.h:483
reference front()
Definition queue_lockable.h:543
bool emplace(const T1 &value1, const T2 &value2, const T3 &value3, const T4 &value4)
Constructs a value in the queue 'in place'.
Definition queue_lockable.h:460
bool emplace(const T1 &value1)
Constructs a value in the queue 'in place'.
Definition queue_lockable.h:415
void clear()
Clear the queue.
Definition queue_lockable.h:610
bool emplace_unlocked(const T1 &value1, const T2 &value2, const T3 &value3)
Constructs a value in the queue 'in place'.
Definition queue_lockable.h:383
const_reference front_unlocked() const
Definition queue_lockable.h:532
bool emplace_unlocked(const T1 &value1)
Constructs a value in the queue 'in place'.
Definition queue_lockable.h:365
bool push_unlocked(const_reference value)
Push a value to the queue without locking.
Definition queue_lockable.h:293
bool pop_unlocked()
Pop a value from the queue without locking, and discard.
Definition queue_lockable.h:475
bool emplace(const T1 &value1, const T2 &value2, const T3 &value3)
Constructs a value in the queue 'in place'.
Definition queue_lockable.h:445
bool emplace_unlocked(const T1 &value1, const T2 &value2)
Constructs a value in the queue 'in place'.
Definition queue_lockable.h:374
iqueue_lockable(T *p_buffer_, size_type max_size_)
The constructor that is called from derived classes.
Definition queue_lockable.h:636
bool emplace(const T1 &value1, const T2 &value2)
Constructs a value in the queue 'in place'.
Definition queue_lockable.h:430
base_t::size_type size_type
The type used for determining the size of the queue.
Definition queue_lockable.h:288
const_reference front() const
Definition queue_lockable.h:572
bool emplace()
Constructs a value in the queue 'in place'.
Definition queue_lockable.h:400
const T & const_reference
A const reference to the type used in the queue.
Definition queue_lockable.h:284
T value_type
The type stored in the queue.
Definition queue_lockable.h:282
bool emplace_unlocked(const T1 &value1, const T2 &value2, const T3 &value3, const T4 &value4)
Constructs a value in the queue 'in place'.
Definition queue_lockable.h:392
bool push(const_reference value)
Push a value to the queue.
Definition queue_lockable.h:301
void clear_unlocked()
Clear the queue, unlocked.
Definition queue_lockable.h:599
T & reference
A reference to the type used in the queue.
Definition queue_lockable.h:283
Definition queue_lockable.h:76
size_type size_unlocked() const
Definition queue_lockable.h:160
size_type capacity() const
How many items can the queue hold.
Definition queue_lockable.h:182
size_type max_size() const
How many items can the queue hold.
Definition queue_lockable.h:190
bool empty() const
Is the queue empty?
Definition queue_lockable.h:122
bool empty_unlocked() const
Definition queue_lockable.h:114
const size_type Max_Size
Definition queue_lockable.h:229
size_type read_index
Where to get the oldest data.
Definition queue_lockable.h:227
size_type current_size
The current size of the queue.
Definition queue_lockable.h:228
size_type available_unlocked() const
Definition queue_lockable.h:91
etl::size_type_lookup< VMemory_Model >::type size_type
The type used for determining the size of queue.
Definition queue_lockable.h:80
size_type write_index
Where to input new data.
Definition queue_lockable.h:226
static size_type get_next_index(size_type index, size_type maximum)
Calculate the next index.
Definition queue_lockable.h:208
size_type size() const
How many items in the queue?
Definition queue_lockable.h:168
virtual void lock() const =0
The pure virtual lock and unlock functions.
bool full_unlocked() const
Definition queue_lockable.h:137
size_type available() const
How much free space available in the queue.
Definition queue_lockable.h:99
bool full() const
Is the queue full?
Definition queue_lockable.h:145
virtual ~queue_lockable_base()
Destructor.
Definition queue_lockable.h:85
Definition queue_lockable.h:877
~queue_lockable()
Destructor.
Definition queue_lockable.h:903
queue_lockable()
Default constructor.
Definition queue_lockable.h:895
ETL_EXCEPTION_CONSTEXPR exception(string_type reason_, string_type, numeric_type)
Constructor.
Definition exception.h:81
Definition integral_limits.h:517
Definition queue_lockable.h:65
Definition memory_model.h:50