31 #ifndef ETL_MPMC_QUEUE_MUTEX_INCLUDED
32 #define ETL_MPMC_QUEUE_MUTEX_INCLUDED
54 template <const
size_t MEMORY_MODEL = etl::memory_model::MEMORY_MODEL_LARGE>
55 class queue_mpmc_mutex_base
65 size_type capacity()
const
73 size_type max_size()
const
80 queue_mpmc_mutex_base(size_type max_size_)
91 static size_type get_next_index(size_type index, size_type maximum)
103 size_type write_index;
104 size_type read_index;
105 size_type current_size;
106 const size_type MAX_SIZE;
111 #if defined(ETL_POLYMORPHIC_MPMC_QUEUE_MUTEX) || defined(ETL_POLYMORPHIC_CONTAINERS)
113 virtual ~queue_mpmc_mutex_base()
118 ~queue_mpmc_mutex_base()
135 template <
typename T, const
size_t MEMORY_MODEL = etl::memory_model::MEMORY_MODEL_LARGE>
136 class iqueue_mpmc_mutex :
public queue_mpmc_mutex_base<MEMORY_MODEL>
140 typedef etl::queue_mpmc_mutex_base<MEMORY_MODEL> base_t;
144 typedef T value_type;
145 typedef T& reference;
146 typedef const T& const_reference;
147 #if ETL_CPP11_SUPPORTED
148 typedef T&& rvalue_reference;
150 typedef typename base_t::size_type size_type;
152 using base_t::write_index;
153 using base_t::read_index;
154 using base_t::current_size;
155 using base_t::MAX_SIZE;
156 using base_t::get_next_index;
161 bool push(const_reference value)
165 bool result = push_implementation(value);
172 #if ETL_CPP11_SUPPORTED
176 bool push(rvalue_reference value)
180 bool result = push_implementation(etl::move(value));
188 #if ETL_CPP11_SUPPORTED && ETL_NOT_USING_STLPORT && !defined(ETL_QUEUE_MPMC_MUTEX_FORCE_CPP03)
193 template <
typename ... Args>
194 bool emplace(Args&&... args)
198 bool result = emplace_implementation(etl::forward<Args>(args)...);
209 template <
typename T1>
210 bool emplace(
const T1& value1)
214 bool result = emplace_implementation(value1);
225 template <
typename T1,
typename T2>
226 bool emplace(
const T1& value1,
const T2& value2)
230 bool result = emplace_implementation(value1, value2);
241 template <
typename T1,
typename T2,
typename T3>
242 bool emplace(
const T1& value1,
const T2& value2,
const T3& value3)
246 bool result = emplace_implementation(value1, value2, value3);
257 template <
typename T1,
typename T2,
typename T3,
typename T4>
258 bool emplace(
const T1& value1,
const T2& value2,
const T3& value3,
const T4& value4)
262 bool result = emplace_implementation(value1, value2, value3, value4);
273 bool pop(reference value)
277 bool result = pop_implementation(value);
287 bool pop(rvalue_reference value)
291 bool result = pop_implementation(etl::move(value));
305 bool result = pop_implementation();
319 while (pop_implementation())
334 size_type result = (current_size == 0);
348 size_type result = (current_size == MAX_SIZE);
358 size_type size()
const
362 size_type result = current_size;
372 size_type available()
const
376 size_type result = MAX_SIZE - current_size;
388 iqueue_mpmc_mutex(T* p_buffer_, size_type max_size_)
399 bool push_implementation(const_reference value)
401 if (current_size != MAX_SIZE)
403 ::new (&p_buffer[write_index]) T(value);
405 write_index = get_next_index(write_index, MAX_SIZE);
416 #if ETL_CPP11_SUPPORTED
420 bool push_implementation(rvalue_reference value)
422 if (current_size != MAX_SIZE)
424 ::new (&p_buffer[write_index]) T(etl::move(value));
426 write_index = get_next_index(write_index, MAX_SIZE);
439 #if ETL_CPP11_SUPPORTED && ETL_NOT_USING_STLPORT && !defined(ETL_QUEUE_MPMC_MUTEX_FORCE_CPP03)
443 template <
typename ... Args>
444 bool emplace_implementation(Args&&... args)
446 if (current_size != MAX_SIZE)
448 ::new (&p_buffer[write_index]) T(etl::forward<Args>(args)...);
450 write_index = get_next_index(write_index, MAX_SIZE);
464 template <
typename T1>
465 bool emplace_implementation(
const T1& value1)
467 if (current_size != MAX_SIZE)
469 ::new (&p_buffer[write_index]) T(value1);
471 write_index = get_next_index(write_index, MAX_SIZE);
485 template <
typename T1,
typename T2>
486 bool emplace_implementation(
const T1& value1,
const T2& value2)
488 if (current_size != MAX_SIZE)
490 ::new (&p_buffer[write_index]) T(value1, value2);
492 write_index = get_next_index(write_index, MAX_SIZE);
506 template <
typename T1,
typename T2,
typename T3>
507 bool emplace_implementation(
const T1& value1,
const T2& value2,
const T3& value3)
509 if (current_size != MAX_SIZE)
511 ::new (&p_buffer[write_index]) T(value1, value2, value3);
513 write_index = get_next_index(write_index, MAX_SIZE);
527 template <
typename T1,
typename T2,
typename T3,
typename T4>
528 bool emplace_implementation(
const T1& value1,
const T2& value2,
const T3& value3,
const T4& value4)
530 if (current_size != MAX_SIZE)
532 ::new (&p_buffer[write_index]) T(value1, value2, value3, value4);
534 write_index = get_next_index(write_index, MAX_SIZE);
549 bool pop_implementation(reference value)
551 if (current_size == 0)
557 value = p_buffer[read_index];
558 p_buffer[read_index].~T();
560 read_index = get_next_index(read_index, MAX_SIZE);
567 #if ETL_CPP11_SUPPORTED
571 bool pop_implementation(rvalue_reference value)
573 if (current_size == 0)
579 value = etl::move(p_buffer[read_index]);
580 p_buffer[read_index].~T();
582 read_index = get_next_index(read_index, MAX_SIZE);
593 bool pop_implementation()
595 if (current_size == 0)
601 p_buffer[read_index].~T();
603 read_index = get_next_index(read_index, MAX_SIZE);
611 iqueue_mpmc_mutex(
const iqueue_mpmc_mutex&);
612 iqueue_mpmc_mutex& operator =(
const iqueue_mpmc_mutex&);
627 template <
typename T,
size_t SIZE, const
size_t MEMORY_MODEL = etl::memory_model::MEMORY_MODEL_LARGE>
628 class queue_mpmc_mutex :
public etl::iqueue_mpmc_mutex<T, MEMORY_MODEL>
632 typedef etl::iqueue_mpmc_mutex<T, MEMORY_MODEL> base_t;
636 typedef typename base_t::size_type size_type;
640 static const size_type MAX_SIZE = size_type(SIZE);
646 : base_t(reinterpret_cast<T*>(&buffer[0]), MAX_SIZE)
660 queue_mpmc_mutex(
const queue_mpmc_mutex&) ETL_DELETE;
661 queue_mpmc_mutex& operator = (
const queue_mpmc_mutex&) ETL_DELETE;
663 #if ETL_CPP11_SUPPORTED
664 queue_mpmc_mutex(queue_mpmc_mutex&&) =
delete;
665 queue_mpmc_mutex& operator = (queue_mpmc_mutex&&) =
delete;
This mutex class is implemented using FreeRTOS's mutexes.
Definition: mutex_freertos.h:44
Definition: alignment.h:116
Definition: integral_limits.h:54
add_rvalue_reference
Definition: type_traits_generator.h:1348
Definition: absolute.h:37
Definition: memory_model.h:48