Embedded Template Library 1.0
Loading...
Searching...
No Matches
queue_lockable.h
Go to the documentation of this file.
1
2
3/******************************************************************************
4The MIT License(MIT)
5
6Embedded Template Library.
7https://github.com/ETLCPP/etl
8https://www.etlcpp.com
9
10Copyright(c) 2019 John Wellbelove
11
12Permission is hereby granted, free of charge, to any person obtaining a copy
13of this software and associated documentation files(the "Software"), to deal
14in the Software without restriction, including without limitation the rights
15to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
16copies of the Software, and to permit persons to whom the Software is
17furnished to do so, subject to the following conditions :
18
19The above copyright notice and this permission notice shall be included in all
20copies or substantial portions of the Software.
21
22THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
25AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28SOFTWARE.
29******************************************************************************/
30
31#ifndef ETL_QUEUE_LOCKABLE_INCLUDED
32#define ETL_QUEUE_LOCKABLE_INCLUDED
33
34#include "platform.h"
35#include "function.h"
36#include "integral_limits.h"
37#include "memory.h"
38#include "memory_model.h"
39#include "mutex.h"
40#include "parameter_type.h"
41#include "placement_new.h"
42#include "utility.h"
43
44#include <stddef.h>
45#include <stdint.h>
46
47namespace etl
48{
49 //***************************************************************************
52 //***************************************************************************
53 class queue_lockable_exception : public exception
54 {
55 public:
56
57 queue_lockable_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
58 : exception(reason_, file_name_, line_number_)
59 {
60 }
61 };
62
63 //***************************************************************************
66 //***************************************************************************
67 class queue_lockable_empty : public queue_lockable_exception
68 {
69 public:
70
71 queue_lockable_empty(string_type file_name_, numeric_type line_number_)
72 : queue_lockable_exception(ETL_ERROR_TEXT("queue_lockable:empty", ETL_QUEUE_SPSC_LOCKABLE_FILE_ID"A"), file_name_, line_number_)
73 {
74 }
75 };
76
77 template <size_t VMemory_Model = etl::memory_model::MEMORY_MODEL_LARGE>
78 class queue_lockable_base
79 {
80 public:
81
84
85 //*************************************************************************
87 //*************************************************************************
89
90 //*************************************************************************
93 //*************************************************************************
95 {
96 return available_implementation();
97 }
98
99 //*************************************************************************
101 //*************************************************************************
103 {
104 this->lock();
105
106 size_type result = available_implementation();
107
108 this->unlock();
109
110 return result;
111 }
112
113 //*************************************************************************
116 //*************************************************************************
117 bool empty_unlocked() const
118 {
119 return empty_implementation();
120 }
121
122 //*************************************************************************
124 //*************************************************************************
125 bool empty() const
126 {
127 this->lock();
128
129 size_type result = empty_implementation();
130
131 this->unlock();
132
133 return result;
134 }
135
136 //*************************************************************************
139 //*************************************************************************
140 bool full_unlocked() const
141 {
142 return full_implementation();
143 }
144
145 //*************************************************************************
147 //*************************************************************************
148 bool full() const
149 {
150 this->lock();
151
152 size_type result = full_implementation();
153
154 this->unlock();
155
156 return result;
157 }
158
159 //*************************************************************************
162 //*************************************************************************
164 {
165 return size_implementation();
166 }
167
168 //*************************************************************************
170 //*************************************************************************
172 {
173 this->lock();
174
175 size_type result = size_implementation();
176
177 this->unlock();
178
179 return result;
180 }
181
182 //*************************************************************************
184 //*************************************************************************
186 {
187 return Max_Size;
188 }
189
190 //*************************************************************************
192 //*************************************************************************
194 {
195 return Max_Size;
196 }
197
198 protected:
199
201 : write_index(0)
202 , read_index(0)
203 , current_size(0)
204 , Max_Size(max_size_)
205 {
206 }
207
208 //*************************************************************************
210 //*************************************************************************
212 {
213 ++index;
214
215 if (index == maximum) ETL_UNLIKELY
216 {
217 index = 0;
218 }
219
220 return index;
221 }
222
223 //*************************************************************************
225 //*************************************************************************
226 virtual void lock() const = 0;
227 virtual void unlock() const = 0;
228
233
234 private:
235
236 //*************************************************************************
238 //*************************************************************************
239 size_type available_implementation() const
240 {
241 return Max_Size - current_size;
242 }
243
244 //*************************************************************************
246 //*************************************************************************
247 bool empty_implementation() const
248 {
249 return (current_size == 0);
250 }
251
252 //*************************************************************************
254 //*************************************************************************
255 bool full_implementation() const
256 {
257 return (current_size == Max_Size);
258 }
259
260 //*************************************************************************
262 //*************************************************************************
263 size_type size_implementation() const
264 {
265 return current_size;
266 }
267 };
268
269 //***************************************************************************
275 //***************************************************************************
276 template <typename T, const size_t VMemory_Model = etl::memory_model::MEMORY_MODEL_LARGE>
277 class iqueue_lockable : public etl::queue_lockable_base<VMemory_Model>
278 {
279 private:
280
281 typedef queue_lockable_base<VMemory_Model> base_t;
282
283 public:
284
285 typedef T value_type;
286 typedef T& reference;
287 typedef const T& const_reference;
288#if ETL_USING_CPP11
289 typedef T&& rvalue_reference;
290#endif
291 typedef typename base_t::size_type size_type;
292
293 //*************************************************************************
295 //*************************************************************************
297 {
298 return push_implementation(value);
299 }
300
301 //*************************************************************************
303 //*************************************************************************
305 {
306 this->lock();
307
308 bool result = push_implementation(value);
309
310 this->unlock();
311
312 return result;
313 }
314
315#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_QUEUE_LOCKABLE_FORCE_CPP03_IMPLEMENTATION)
316 //*************************************************************************
318 //*************************************************************************
319 bool push_unlocked(rvalue_reference value)
320 {
321 return push_implementation(value);
322 }
323
324 //*************************************************************************
326 //*************************************************************************
327 bool push(rvalue_reference value)
328 {
329 this->lock();
330
331 bool result = push_implementation(etl::move(value));
332
333 this->unlock();
334
335 return result;
336 }
337#endif
338
339#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_QUEUE_LOCKABLE_FORCE_CPP03_IMPLEMENTATION)
340 //*************************************************************************
342 //*************************************************************************
343 template <typename... Args>
344 bool emplace_unlocked(Args&&... args)
345 {
346 return emplace_implementation(etl::forward<Args>(args)...);
347 }
348
349 //*************************************************************************
351 //*************************************************************************
352 template <typename... Args>
353 bool emplace(Args&&... args)
354 {
355 this->lock();
356
357 bool result = emplace_implementation(etl::forward<Args>(args)...);
358
359 this->unlock();
360
361 return result;
362 }
363#else
364 //*************************************************************************
366 //*************************************************************************
367 template <typename T1>
368 bool emplace_unlocked(const T1& value1)
369 {
370 return emplace_implementation(value1);
371 }
372
373 //*************************************************************************
375 //*************************************************************************
376 template <typename T1, typename T2>
377 bool emplace_unlocked(const T1& value1, const T2& value2)
378 {
379 return emplace_implementation(value1, value2);
380 }
381
382 //*************************************************************************
384 //*************************************************************************
385 template <typename T1, typename T2, typename T3>
386 bool emplace_unlocked(const T1& value1, const T2& value2, const T3& value3)
387 {
388 return emplace_implementation(value1, value2, value3);
389 }
390
391 //*************************************************************************
393 //*************************************************************************
394 template <typename T1, typename T2, typename T3, typename T4>
395 bool emplace_unlocked(const T1& value1, const T2& value2, const T3& value3, const T4& value4)
396 {
397 return emplace_implementation(value1, value2, value3, value4);
398 }
399
400 //*************************************************************************
402 //*************************************************************************
403 bool emplace()
404 {
405 this->lock();
406
407 bool result = emplace_implementation();
408
409 this->unlock();
410
411 return result;
412 }
413
414 //*************************************************************************
416 //*************************************************************************
417 template <typename T1>
418 bool emplace(const T1& value1)
419 {
420 this->lock();
421
422 bool result = emplace_implementation(value1);
423
424 this->unlock();
425
426 return result;
427 }
428
429 //*************************************************************************
431 //*************************************************************************
432 template <typename T1, typename T2>
433 bool emplace(const T1& value1, const T2& value2)
434 {
435 this->lock();
436
437 bool result = emplace_implementation(value1, value2);
438
439 this->unlock();
440
441 return result;
442 }
443
444 //*************************************************************************
446 //*************************************************************************
447 template <typename T1, typename T2, typename T3>
448 bool emplace(const T1& value1, const T2& value2, const T3& value3)
449 {
450 this->lock();
451
452 bool result = emplace_implementation(value1, value2, value3);
453
454 this->unlock();
455
456 return result;
457 }
458
459 //*************************************************************************
461 //*************************************************************************
462 template <typename T1, typename T2, typename T3, typename T4>
463 bool emplace(const T1& value1, const T2& value2, const T3& value3, const T4& value4)
464 {
465 this->lock();
466
467 bool result = emplace_implementation(value1, value2, value3, value4);
468
469 this->unlock();
470
471 return result;
472 }
473#endif
474
475 //*************************************************************************
477 //*************************************************************************
479 {
480 return pop_implementation();
481 }
482
483 //*************************************************************************
485 //*************************************************************************
486 bool pop()
487 {
488 this->lock();
489
490 bool result = pop_implementation();
491
492 this->unlock();
493
494 return result;
495 }
496
497 //*************************************************************************
499 //*************************************************************************
501 {
502 return pop_implementation(value);
503 }
504
505 //*************************************************************************
507 //*************************************************************************
508 bool pop(reference value)
509 {
510 this->lock();
511
512 bool result = pop_implementation(value);
513
514 this->unlock();
515
516 return result;
517 }
518
519 //*************************************************************************
523 //*************************************************************************
525 {
526 ETL_ASSERT_CHECK_EXTRA(!this->empty_unlocked(), ETL_ERROR(queue_lockable_empty));
527 return front_implementation();
528 }
529
530 //*************************************************************************
534 //*************************************************************************
536 {
537 ETL_ASSERT_CHECK_EXTRA(!this->empty_unlocked(), ETL_ERROR(queue_lockable_empty));
538 return front_implementation();
539 }
540
541 //*************************************************************************
545 //*************************************************************************
547 {
548#if ETL_CHECKING_EXTRA
549 this->lock();
550 if (!this->empty_unlocked())
551 {
552 reference inner_result = front_implementation();
553 this->unlock();
554 return inner_result;
555 }
556 else
557 {
558 this->unlock();
559 ETL_ASSERT_FAIL(ETL_ERROR(queue_lockable_empty));
560 // fall through to return something to satisfy the compiler, even
561 // though this should never be reached due to undefined behaviour.
562 }
563#endif
564 this->lock();
565 reference result = front_implementation();
566 this->unlock();
567 return result;
568 }
569
570 //*************************************************************************
574 //*************************************************************************
576 {
577#if ETL_CHECKING_EXTRA
578 this->lock();
579 if (!this->empty_unlocked())
580 {
581 const_reference inner_result = front_implementation();
582 this->unlock();
583 return inner_result;
584 }
585 else
586 {
587 this->unlock();
588 ETL_ASSERT_FAIL(ETL_ERROR(queue_lockable_empty));
589 // fall through to return something to satisfy the compiler, even
590 // though this should never be reached due to undefined behaviour.
591 }
592#endif
593 this->lock();
594 const_reference result = front_implementation();
595 this->unlock();
596 return result;
597 }
598
599 //*************************************************************************
601 //*************************************************************************
603 {
604 while (pop_implementation())
605 {
606 // Do nothing.
607 }
608 }
609
610 //*************************************************************************
612 //*************************************************************************
613 void clear()
614 {
615 this->lock();
616
617 if ETL_IF_CONSTEXPR (etl::is_trivially_destructible<T>::value)
618 {
619 this->write_index = 0;
620 this->read_index = 0;
621 this->current_size = 0;
622 }
623 else
624 {
625 while (pop_implementation())
626 {
627 // Do nothing.
628 }
629 }
630
631 this->unlock();
632 }
633
634 protected:
635
636 //*************************************************************************
638 //*************************************************************************
639 iqueue_lockable(T* p_buffer_, size_type max_size_)
640 : base_t(max_size_)
641 , p_buffer(p_buffer_)
642 {
643 }
644
645 private:
646
647 //*************************************************************************
649 //*************************************************************************
650 bool push_implementation(const_reference value)
651 {
652 if (this->current_size != this->Max_Size)
653 {
654 ::new (&p_buffer[this->write_index]) T(value);
655
656 this->write_index = this->get_next_index(this->write_index, this->Max_Size);
657
658 ++this->current_size;
659
660 return true;
661 }
662
663 // Queue is full.
664 return false;
665 }
666
667#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_QUEUE_LOCKABLE_FORCE_CPP03_IMPLEMENTATION)
668 //*************************************************************************
670 //*************************************************************************
671 bool push_implementation(rvalue_reference value)
672 {
673 if (this->current_size != this->Max_Size)
674 {
675 ::new (&p_buffer[this->write_index]) T(etl::move(value));
676
677 this->write_index = this->get_next_index(this->write_index, this->Max_Size);
678
679 ++this->current_size;
680
681 return true;
682 }
683
684 // Queue is full.
685 return false;
686 }
687#endif
688
689#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_QUEUE_LOCKABLE_FORCE_CPP03_IMPLEMENTATION)
690 //*************************************************************************
692 //*************************************************************************
693 template <typename... Args>
694 bool emplace_implementation(Args&&... args)
695 {
696 if (this->current_size != this->Max_Size)
697 {
698 ::new (&p_buffer[this->write_index]) T(etl::forward<Args>(args)...);
699
700 this->write_index = this->get_next_index(this->write_index, this->Max_Size);
701
702 ++this->current_size;
703
704 return true;
705 }
706
707 // Queue is full.
708 return false;
709 }
710#else
711 //*************************************************************************
713 //*************************************************************************
714 template <typename T1>
715 bool emplace_implementation(const T1& value1)
716 {
717 if (this->current_size != this->Max_Size)
718 {
719 ::new (&p_buffer[this->write_index]) T(value1);
720
721 this->write_index = this->get_next_index(this->write_index, this->Max_Size);
722
723 ++this->current_size;
724
725 return true;
726 }
727
728 // Queue is full.
729 return false;
730 }
731
732 //*************************************************************************
734 //*************************************************************************
735 template <typename T1, typename T2>
736 bool emplace_implementation(const T1& value1, const T2& value2)
737 {
738 if (this->current_size != this->Max_Size)
739 {
740 ::new (&p_buffer[this->write_index]) T(value1, value2);
741
742 this->write_index = this->get_next_index(this->write_index, this->Max_Size);
743
744 ++this->current_size;
745
746 return true;
747 }
748
749 // Queue is full.
750 return false;
751 }
752
753 //*************************************************************************
755 //*************************************************************************
756 template <typename T1, typename T2, typename T3>
757 bool emplace_implementation(const T1& value1, const T2& value2, const T3& value3)
758 {
759 if (this->current_size != this->Max_Size)
760 {
761 ::new (&p_buffer[this->write_index]) T(value1, value2, value3);
762
763 this->write_index = this->get_next_index(this->write_index, this->Max_Size);
764
765 ++this->current_size;
766
767 return true;
768 }
769
770 // Queue is full.
771 return false;
772 }
773
774 //*************************************************************************
776 //*************************************************************************
777 template <typename T1, typename T2, typename T3, typename T4>
778 bool emplace_implementation(const T1& value1, const T2& value2, const T3& value3, const T4& value4)
779 {
780 if (this->current_size != this->Max_Size)
781 {
782 ::new (&p_buffer[this->write_index]) T(value1, value2, value3, value4);
783
784 this->write_index = this->get_next_index(this->write_index, this->Max_Size);
785
786 ++this->current_size;
787
788 return true;
789 }
790
791 // Queue is full.
792 return false;
793 }
794#endif
795
796 //*************************************************************************
798 //*************************************************************************
799 bool pop_implementation()
800 {
801 if (this->current_size == 0)
802 {
803 // Queue is empty
804 return false;
805 }
806
807 p_buffer[this->read_index].~T();
808
809 this->read_index = this->get_next_index(this->read_index, this->Max_Size);
810
811 --this->current_size;
812
813 return true;
814 }
815
816 //*************************************************************************
818 //*************************************************************************
819 bool pop_implementation(reference value)
820 {
821 if (this->current_size == 0)
822 {
823 // Queue is empty
824 return false;
825 }
826
827#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_QUEUE_LOCKABLE_FORCE_CPP03_IMPLEMENTATION)
828 value = etl::move(p_buffer[this->read_index]);
829#else
830 value = p_buffer[this->read_index];
831#endif
832
833 p_buffer[this->read_index].~T();
834
835 this->read_index = this->get_next_index(this->read_index, this->Max_Size);
836
837 --this->current_size;
838
839 return true;
840 }
841
842 //*************************************************************************
844 //*************************************************************************
845 reference front_implementation()
846 {
847 return p_buffer[this->read_index];
848 }
849
850 //*************************************************************************
852 //*************************************************************************
853 const_reference front_implementation() const
854 {
855 return p_buffer[this->read_index];
856 }
857
858 // Disable copy construction and assignment.
859 iqueue_lockable(const iqueue_lockable&) ETL_DELETE;
860 iqueue_lockable& operator=(const iqueue_lockable&) ETL_DELETE;
861
862#if ETL_USING_CPP11
864 iqueue_lockable& operator=(iqueue_lockable&&) = delete;
865#endif
866
867 T* p_buffer;
868 };
869
870 //***************************************************************************
877 //***************************************************************************
878 template <typename T, size_t VSize, size_t VMemory_Model = etl::memory_model::MEMORY_MODEL_LARGE>
879 class queue_lockable : public etl::iqueue_lockable<T, VMemory_Model>
880 {
881 private:
882
884
885 public:
886
887 typedef typename base_t::size_type size_type;
888
889 ETL_STATIC_ASSERT((VSize <= etl::integral_limits<size_type>::max), "Size too large for memory model");
890
891 static ETL_CONSTANT size_type Max_Size = size_type(VSize);
892 static ETL_CONSTANT size_type Memory_Model = size_type(VMemory_Model);
893
894 //*************************************************************************
896 //*************************************************************************
897
899 : base_t(reinterpret_cast<T*>(buffer.raw), Max_Size)
900 {
901 }
902
903 //*************************************************************************
905 //*************************************************************************
907 {
908 while (this->pop_unlocked())
909 {
910 // Do nothing.
911 }
912 }
913
914 private:
915
916 queue_lockable(const queue_lockable&) ETL_DELETE;
917 queue_lockable& operator=(const queue_lockable&) ETL_DELETE;
918
919#if ETL_USING_CPP11
920 queue_lockable(queue_lockable&&) = delete;
921 queue_lockable& operator=(queue_lockable&&) = delete;
922#endif
923
926 };
927
928 template <typename T, size_t VSize, size_t VMemory_Model>
930
931 template <typename T, size_t VSize, size_t VMemory_Model>
932 ETL_CONSTANT typename queue_lockable<T, VSize, VMemory_Model>::size_type queue_lockable<T, VSize, VMemory_Model>::Memory_Model;
933} // namespace etl
934
935#endif
This is the base for all queues that contain a particular type.
Definition queue_lockable.h:278
bool pop(reference value)
Pop a value from the queue.
Definition queue_lockable.h:508
reference front_unlocked()
Definition queue_lockable.h:524
bool pop_unlocked(reference value)
Pop a value from the queue without locking.
Definition queue_lockable.h:500
bool pop()
Pop a value from the queue and discard.
Definition queue_lockable.h:486
reference front()
Definition queue_lockable.h:546
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:463
bool emplace(const T1 &value1)
Constructs a value in the queue 'in place'.
Definition queue_lockable.h:418
void clear()
Clear the queue.
Definition queue_lockable.h:613
bool emplace_unlocked(const T1 &value1, const T2 &value2, const T3 &value3)
Constructs a value in the queue 'in place'.
Definition queue_lockable.h:386
const_reference front_unlocked() const
Definition queue_lockable.h:535
bool emplace_unlocked(const T1 &value1)
Constructs a value in the queue 'in place'.
Definition queue_lockable.h:368
bool push_unlocked(const_reference value)
Push a value to the queue without locking.
Definition queue_lockable.h:296
bool pop_unlocked()
Pop a value from the queue without locking, and discard.
Definition queue_lockable.h:478
bool emplace(const T1 &value1, const T2 &value2, const T3 &value3)
Constructs a value in the queue 'in place'.
Definition queue_lockable.h:448
bool emplace_unlocked(const T1 &value1, const T2 &value2)
Constructs a value in the queue 'in place'.
Definition queue_lockable.h:377
iqueue_lockable(T *p_buffer_, size_type max_size_)
The constructor that is called from derived classes.
Definition queue_lockable.h:639
bool emplace(const T1 &value1, const T2 &value2)
Constructs a value in the queue 'in place'.
Definition queue_lockable.h:433
base_t::size_type size_type
The type used for determining the size of the queue.
Definition queue_lockable.h:291
const_reference front() const
Definition queue_lockable.h:575
bool emplace()
Constructs a value in the queue 'in place'.
Definition queue_lockable.h:403
const T & const_reference
A const reference to the type used in the queue.
Definition queue_lockable.h:287
T value_type
The type stored in the queue.
Definition queue_lockable.h:285
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:395
bool push(const_reference value)
Push a value to the queue.
Definition queue_lockable.h:304
void clear_unlocked()
Clear the queue, unlocked.
Definition queue_lockable.h:602
T & reference
A reference to the type used in the queue.
Definition queue_lockable.h:286
Definition queue_lockable.h:79
size_type size_unlocked() const
Definition queue_lockable.h:163
size_type capacity() const
How many items can the queue hold.
Definition queue_lockable.h:185
size_type max_size() const
How many items can the queue hold.
Definition queue_lockable.h:193
bool empty() const
Is the queue empty?
Definition queue_lockable.h:125
bool empty_unlocked() const
Definition queue_lockable.h:117
const size_type Max_Size
Definition queue_lockable.h:232
size_type read_index
Where to get the oldest data.
Definition queue_lockable.h:230
size_type current_size
The current size of the queue.
Definition queue_lockable.h:231
size_type available_unlocked() const
Definition queue_lockable.h:94
etl::size_type_lookup< VMemory_Model >::type size_type
The type used for determining the size of queue.
Definition queue_lockable.h:83
size_type write_index
Where to input new data.
Definition queue_lockable.h:229
static size_type get_next_index(size_type index, size_type maximum)
Calculate the next index.
Definition queue_lockable.h:211
size_type size() const
How many items in the queue?
Definition queue_lockable.h:171
virtual void lock() const =0
The pure virtual lock and unlock functions.
bool full_unlocked() const
Definition queue_lockable.h:140
size_type available() const
How much free space available in the queue.
Definition queue_lockable.h:102
bool full() const
Is the queue full?
Definition queue_lockable.h:148
virtual ~queue_lockable_base()
Destructor.
Definition queue_lockable.h:88
Definition queue_lockable.h:880
~queue_lockable()
Destructor.
Definition queue_lockable.h:906
queue_lockable()
Default constructor.
Definition queue_lockable.h:898
Definition memory.h:2728
ETL_EXCEPTION_CONSTEXPR exception(string_type reason_, string_type, numeric_type)
Constructor.
Definition exception.h:81
Definition integral_limits.h:518
Definition queue_lockable.h:68
bitset_ext
Definition absolute.h:40
Definition memory_model.h:50