Embedded Template Library 1.0
Loading...
Searching...
No Matches
deque.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) 2014 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_DEQUE_INCLUDED
32#define ETL_DEQUE_INCLUDED
33
34#include "platform.h"
35#include "algorithm.h"
36#include "debug_count.h"
37#include "error_handler.h"
38#include "exception.h"
39#include "initializer_list.h"
40#include "iterator.h"
41#include "memory.h"
42#include "placement_new.h"
43#include "type_traits.h"
44#include "utility.h"
45
46#include <stddef.h>
47
48#include "private/minmax_push.h"
49
50//*****************************************************************************
54//*****************************************************************************
55
56namespace etl
57{
58 //***************************************************************************
61 //***************************************************************************
62 class deque_exception : public etl::exception
63 {
64 public:
65
66 deque_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
67 : exception(reason_, file_name_, line_number_)
68 {
69 }
70 };
71
72 //***************************************************************************
75 //***************************************************************************
76 class deque_full : public etl::deque_exception
77 {
78 public:
79
80 deque_full(string_type file_name_, numeric_type line_number_)
81 : etl::deque_exception(ETL_ERROR_TEXT("deque:full", ETL_DEQUE_FILE_ID"A"), file_name_, line_number_)
82 {
83 }
84 };
85
86 //***************************************************************************
89 //***************************************************************************
90 class deque_empty : public etl::deque_exception
91 {
92 public:
93
94 deque_empty(string_type file_name_, numeric_type line_number_)
95 : etl::deque_exception(ETL_ERROR_TEXT("deque:empty", ETL_DEQUE_FILE_ID"B"), file_name_, line_number_)
96 {
97 }
98 };
99
100 //***************************************************************************
103 //***************************************************************************
104 class deque_out_of_bounds : public etl::deque_exception
105 {
106 public:
107
108 deque_out_of_bounds(string_type file_name_, numeric_type line_number_)
109 : etl::deque_exception(ETL_ERROR_TEXT("deque:bounds", ETL_DEQUE_FILE_ID"C"), file_name_, line_number_)
110 {
111 }
112 };
113
114 //***************************************************************************
117 //***************************************************************************
118 class deque_incompatible_type : public deque_exception
119 {
120 public:
121
122 deque_incompatible_type(string_type file_name_, numeric_type line_number_)
123 : deque_exception(ETL_ERROR_TEXT("deque:type", ETL_DEQUE_FILE_ID"D"), file_name_, line_number_)
124 {
125 }
126 };
127
128 //***************************************************************************
131 //***************************************************************************
133 {
134 public:
135
136 typedef size_t size_type;
137
138 //*************************************************************************
141 //*************************************************************************
142 size_type size() const
143 {
144 return current_size;
145 }
146
147 //*************************************************************************
150 //*************************************************************************
151 bool empty() const
152 {
153 return (current_size == 0);
154 }
155
156 //*************************************************************************
159 //*************************************************************************
160 bool full() const
161 {
162 return current_size == CAPACITY;
163 }
164
165 //*************************************************************************
168 //*************************************************************************
169 size_type max_size() const
170 {
171 return CAPACITY;
172 }
173
174 //*************************************************************************
177 //*************************************************************************
178 size_type capacity() const
179 {
180 return CAPACITY;
181 }
182
183 //*************************************************************************
186 //*************************************************************************
187 size_t available() const
188 {
189 return max_size() - size();
190 }
191
192 protected:
193
194 //*************************************************************************
196 //*************************************************************************
197 deque_base(size_t max_size_, size_t buffer_size_)
198 : current_size(0)
199 , CAPACITY(max_size_)
200 , Buffer_Size(buffer_size_)
201 {
202 }
203
204 //*************************************************************************
206 //*************************************************************************
208
209 size_type current_size;
210 const size_type CAPACITY;
211 const size_type Buffer_Size;
213 };
214
215 //***************************************************************************
219 //***************************************************************************
220 template <typename T>
221 class ideque : public etl::deque_base
222 {
223 public:
224
225 typedef T value_type;
226 typedef size_t size_type;
227 typedef T& reference;
228 typedef const T& const_reference;
229#if ETL_USING_CPP11
230 typedef T&& rvalue_reference;
231#endif
232 typedef T* pointer;
233 typedef const T* const_pointer;
234 typedef typename etl::iterator_traits<pointer>::difference_type difference_type;
235
236 //*************************************************************************
238 //*************************************************************************
239 class iterator : public etl::iterator<ETL_OR_STD::random_access_iterator_tag, T>
240 {
241 public:
242
243 friend class ideque;
244 friend class const_iterator;
245
246 //***************************************************
247 iterator()
248 : index(0)
249 , p_deque(0)
250 , p_buffer(0)
251 {
252 }
253
254 //***************************************************
255 iterator(const iterator& other)
256 : index(other.index)
257 , p_deque(other.p_deque)
258 , p_buffer(other.p_buffer)
259 {
260 }
261
262 //***************************************************
263 iterator& operator=(const iterator& other)
264 {
265 index = other.index;
266 p_deque = other.p_deque;
267 p_buffer = other.p_buffer;
268
269 return *this;
270 }
271
272 //***************************************************
273 iterator& operator++()
274 {
275 index = (static_cast<size_t>(index) == p_deque->Buffer_Size - 1) ? 0 : index + 1;
276
277 return *this;
278 }
279
280 //***************************************************
281 iterator operator++(int)
282 {
283 iterator previous(*this);
284 index = (static_cast<size_t>(index) == p_deque->Buffer_Size - 1) ? 0 : index + 1;
285
286 return previous;
287 }
288
289 //***************************************************
290 iterator& operator+=(difference_type offset)
291 {
292 if (offset > 0)
293 {
294 index += offset;
295 index = (static_cast<size_t>(index) > p_deque->Buffer_Size - 1) ? index - static_cast<difference_type>(p_deque->Buffer_Size) : index;
296 }
297 else if (offset < 0)
298 {
299 operator-=(-offset);
300 }
301
302 return *this;
303 }
304
305 //***************************************************
306 iterator& operator-=(difference_type offset)
307 {
308 if (offset > 0)
309 {
310 index -= offset;
311 index = (index < 0) ? index + static_cast<difference_type>(p_deque->Buffer_Size) : index;
312 }
313 else if (offset < 0)
314 {
315 operator+=(-offset);
316 }
317
318 return *this;
319 }
320
321 //***************************************************
322 iterator& operator--()
323 {
324 index = (index == 0) ? static_cast<difference_type>(p_deque->Buffer_Size) - 1 : index - 1;
325
326 return *this;
327 }
328
329 //***************************************************
330 iterator operator--(int)
331 {
332 iterator previous(*this);
333 index = (index == 0) ? static_cast<difference_type>(p_deque->Buffer_Size) - 1 : index - 1;
334
335 return previous;
336 }
337
338 //***************************************************
339 reference operator*() const
340 {
341 return p_buffer[index];
342 }
343
344 //***************************************************
345 pointer operator->() const
346 {
347 return &p_buffer[index];
348 }
349
350 //***************************************************
351 reference operator[](size_t i)
352 {
353 iterator result(*this);
354 result += i;
355
356 return *result;
357 }
358
359 //***************************************************
360 const_reference operator[](size_t i) const
361 {
362 iterator result(*this);
363 result += i;
364
365 return *result;
366 }
367
368 //***************************************************
369 friend iterator operator+(const iterator& lhs, difference_type offset)
370 {
371 iterator result(lhs);
372 result += offset;
373 return result;
374 }
375
376 //***************************************************
377 friend iterator operator+(difference_type offset, const iterator& lhs)
378 {
379 iterator result(lhs);
380 result += offset;
381 return result;
382 }
383
384 //***************************************************
385 friend iterator operator-(const iterator& lhs, difference_type offset)
386 {
387 iterator result(lhs);
388 result -= offset;
389 return result;
390 }
391
392 //***************************************************
393 friend bool operator==(const iterator& lhs, const iterator& rhs)
394 {
395 return lhs.index == rhs.index;
396 }
397
398 //***************************************************
399 friend bool operator!=(const iterator& lhs, const iterator& rhs)
400 {
401 return !(lhs == rhs);
402 }
403
404 //***************************************************
405 friend bool operator<(const iterator& lhs, const iterator& rhs)
406 {
407 const difference_type lhs_index = lhs.get_index();
408 const difference_type rhs_index = rhs.get_index();
409 const difference_type reference_index = lhs.container().begin().get_index();
410 const difference_type buffer_size = static_cast<difference_type>(lhs.container().max_size() + 1);
411
412 const difference_type lhs_distance = (lhs_index < reference_index) ? buffer_size + lhs_index - reference_index : lhs_index - reference_index;
413 const difference_type rhs_distance = (rhs_index < reference_index) ? buffer_size + rhs_index - reference_index : rhs_index - reference_index;
414
415 return lhs_distance < rhs_distance;
416 }
417
418 //***************************************************
419 friend bool operator<=(const iterator& lhs, const iterator& rhs)
420 {
421 return !(lhs > rhs);
422 }
423
424 //***************************************************
425 friend bool operator>(const iterator& lhs, const iterator& rhs)
426 {
427 return (rhs < lhs);
428 }
429
430 //***************************************************
431 friend bool operator>=(const iterator& lhs, const iterator& rhs)
432 {
433 return !(lhs < rhs);
434 }
435
436 //***************************************************
437 difference_type get_index() const
438 {
439 return index;
440 }
441
442 //***************************************************
443 ideque& container() const
444 {
445 return *p_deque;
446 }
447
448 //***************************************************
449 pointer get_buffer() const
450 {
451 return p_buffer;
452 }
453
454 //***************************************************
455 void swap(iterator& other)
456 {
457 using ETL_OR_STD::swap; // Allow ADL
458
459 swap(index, other.index);
460 swap(p_deque, other.p_deque);
461 swap(p_buffer, other.p_buffer);
462 }
463
464 private:
465
466 //***************************************************
467 iterator(difference_type index_, ideque& the_deque, pointer p_buffer_)
468 : index(index_)
469 , p_deque(&the_deque)
470 , p_buffer(p_buffer_)
471 {
472 }
473
474 difference_type index;
475 ideque* p_deque;
476 pointer p_buffer;
477 };
478
479 //*************************************************************************
481 //*************************************************************************
482 class const_iterator : public etl::iterator<ETL_OR_STD::random_access_iterator_tag, const T>
483 {
484 public:
485
486 friend class ideque;
487
488 //***************************************************
489 const_iterator()
490 : index(0)
491 , p_deque(0)
492 , p_buffer(0)
493 {
494 }
495
496 //***************************************************
497 const_iterator(const const_iterator& other)
498 : index(other.index)
499 , p_deque(other.p_deque)
500 , p_buffer(other.p_buffer)
501 {
502 }
503
504 //***************************************************
505 const_iterator(const typename ideque::iterator& other)
506 : index(other.index)
507 , p_deque(other.p_deque)
508 , p_buffer(other.p_buffer)
509 {
510 }
511
512 //***************************************************
513 const_iterator& operator=(const const_iterator& other)
514 {
515 index = other.index;
516 p_deque = other.p_deque;
517 p_buffer = other.p_buffer;
518
519 return *this;
520 }
521
522 const_iterator& operator=(const typename ideque::iterator& other)
523 {
524 index = other.index;
525 p_deque = other.p_deque;
526 p_buffer = other.p_buffer;
527
528 return *this;
529 }
530
531 //***************************************************
532 const_iterator& operator++()
533 {
534 index = (static_cast<size_t>(index) == p_deque->Buffer_Size - 1) ? 0 : index + 1;
535
536 return *this;
537 }
538
539 //***************************************************
540 const_iterator operator++(int)
541 {
542 const_iterator previous(*this);
543 index = (static_cast<size_t>(index) == p_deque->Buffer_Size - 1) ? 0 : index + 1;
544
545 return previous;
546 }
547
548 //***************************************************
549 const_iterator& operator+=(difference_type offset)
550 {
551 if (offset > 0)
552 {
553 index += offset;
554 index = (static_cast<size_t>(index) > p_deque->Buffer_Size - 1) ? index - static_cast<difference_type>(p_deque->Buffer_Size) : index;
555 }
556 else if (offset < 0)
557 {
558 operator-=(-offset);
559 }
560
561 return *this;
562 }
563
564 //***************************************************
565 const_iterator& operator-=(difference_type offset)
566 {
567 if (offset > 0)
568 {
569 index -= offset;
570 index = (index < 0) ? index + static_cast<difference_type>(p_deque->Buffer_Size) : index;
571 }
572 else if (offset < 0)
573 {
574 operator+=(-offset);
575 }
576
577 return *this;
578 }
579
580 //***************************************************
581 const_iterator& operator--()
582 {
583 index = (index == 0) ? static_cast<difference_type>(p_deque->Buffer_Size) - 1 : index - 1;
584
585 return *this;
586 }
587
588 //***************************************************
589 const_iterator operator--(int)
590 {
591 const_iterator previous(*this);
592 index = (index == 0) ? static_cast<difference_type>(p_deque->Buffer_Size) - 1 : index - 1;
593
594 return previous;
595 }
596
597 //***************************************************
598 const_reference operator*() const
599 {
600 return p_buffer[index];
601 }
602
603 //***************************************************
604 const_pointer operator->() const
605 {
606 return &p_buffer[index];
607 }
608
609 //***************************************************
610 const_reference operator[](size_t i) const
611 {
612 const_iterator result(*this);
613 result += static_cast<difference_type>(i);
614
615 return *result;
616 }
617
618 //***************************************************
619 friend const_iterator operator+(const const_iterator& lhs, difference_type offset)
620 {
621 const_iterator result(lhs);
622 result += offset;
623 return result;
624 }
625
626 //***************************************************
627 friend const_iterator operator+(difference_type offset, const const_iterator& lhs)
628 {
629 const_iterator result(lhs);
630 result += offset;
631 return result;
632 }
633
634 //***************************************************
635 friend const_iterator operator-(const const_iterator& lhs, difference_type offset)
636 {
637 const_iterator result(lhs);
638 result -= offset;
639 return result;
640 }
641
642 //***************************************************
643 friend bool operator==(const const_iterator& lhs, const const_iterator& rhs)
644 {
645 return lhs.index == rhs.index;
646 }
647
648 //***************************************************
649 friend bool operator!=(const const_iterator& lhs, const const_iterator& rhs)
650 {
651 return !(lhs == rhs);
652 }
653
654 //***************************************************
655 friend bool operator<(const const_iterator& lhs, const const_iterator& rhs)
656 {
657 const difference_type lhs_index = lhs.get_index();
658 const difference_type rhs_index = rhs.get_index();
659 const difference_type reference_index = lhs.container().begin().get_index();
660 const difference_type buffer_size = static_cast<difference_type>(lhs.container().max_size() + 1UL);
661
662 const difference_type lhs_distance = (lhs_index < reference_index) ? buffer_size + lhs_index - reference_index : lhs_index - reference_index;
663 const difference_type rhs_distance = (rhs_index < reference_index) ? buffer_size + rhs_index - reference_index : rhs_index - reference_index;
664
665 return lhs_distance < rhs_distance;
666 }
667
668 //***************************************************
669 friend bool operator<=(const const_iterator& lhs, const const_iterator& rhs)
670 {
671 return !(lhs > rhs);
672 }
673
674 //***************************************************
675 friend bool operator>(const const_iterator& lhs, const const_iterator& rhs)
676 {
677 return (rhs < lhs);
678 }
679
680 //***************************************************
681 friend bool operator>=(const const_iterator& lhs, const const_iterator& rhs)
682 {
683 return !(lhs < rhs);
684 }
685
686 //***************************************************
687 difference_type get_index() const
688 {
689 return index;
690 }
691
692 //***************************************************
693 ideque& container() const
694 {
695 return *p_deque;
696 }
697
698 //***************************************************
699 pointer get_buffer() const
700 {
701 return p_buffer;
702 }
703
704 //***************************************************
705 void swap(const_iterator& other)
706 {
707 ETL_OR_STD::swap(index, other.index);
708 ETL_OR_STD::swap(p_deque, other.p_deque);
709 ETL_OR_STD::swap(p_buffer, other.p_buffer);
710 }
711
712 private:
713
714 //***************************************************
715 const_iterator(difference_type index_, ideque& the_deque, pointer p_buffer_)
716 : index(index_)
717 , p_deque(&the_deque)
718 , p_buffer(p_buffer_)
719 {
720 }
721
722 difference_type index;
723 ideque* p_deque;
724 pointer p_buffer;
725 };
726
727 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
728 typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
729
730 //*************************************************************************
732 //*************************************************************************
733 template <typename TIterator>
734 typename etl::enable_if<!etl::is_integral<TIterator>::value, void>::type assign(TIterator range_begin, TIterator range_end)
735 {
736 initialise();
737
738 while (range_begin != range_end)
739 {
740 push_back(*range_begin);
741 ++range_begin;
742 }
743 }
744
745 //*************************************************************************
751 //*************************************************************************
752 void assign(size_type n, const value_type& value)
753 {
754 ETL_ASSERT(n <= CAPACITY, ETL_ERROR(deque_full));
755
756 initialise();
757
758 while (n > 0)
759 {
760 create_element_back(value);
761 --n;
762 }
763 }
764
765 //*************************************************************************
770 //*************************************************************************
771 reference at(size_t index)
772 {
773 ETL_ASSERT(index < current_size, ETL_ERROR(deque_out_of_bounds));
774
775 iterator result(_begin);
776 result += static_cast<difference_type>(index);
777
778 return *result;
779 }
780
781 //*************************************************************************
786 //*************************************************************************
787 const_reference at(size_t index) const
788 {
789 ETL_ASSERT(index < current_size, ETL_ERROR(deque_out_of_bounds));
790
791 iterator result(_begin);
792 result += static_cast<difference_type>(index);
793
794 return *result;
795 }
796
797 //*************************************************************************
800 //*************************************************************************
801 reference operator[](size_t index)
802 {
803 iterator result(_begin);
804 result += static_cast<difference_type>(index);
805
806 return *result;
807 }
808
809 //*************************************************************************
812 //*************************************************************************
813 const_reference operator[](size_t index) const
814 {
815 iterator result(_begin);
816 result += static_cast<difference_type>(index);
817
818 return *result;
819 }
820
821 //*************************************************************************
826 //*************************************************************************
827 reference front()
828 {
829 ETL_ASSERT_CHECK_EXTRA(!empty(), ETL_ERROR(deque_empty));
830 return *_begin;
831 }
832
833 //*************************************************************************
838 //*************************************************************************
839 const_reference front() const
840 {
841 ETL_ASSERT_CHECK_EXTRA(!empty(), ETL_ERROR(deque_empty));
842 return *_begin;
843 }
844
845 //*************************************************************************
850 //*************************************************************************
851 reference back()
852 {
853 ETL_ASSERT_CHECK_EXTRA(!empty(), ETL_ERROR(deque_empty));
854 return *(_end - 1);
855 }
856
857 //*************************************************************************
862 //*************************************************************************
863 const_reference back() const
864 {
865 ETL_ASSERT_CHECK_EXTRA(!empty(), ETL_ERROR(deque_empty));
866 return *(_end - 1);
867 }
868
869 //*************************************************************************
871 //*************************************************************************
873 {
874 return _begin;
875 }
876
877 //*************************************************************************
879 //*************************************************************************
881 {
882 return _begin;
883 }
884
885 //*************************************************************************
887 //*************************************************************************
889 {
890 return _begin;
891 }
892
893 //*************************************************************************
895 //*************************************************************************
897 {
898 return iterator(_end);
899 }
900
901 //*************************************************************************
903 //*************************************************************************
905 {
906 return iterator(_end);
907 }
908
909 //*************************************************************************
911 //*************************************************************************
913 {
914 return const_iterator(_end);
915 }
916
917 //*************************************************************************
919 //*************************************************************************
920 reverse_iterator rbegin()
921 {
922 return reverse_iterator(end());
923 }
924
925 //*************************************************************************
927 //*************************************************************************
928 const_reverse_iterator rbegin() const
929 {
930 return const_reverse_iterator(end());
931 }
932
933 //*************************************************************************
935 //*************************************************************************
936 const_reverse_iterator crbegin() const
937 {
938 return const_reverse_iterator(cend());
939 }
940
941 //*************************************************************************
943 //*************************************************************************
944 reverse_iterator rend()
945 {
946 return reverse_iterator(begin());
947 }
948
949 //*************************************************************************
951 //*************************************************************************
952 const_reverse_iterator rend() const
953 {
954 return const_reverse_iterator(begin());
955 }
956
957 //*************************************************************************
959 //*************************************************************************
960 const_reverse_iterator crend() const
961 {
962 return const_reverse_iterator(cbegin());
963 }
964
965 //*************************************************************************
967 //*************************************************************************
968 void clear()
969 {
970 initialise();
971 }
972
973 //*************************************************************************
975 //*************************************************************************
976 void fill(const T& value)
977 {
978 etl::fill(begin(), end(), value);
979 }
980
981 //*************************************************************************
987 //*************************************************************************
988 iterator insert(const_iterator insert_position, const value_type& value)
989 {
990 iterator position(to_iterator(insert_position));
991
992 ETL_ASSERT(!full(), ETL_ERROR(deque_full));
993
994 if (insert_position == begin())
995 {
996 create_element_front(value);
997 position = _begin;
998 }
999 else if (insert_position == end())
1000 {
1001 create_element_back(value);
1002 position = _end - 1;
1003 }
1004 else
1005 {
1006 // Are we closer to the front?
1007 if (etl::distance(_begin, position) < etl::distance(position, _end - 1))
1008 {
1009 // Construct the _begin.
1010 create_element_front(*_begin);
1011
1012 // Move the values.
1013 etl::move(_begin + 1, position, _begin);
1014
1015 // Write the new value.
1016 *--position = value;
1017 }
1018 else
1019 {
1020 // Construct the _end.
1021 create_element_back(*(_end - 1));
1022
1023 // Move the values.
1024 etl::move_backward(position, _end - 2, _end - 1);
1025
1026 // Write the new value.
1027 *position = value;
1028 }
1029 }
1030
1031 return position;
1032 }
1033
1034#if ETL_USING_CPP11
1035 //*************************************************************************
1041 //*************************************************************************
1042 iterator insert(const_iterator insert_position, value_type&& value)
1043 {
1044 iterator position(insert_position.index, *this, p_buffer);
1045
1046 ETL_ASSERT(!full(), ETL_ERROR(deque_full));
1047
1048 if (insert_position == begin())
1049 {
1050 create_element_front(etl::move(value));
1051 position = _begin;
1052 }
1053 else if (insert_position == end())
1054 {
1055 create_element_back(etl::move(value));
1056 position = _end - 1;
1057 }
1058 else
1059 {
1060 // Are we closer to the front?
1061 if (etl::distance(_begin, position) < etl::distance(position, _end - 1))
1062 {
1063 // Construct the _begin.
1064 create_element_front(etl::move(*_begin));
1065
1066 // Move the values.
1067 etl::move(_begin + 1, position, _begin);
1068
1069 // Write the new value.
1070 *--position = etl::move(value);
1071 }
1072 else
1073 {
1074 // Construct the _end.
1075 create_element_back(etl::move(*(_end - 1)));
1076
1077 // Move the values.
1078 etl::move_backward(position, _end - 2, _end - 1);
1079
1080 // Write the new value.
1081 *position = etl::move(value);
1082 }
1083 }
1084
1085 return position;
1086 }
1087#endif
1088
1089 //*************************************************************************
1094 //*************************************************************************
1095#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT
1096 template <typename... Args>
1097 iterator emplace(const_iterator insert_position, Args&&... args)
1098 {
1099 iterator position(insert_position.index, *this, p_buffer);
1100
1101 ETL_ASSERT(!full(), ETL_ERROR(deque_full));
1102
1103 void* p;
1104
1105 if (insert_position == begin())
1106 {
1107 --_begin;
1108 p = etl::addressof(*_begin);
1109 ++current_size;
1110 ETL_INCREMENT_DEBUG_COUNT;
1111 position = _begin;
1112 }
1113 else if (insert_position == end())
1114 {
1115 p = etl::addressof(*_end);
1116 ++_end;
1117 ++current_size;
1118 ETL_INCREMENT_DEBUG_COUNT;
1119 position = _end - 1;
1120 }
1121 else
1122 {
1123 // Are we closer to the front?
1124 if (etl::distance(_begin, position) < etl::distance(position, _end - 1))
1125 {
1126 // Construct the _begin.
1127 create_element_front(*_begin);
1128
1129 // Move the values.
1130 etl::move(_begin + 1, position, _begin);
1131
1132 // Write the new value.
1133 --position;
1134 (*position).~T();
1135 p = etl::addressof(*position);
1136 }
1137 else
1138 {
1139 // Construct the _end.
1140 create_element_back(*(_end - 1));
1141
1142 // Move the values.
1143 etl::move_backward(position, _end - 2, _end - 1);
1144
1145 // Write the new value.
1146 (*position).~T();
1147 p = etl::addressof(*position);
1148 }
1149 }
1150
1151 ::new (p) T(etl::forward<Args>(args)...);
1152
1153 return position;
1154 }
1155
1156#else
1157
1158 //*************************************************************************
1163 //*************************************************************************
1164 template <typename T1>
1165 iterator emplace(const_iterator insert_position, const T1& value1)
1166 {
1167 iterator position(insert_position.index, *this, p_buffer);
1168
1169 ETL_ASSERT(!full(), ETL_ERROR(deque_full));
1170
1171 void* p;
1172
1173 if (insert_position == begin())
1174 {
1175 --_begin;
1176 p = etl::addressof(*_begin);
1177 ++current_size;
1178 ETL_INCREMENT_DEBUG_COUNT;
1179 position = _begin;
1180 }
1181 else if (insert_position == end())
1182 {
1183 p = etl::addressof(*_end);
1184 ++_end;
1185 ++current_size;
1186 ETL_INCREMENT_DEBUG_COUNT;
1187 position = _end - 1;
1188 }
1189 else
1190 {
1191 // Are we closer to the front?
1192 if (etl::distance(_begin, position) < etl::distance(position, _end - 1))
1193 {
1194 // Construct the _begin.
1195 create_element_front(*_begin);
1196
1197 // Move the values.
1198 etl::move(_begin + 1, position, _begin);
1199
1200 // Write the new value.
1201 --position;
1202 (*position).~T();
1203 p = etl::addressof(*position);
1204 }
1205 else
1206 {
1207 // Construct the _end.
1208 create_element_back(*(_end - 1));
1209
1210 // Move the values.
1211 etl::move_backward(position, _end - 2, _end - 1);
1212
1213 // Write the new value.
1214 (*position).~T();
1215 p = etl::addressof(*position);
1216 }
1217 }
1218
1219 ::new (p) T(value1);
1220
1221 return position;
1222 }
1223
1224 //*************************************************************************
1229 //*************************************************************************
1230 template <typename T1, typename T2>
1231 iterator emplace(const_iterator insert_position, const T1& value1, const T2& value2)
1232 {
1233 iterator position(insert_position.index, *this, p_buffer);
1234
1235 ETL_ASSERT(!full(), ETL_ERROR(deque_full));
1236
1237 void* p;
1238
1239 if (insert_position == begin())
1240 {
1241 --_begin;
1242 p = etl::addressof(*_begin);
1243 ++current_size;
1244 ETL_INCREMENT_DEBUG_COUNT;
1245 position = _begin;
1246 }
1247 else if (insert_position == end())
1248 {
1249 p = etl::addressof(*_end);
1250 ++_end;
1251 ++current_size;
1252 ETL_INCREMENT_DEBUG_COUNT;
1253 position = _end - 1;
1254 }
1255 else
1256 {
1257 // Are we closer to the front?
1258 if (etl::distance(_begin, position) < etl::distance(position, _end - 1))
1259 {
1260 // Construct the _begin.
1261 create_element_front(*_begin);
1262
1263 // Move the values.
1264 etl::move(_begin + 1, position, _begin);
1265
1266 // Write the new value.
1267 --position;
1268 (*position).~T();
1269 p = etl::addressof(*position);
1270 }
1271 else
1272 {
1273 // Construct the _end.
1274 create_element_back(*(_end - 1));
1275
1276 // Move the values.
1277 etl::move_backward(position, _end - 2, _end - 1);
1278
1279 // Write the new value.
1280 (*position).~T();
1281 p = etl::addressof(*position);
1282 }
1283 }
1284
1285 ::new (p) T(value1, value2);
1286
1287 return position;
1288 }
1289
1290 //*************************************************************************
1295 //*************************************************************************
1296 template <typename T1, typename T2, typename T3>
1297 iterator emplace(const_iterator insert_position, const T1& value1, const T2& value2, const T3& value3)
1298 {
1299 iterator position(insert_position.index, *this, p_buffer);
1300
1301 ETL_ASSERT(!full(), ETL_ERROR(deque_full));
1302
1303 void* p;
1304
1305 if (insert_position == begin())
1306 {
1307 --_begin;
1308 p = etl::addressof(*_begin);
1309 ++current_size;
1310 ETL_INCREMENT_DEBUG_COUNT;
1311 position = _begin;
1312 }
1313 else if (insert_position == end())
1314 {
1315 p = etl::addressof(*_end);
1316 ++_end;
1317 ++current_size;
1318 ETL_INCREMENT_DEBUG_COUNT;
1319 position = _end - 1;
1320 }
1321 else
1322 {
1323 // Are we closer to the front?
1324 if (etl::distance(_begin, position) < etl::distance(position, _end - 1))
1325 {
1326 // Construct the _begin.
1327 create_element_front(*_begin);
1328
1329 // Move the values.
1330 etl::move(_begin + 1, position, _begin);
1331
1332 // Write the new value.
1333 --position;
1334 (*position).~T();
1335 p = etl::addressof(*position);
1336 }
1337 else
1338 {
1339 // Construct the _end.
1340 create_element_back(*(_end - 1));
1341
1342 // Move the values.
1343 etl::move_backward(position, _end - 2, _end - 1);
1344
1345 // Write the new value.
1346 (*position).~T();
1347 p = etl::addressof(*position);
1348 }
1349 }
1350
1351 ::new (p) T(value1, value2, value3);
1352
1353 return position;
1354 }
1355
1356 //*************************************************************************
1361 //*************************************************************************
1362 template <typename T1, typename T2, typename T3, typename T4>
1363 iterator emplace(const_iterator insert_position, const T1& value1, const T2& value2, const T3& value3, const T4& value4)
1364 {
1365 iterator position(insert_position.index, *this, p_buffer);
1366
1367 ETL_ASSERT(!full(), ETL_ERROR(deque_full));
1368
1369 void* p;
1370
1371 if (insert_position == begin())
1372 {
1373 --_begin;
1374 p = etl::addressof(*_begin);
1375 ++current_size;
1376 ETL_INCREMENT_DEBUG_COUNT;
1377 position = _begin;
1378 }
1379 else if (insert_position == end())
1380 {
1381 p = etl::addressof(*_end);
1382 ++_end;
1383 ++current_size;
1384 ETL_INCREMENT_DEBUG_COUNT;
1385 position = _end - 1;
1386 }
1387 else
1388 {
1389 // Are we closer to the front?
1390 if (etl::distance(_begin, position) < etl::distance(position, _end - 1))
1391 {
1392 // Construct the _begin.
1393 create_element_front(*_begin);
1394
1395 // Move the values.
1396 etl::move(_begin + 1, position, _begin);
1397
1398 // Write the new value.
1399 --position;
1400 (*position).~T();
1401 p = etl::addressof(*position);
1402 }
1403 else
1404 {
1405 // Construct the _end.
1406 create_element_back(*(_end - 1));
1407
1408 // Move the values.
1409 etl::move_backward(position, _end - 2, _end - 1);
1410
1411 // Write the new value.
1412 (*position).~T();
1413 p = etl::addressof(*position);
1414 }
1415 }
1416
1417 ::new (p) T(value1, value2, value3, value4);
1418
1419 return position;
1420 }
1421#endif
1422
1423 //*************************************************************************
1430 //*************************************************************************
1431 iterator insert(const_iterator insert_position, size_type n, const value_type& value)
1432 {
1433 iterator position;
1434
1435 ETL_ASSERT((current_size + n) <= CAPACITY, ETL_ERROR(deque_full));
1436
1437 if (insert_position == begin())
1438 {
1439 for (size_t i = 0UL; i < n; ++i)
1440 {
1441 create_element_front(value);
1442 }
1443
1444 position = _begin;
1445 }
1446 else if (insert_position == end())
1447 {
1448 for (size_t i = 0UL; i < n; ++i)
1449 {
1450 create_element_back(value);
1451 }
1452
1453 position = _end - static_cast<difference_type>(n);
1454 }
1455 else
1456 {
1457 // Non-const insert iterator.
1458 position = iterator(insert_position.index, *this, p_buffer);
1459
1460 // Are we closer to the front?
1461 if (distance(_begin, insert_position) <= difference_type(current_size / 2))
1462 {
1463 size_t n_insert = n;
1464 size_t n_move = static_cast<size_t>(etl::distance(begin(), position));
1465 size_t n_create_copy = etl::min(n_insert, n_move);
1466 size_t n_create_new = (n_insert > n_create_copy) ? n_insert - n_create_copy : 0;
1467 size_t n_copy_new = (n_insert > n_create_new) ? n_insert - n_create_new : 0;
1468 size_t n_copy_old = n_move - n_create_copy;
1469
1470 // Remember the original start.
1471 iterator from = _begin + static_cast<difference_type>(n_create_copy) - 1;
1472 iterator to;
1473
1474 // Create new.
1475 for (size_t i = 0UL; i < n_create_new; ++i)
1476 {
1477 create_element_front(value);
1478 }
1479
1480 // Create copy.
1481 for (size_t i = 0UL; i < n_create_copy; ++i)
1482 {
1483 create_element_front(*from);
1484 --from;
1485 }
1486
1487 // Move old.
1488 from = position - static_cast<difference_type>(n_copy_old);
1489 to = _begin + static_cast<difference_type>(n_create_copy);
1490 etl::move(from, from + static_cast<difference_type>(n_copy_old), to);
1491
1492 // Copy new.
1493 to = position - static_cast<difference_type>(n_create_copy);
1494 etl::fill_n(to, n_copy_new, value);
1495
1496 position = _begin + static_cast<difference_type>(n_move);
1497 }
1498 else
1499 {
1500 size_t n_insert = n;
1501 size_t n_move = static_cast<size_t>(etl::distance(position, end()));
1502 size_t n_create_copy = etl::min(n_insert, n_move);
1503 size_t n_create_new = (n_insert > n_create_copy) ? n_insert - n_create_copy : 0;
1504 size_t n_copy_new = (n_insert > n_create_new) ? n_insert - n_create_new : 0;
1505 size_t n_copy_old = n_move - n_create_copy;
1506
1507 // Create new.
1508 for (size_t i = 0UL; i < n_create_new; ++i)
1509 {
1510 create_element_back(value);
1511 }
1512
1513 // Create copy.
1514 const_iterator from = position + static_cast<difference_type>(n_copy_old);
1515
1516 for (size_t i = 0UL; i < n_create_copy; ++i)
1517 {
1518 create_element_back(*from);
1519 ++from;
1520 }
1521
1522 // Move old.
1523 etl::move_backward(position, position + static_cast<difference_type>(n_copy_old),
1524 position + static_cast<difference_type>(n_insert + n_copy_old));
1525
1526 // Copy new.
1527 etl::fill_n(position, n_copy_new, value);
1528 }
1529 }
1530
1531 return position;
1532 }
1533
1534 //*************************************************************************
1541 //*************************************************************************
1542 template <typename TIterator>
1543 typename enable_if<!etl::is_integral<TIterator>::value, iterator>::type insert(const_iterator insert_position, TIterator range_begin,
1544 TIterator range_end)
1545 {
1546 iterator position;
1547
1548 difference_type n = etl::distance(range_begin, range_end);
1549
1550 ETL_ASSERT((current_size + static_cast<size_t>(n)) <= CAPACITY, ETL_ERROR(deque_full));
1551
1552 if (insert_position == begin())
1553 {
1554 create_element_front(static_cast<size_t>(n), range_begin);
1555
1556 position = _begin;
1557 }
1558 else if (insert_position == end())
1559 {
1560 for (difference_type i = 0; i < n; ++i)
1561 {
1562 create_element_back(*range_begin);
1563 ++range_begin;
1564 }
1565
1566 position = _end - n;
1567 }
1568 else
1569 {
1570 // Non-const insert iterator.
1571 position = iterator(insert_position.index, *this, p_buffer);
1572
1573 // Are we closer to the front?
1574 if (distance(_begin, insert_position) < difference_type(current_size / 2))
1575 {
1576 size_t n_insert = static_cast<size_t>(n);
1577 size_t n_move = static_cast<size_t>(etl::distance(begin(), position));
1578 size_t n_create_copy = etl::min(n_insert, n_move);
1579 size_t n_create_new = (n_insert > n_create_copy) ? n_insert - n_create_copy : 0;
1580 size_t n_copy_new = (n_insert > n_create_new) ? n_insert - n_create_new : 0;
1581 size_t n_copy_old = n_move - n_create_copy;
1582
1583 // Remember the original start.
1584 iterator from;
1585 iterator to;
1586
1587 // Create new.
1588 create_element_front(n_create_new, range_begin);
1589
1590 // Create copy.
1591 create_element_front(n_create_copy, _begin + static_cast<difference_type>(n_create_new));
1592
1593 // Move old.
1594 from = position - static_cast<difference_type>(n_copy_old);
1595 to = _begin + static_cast<difference_type>(n_create_copy);
1596 etl::move(from, from + static_cast<difference_type>(n_copy_old), to);
1597
1598 // Copy new.
1599 to = position - static_cast<difference_type>(n_create_copy);
1600 range_begin += static_cast<difference_type>(n_create_new);
1601 etl::copy(range_begin, range_begin + static_cast<difference_type>(n_copy_new), to);
1602
1603 position = _begin + static_cast<difference_type>(n_move);
1604 }
1605 else
1606 {
1607 size_t n_insert = static_cast<size_t>(n);
1608 size_t n_move = static_cast<size_t>(etl::distance(position, end()));
1609 size_t n_create_copy = etl::min(n_insert, n_move);
1610 size_t n_create_new = (n_insert > n_create_copy) ? n_insert - n_create_copy : 0;
1611 size_t n_copy_new = (n_insert > n_create_new) ? n_insert - n_create_new : 0;
1612 size_t n_copy_old = n_move - n_create_copy;
1613
1614 // Create new.
1615 TIterator item = range_begin + static_cast<difference_type>(n_insert - n_create_new);
1616 for (size_t i = 0UL; i < n_create_new; ++i)
1617 {
1618 create_element_back(*item);
1619 ++item;
1620 }
1621
1622 // Create copy.
1623 const_iterator from = position + static_cast<difference_type>(n_copy_old);
1624
1625 for (size_t i = 0UL; i < n_create_copy; ++i)
1626 {
1627 create_element_back(*from);
1628 ++from;
1629 }
1630
1631 // Move old.
1632 etl::move_backward(position, position + static_cast<difference_type>(n_copy_old),
1633 position + static_cast<difference_type>(n_insert + n_copy_old));
1634
1635 // Copy new.
1636 item = range_begin;
1637 etl::copy(item, item + static_cast<difference_type>(n_copy_new), position);
1638 }
1639 }
1640
1641 return position;
1642 }
1643
1644 //*************************************************************************
1649 //*************************************************************************
1651 {
1652 iterator position(to_iterator(erase_position));
1653 // iterator position(erase_position.index, *this, p_buffer);
1654
1655 ETL_ASSERT(distance(position) <= difference_type(current_size), ETL_ERROR(deque_out_of_bounds));
1656
1657 if (position == _begin)
1658 {
1659 destroy_element_front();
1660 position = begin();
1661 }
1662 else if (position == _end - 1)
1663 {
1664 destroy_element_back();
1665 position = end();
1666 }
1667 else
1668 {
1669 // Are we closer to the front?
1670 if (distance(_begin, position) < difference_type(current_size / 2))
1671 {
1672 etl::move_backward(_begin, position, position + 1);
1673 destroy_element_front();
1674 ++position;
1675 }
1676 else
1677 {
1678 etl::move(position + 1, _end, position);
1679 destroy_element_back();
1680 }
1681 }
1682
1683 return position;
1684 }
1685
1686 //*************************************************************************
1692 //*************************************************************************
1694 {
1695 iterator position(to_iterator(range_begin));
1696
1697 ETL_ASSERT((distance(range_begin) <= difference_type(current_size)) && (distance(range_end) <= difference_type(current_size)),
1698 ETL_ERROR(deque_out_of_bounds));
1699
1700 // How many to erase?
1701 size_t length = static_cast<size_t>(etl::distance(range_begin, range_end));
1702
1703 // At the beginning?
1704 if (position == _begin)
1705 {
1706 for (size_t i = 0UL; i < length; ++i)
1707 {
1708 destroy_element_front();
1709 }
1710
1711 position = begin();
1712 }
1713 // At the end?
1714 else if (position == _end - static_cast<difference_type>(length))
1715 {
1716 for (size_t i = 0UL; i < length; ++i)
1717 {
1718 destroy_element_back();
1719 }
1720
1721 position = end();
1722 }
1723 else
1724 {
1725 // Copy the smallest number of items.
1726 // Are we closer to the front?
1727 if (distance(_begin, position) < difference_type(current_size / 2))
1728 {
1729 // Move the items.
1730 etl::move_backward(_begin, position, position + static_cast<difference_type>(length));
1731
1732 for (size_t i = 0UL; i < length; ++i)
1733 {
1734 destroy_element_front();
1735 }
1736
1737 position += static_cast<difference_type>(length);
1738 }
1739 else
1740 // Must be closer to the back.
1741 {
1742 // Move the items.
1743 etl::move(position + static_cast<difference_type>(length), _end, position);
1744
1745 for (size_t i = 0UL; i < length; ++i)
1746 {
1747 destroy_element_back();
1748 }
1749 }
1750 }
1751
1752 return position;
1753 }
1754
1755 //*************************************************************************
1760 //*************************************************************************
1761 void push_back(const_reference item)
1762 {
1763 ETL_ASSERT_CHECK_PUSH_POP_OR_RETURN(!full(), ETL_ERROR(deque_full));
1764
1765 create_element_back(item);
1766 }
1767
1768#if ETL_USING_CPP11
1769 //*************************************************************************
1774 //*************************************************************************
1775 void push_back(rvalue_reference item)
1776 {
1777 ETL_ASSERT_CHECK_PUSH_POP_OR_RETURN(!full(), ETL_ERROR(deque_full));
1778
1779 create_element_back(etl::move(item));
1780 }
1781#endif
1782
1783#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT
1784 //*************************************************************************
1788 //*************************************************************************
1789 template <typename... Args>
1790 reference emplace_back(Args&&... args)
1791 {
1792 ETL_ASSERT_CHECK_PUSH_POP(!full(), ETL_ERROR(deque_full));
1793
1794 ::new (&(*_end)) T(etl::forward<Args>(args)...);
1795 ++_end;
1796 ++current_size;
1797 ETL_INCREMENT_DEBUG_COUNT;
1798 return back();
1799 }
1800
1801#else
1802
1803 //*************************************************************************
1807 //*************************************************************************
1808 reference emplace_back()
1809 {
1810 ETL_ASSERT_CHECK_PUSH_POP(!full(), ETL_ERROR(deque_full));
1811
1812 ::new (&(*_end)) T();
1813 ++_end;
1814 ++current_size;
1815 ETL_INCREMENT_DEBUG_COUNT;
1816 return back();
1817 }
1818
1819 //*************************************************************************
1823 //*************************************************************************
1824 template <typename T1>
1825 reference emplace_back(const T1& value1)
1826 {
1827 ETL_ASSERT_CHECK_PUSH_POP(!full(), ETL_ERROR(deque_full));
1828
1829 ::new (&(*_end)) T(value1);
1830 ++_end;
1831 ++current_size;
1832 ETL_INCREMENT_DEBUG_COUNT;
1833 return back();
1834 }
1835
1836 //*************************************************************************
1840 //*************************************************************************
1841 template <typename T1, typename T2>
1842 reference emplace_back(const T1& value1, const T2& value2)
1843 {
1844 ETL_ASSERT_CHECK_PUSH_POP(!full(), ETL_ERROR(deque_full));
1845
1846 ::new (&(*_end)) T(value1, value2);
1847 ++_end;
1848 ++current_size;
1849 ETL_INCREMENT_DEBUG_COUNT;
1850 return back();
1851 }
1852
1853 //*************************************************************************
1857 //*************************************************************************
1858 template <typename T1, typename T2, typename T3>
1859 reference emplace_back(const T1& value1, const T2& value2, const T3& value3)
1860 {
1861 ETL_ASSERT_CHECK_PUSH_POP(!full(), ETL_ERROR(deque_full));
1862
1863 ::new (&(*_end)) T(value1, value2, value3);
1864 ++_end;
1865 ++current_size;
1866 ETL_INCREMENT_DEBUG_COUNT;
1867 return back();
1868 }
1869
1870 //*************************************************************************
1874 //*************************************************************************
1875 template <typename T1, typename T2, typename T3, typename T4>
1876 reference emplace_back(const T1& value1, const T2& value2, const T3& value3, const T4& value4)
1877 {
1878 ETL_ASSERT_CHECK_PUSH_POP(!full(), ETL_ERROR(deque_full));
1879
1880 ::new (&(*_end)) T(value1, value2, value3, value4);
1881 ++_end;
1882 ++current_size;
1883 ETL_INCREMENT_DEBUG_COUNT;
1884 return back();
1885 }
1886#endif
1887
1888 //*************************************************************************
1890 //*************************************************************************
1892 {
1893 ETL_ASSERT_CHECK_PUSH_POP_OR_RETURN(!empty(), ETL_ERROR(deque_empty));
1894
1895 destroy_element_back();
1896 }
1897
1898 //*************************************************************************
1903 //*************************************************************************
1904 void push_front(const_reference item)
1905 {
1906 ETL_ASSERT_CHECK_PUSH_POP_OR_RETURN(!full(), ETL_ERROR(deque_full));
1907
1908 create_element_front(item);
1909 }
1910
1911#if ETL_USING_CPP11
1912 //*************************************************************************
1917 //*************************************************************************
1918 void push_front(rvalue_reference item)
1919 {
1920 ETL_ASSERT_CHECK_PUSH_POP_OR_RETURN(!full(), ETL_ERROR(deque_full));
1921
1922 create_element_front(etl::move(item));
1923 }
1924#endif
1925
1926#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT
1927 //*************************************************************************
1931 //*************************************************************************
1932 template <typename... Args>
1933 reference emplace_front(Args&&... args)
1934 {
1935 ETL_ASSERT_CHECK_PUSH_POP(!full(), ETL_ERROR(deque_full));
1936
1937 --_begin;
1938 ::new (&(*_begin)) T(etl::forward<Args>(args)...);
1939 ++current_size;
1940 ETL_INCREMENT_DEBUG_COUNT;
1941 return front();
1942 }
1943
1944#else
1945
1946 //*************************************************************************
1950 //*************************************************************************
1951 reference emplace_front()
1952 {
1953 ETL_ASSERT_CHECK_PUSH_POP(!full(), ETL_ERROR(deque_full));
1954
1955 --_begin;
1956 ::new (&(*_begin)) T();
1957 ++current_size;
1958 ETL_INCREMENT_DEBUG_COUNT;
1959 return front();
1960 }
1961
1962 //*************************************************************************
1966 //*************************************************************************
1967 template <typename T1>
1968 reference emplace_front(const T1& value1)
1969 {
1970 ETL_ASSERT_CHECK_PUSH_POP(!full(), ETL_ERROR(deque_full));
1971
1972 --_begin;
1973 ::new (&(*_begin)) T(value1);
1974 ++current_size;
1975 ETL_INCREMENT_DEBUG_COUNT;
1976 return front();
1977 }
1978
1979 //*************************************************************************
1983 //*************************************************************************
1984 template <typename T1, typename T2>
1985 reference emplace_front(const T1& value1, const T2& value2)
1986 {
1987 ETL_ASSERT_CHECK_PUSH_POP(!full(), ETL_ERROR(deque_full));
1988
1989 --_begin;
1990 ::new (&(*_begin)) T(value1, value2);
1991 ++current_size;
1992 ETL_INCREMENT_DEBUG_COUNT;
1993 return front();
1994 }
1995
1996 //*************************************************************************
2000 //*************************************************************************
2001 template <typename T1, typename T2, typename T3>
2002 reference emplace_front(const T1& value1, const T2& value2, const T3& value3)
2003 {
2004 ETL_ASSERT_CHECK_PUSH_POP(!full(), ETL_ERROR(deque_full));
2005
2006 --_begin;
2007 ::new (&(*_begin)) T(value1, value2, value3);
2008 ++current_size;
2009 ETL_INCREMENT_DEBUG_COUNT;
2010 return front();
2011 }
2012
2013 //*************************************************************************
2017 //*************************************************************************
2018 template <typename T1, typename T2, typename T3, typename T4>
2019 reference emplace_front(const T1& value1, const T2& value2, const T3& value3, const T4& value4)
2020 {
2021 ETL_ASSERT_CHECK_PUSH_POP(!full(), ETL_ERROR(deque_full));
2022
2023 --_begin;
2024 ::new (&(*_begin)) T(value1, value2, value3, value4);
2025 ++current_size;
2026 ETL_INCREMENT_DEBUG_COUNT;
2027 return front();
2028 }
2029#endif
2030
2031 //*************************************************************************
2033 //*************************************************************************
2035 {
2036 ETL_ASSERT_CHECK_PUSH_POP_OR_RETURN(!empty(), ETL_ERROR(deque_empty));
2037
2038 destroy_element_front();
2039 }
2040
2041 //*************************************************************************
2048 //*************************************************************************
2049 void resize(size_t new_size, const value_type& value = value_type())
2050 {
2051 ETL_ASSERT(new_size <= CAPACITY, ETL_ERROR(deque_full));
2052
2053 // Make it smaller?
2054 if (new_size < current_size)
2055 {
2056 while (current_size > new_size)
2057 {
2058 destroy_element_back();
2059 }
2060 }
2061 // Make it larger?
2062 else if (new_size > current_size)
2063 {
2064 size_t count = new_size - current_size;
2065
2066 for (size_t i = 0UL; i < count; ++i)
2067 {
2068 create_element_back(value);
2069 }
2070 }
2071 }
2072
2073 //*************************************************************************
2075 //*************************************************************************
2076 friend difference_type operator-(const iterator& lhs, const iterator& rhs)
2077 {
2078 return distance(rhs, lhs);
2079 }
2080
2081 //*************************************************************************
2083 //*************************************************************************
2084 friend difference_type operator-(const const_iterator& lhs, const const_iterator& rhs)
2085 {
2086 return distance(rhs, lhs);
2087 }
2088
2089 //*************************************************************************
2091 //*************************************************************************
2093 {
2094 if (&rhs != this)
2095 {
2096 assign(rhs.begin(), rhs.end());
2097 }
2098
2099 return *this;
2100 }
2101
2102#if ETL_USING_CPP11
2103 //*************************************************************************
2105 //*************************************************************************
2106 ideque& operator=(ideque&& rhs)
2107 {
2108 if (&rhs != this)
2109 {
2110 clear();
2111 iterator itr = rhs.begin();
2112 while (itr != rhs.end())
2113 {
2114 push_back(etl::move(*itr));
2115 ++itr;
2116 }
2117
2118 rhs.initialise();
2119 }
2120
2121 return *this;
2122 }
2123#endif
2124
2125#ifdef ETL_IDEQUE_REPAIR_ENABLE
2126 //*************************************************************************
2128 //*************************************************************************
2129 virtual void repair() = 0;
2130#endif
2131
2132 protected:
2133
2134 //*************************************************************************
2136 //*************************************************************************
2137 ideque(pointer p_buffer_, size_t max_size_, size_t buffer_size_)
2138 : deque_base(max_size_, buffer_size_)
2139 , p_buffer(p_buffer_)
2140 {
2141 }
2142
2143 //*********************************************************************
2145 //*********************************************************************
2147 {
2148 if ETL_IF_CONSTEXPR (etl::is_trivially_destructible<T>::value)
2149 {
2150 current_size = 0;
2151 ETL_RESET_DEBUG_COUNT;
2152 }
2153 else
2154 {
2155 while (current_size > 0)
2156 {
2157 destroy_element_back();
2158 }
2159 }
2160
2161 _begin = iterator(0, *this, p_buffer);
2162 _end = iterator(0, *this, p_buffer);
2163 }
2164
2165 //*************************************************************************
2167 //*************************************************************************
2168 void repair_buffer(pointer p_buffer_)
2169 {
2170 p_buffer = p_buffer_;
2171
2172 _begin = iterator(_begin.index, *this, p_buffer);
2173 _end = iterator(_end.index, *this, p_buffer);
2174 }
2175
2176 iterator _begin;
2178 pointer p_buffer;
2179
2180 private:
2181
2182 //*********************************************************************
2184 //*********************************************************************
2185 void create_element_front()
2186 {
2187 --_begin;
2188 ::new (&(*_begin)) T();
2189 ++current_size;
2190 ETL_INCREMENT_DEBUG_COUNT;
2191 }
2192
2193 //*********************************************************************
2195 //*********************************************************************
2196 template <typename TIterator>
2197 void create_element_front(size_t n, TIterator from)
2198 {
2199 if (n == 0)
2200 {
2201 return;
2202 }
2203
2204 _begin -= static_cast<difference_type>(n);
2205
2206 iterator item = _begin;
2207
2208 do {
2209 ::new (&(*item)) T(*from);
2210 ++item;
2211 ++from;
2212 ++current_size;
2213 ETL_INCREMENT_DEBUG_COUNT;
2214 } while (--n != 0);
2215 }
2216
2217 //*********************************************************************
2219 //*********************************************************************
2220 void create_element_back()
2221 {
2222 ::new (&(*_end)) T();
2223 ++_end;
2224 ++current_size;
2225 ETL_INCREMENT_DEBUG_COUNT;
2226 }
2227
2228 //*********************************************************************
2230 //*********************************************************************
2231 void create_element_front(const_reference value)
2232 {
2233 --_begin;
2234 ::new (&(*_begin)) T(value);
2235 ++current_size;
2236 ETL_INCREMENT_DEBUG_COUNT;
2237 }
2238
2239 //*********************************************************************
2241 //*********************************************************************
2242 void create_element_back(const_reference value)
2243 {
2244 ::new (&(*_end)) T(value);
2245 ++_end;
2246 ++current_size;
2247 ETL_INCREMENT_DEBUG_COUNT;
2248 }
2249
2250#if ETL_USING_CPP11
2251 //*********************************************************************
2253 //*********************************************************************
2254 void create_element_front(rvalue_reference value)
2255 {
2256 --_begin;
2257 ::new (&(*_begin)) T(etl::move(value));
2258 ++current_size;
2259 ETL_INCREMENT_DEBUG_COUNT;
2260 }
2261
2262 //*********************************************************************
2264 //*********************************************************************
2265 void create_element_back(rvalue_reference value)
2266 {
2267 ::new (&(*_end)) T(etl::move(value));
2268 ++_end;
2269 ++current_size;
2270 ETL_INCREMENT_DEBUG_COUNT;
2271 }
2272#endif
2273
2274 //*********************************************************************
2276 //*********************************************************************
2277 void destroy_element_front()
2278 {
2279 (*_begin).~T();
2280 --current_size;
2281 ETL_DECREMENT_DEBUG_COUNT;
2282 ++_begin;
2283 }
2284
2285 //*********************************************************************
2287 //*********************************************************************
2288 void destroy_element_back()
2289 {
2290 --_end;
2291 (*_end).~T();
2292 --current_size;
2293 ETL_DECREMENT_DEBUG_COUNT;
2294 }
2295
2296 //*************************************************************************
2298 //*************************************************************************
2299 template <typename TIterator1, typename TIterator2>
2300 static difference_type distance(const TIterator1& range_begin, const TIterator2& range_end)
2301 {
2302 difference_type distance1 = distance(range_begin);
2303 difference_type distance2 = distance(range_end);
2304
2305 return distance2 - distance1;
2306 }
2307
2308 //*************************************************************************
2311 //*************************************************************************
2312 template <typename TIterator>
2313 static difference_type distance(const TIterator& other)
2314 {
2315 const difference_type index = other.get_index();
2316 const difference_type reference_index = other.container()._begin.index;
2317 const difference_type buffer_size = static_cast<difference_type>(other.container().Buffer_Size);
2318
2319 if (index < reference_index)
2320 {
2321 return buffer_size + index - reference_index;
2322 }
2323 else
2324 {
2325 return index - reference_index;
2326 }
2327 }
2328
2329 //*************************************************************************
2331 //*************************************************************************
2332 iterator to_iterator(const_iterator itr) const
2333 {
2334 return iterator(itr.index, const_cast<ideque&>(*this), p_buffer);
2335 }
2336
2337 // Disable copy construction.
2338 ideque(const ideque&);
2339
2340 //*************************************************************************
2342 //*************************************************************************
2343#if defined(ETL_POLYMORPHIC_DEQUE) || defined(ETL_POLYMORPHIC_CONTAINERS) || defined(ETL_IDEQUE_REPAIR_ENABLE)
2344
2345 public:
2346
2347 virtual ~ideque() {}
2348#else
2349
2350 protected:
2351
2353#endif
2354 };
2355
2356 //***************************************************************************
2362 //***************************************************************************
2363 template <typename T, const size_t MAX_SIZE_>
2364 class deque : public etl::ideque<T>
2365 {
2366 public:
2367
2368 static ETL_CONSTANT size_t MAX_SIZE = MAX_SIZE_;
2369
2370 private:
2371
2372 static ETL_CONSTANT size_t Buffer_Size = MAX_SIZE + 1;
2373
2374 public:
2375
2376 typedef T value_type;
2377 typedef T* pointer;
2378 typedef const T* const_pointer;
2379 typedef T& reference;
2380 typedef const T& const_reference;
2381 typedef size_t size_type;
2382 typedef typename etl::iterator_traits<pointer>::difference_type difference_type;
2383
2384 //*************************************************************************
2386 //*************************************************************************
2388 : etl::ideque<T>(reinterpret_cast<T*>(buffer.raw), MAX_SIZE, Buffer_Size)
2389 {
2390 this->initialise();
2391 }
2392
2393 //*************************************************************************
2395 //*************************************************************************
2397 {
2398 this->initialise();
2399 }
2400
2401 //*************************************************************************
2403 //*************************************************************************
2404 deque(const deque& other)
2405 : etl::ideque<T>(reinterpret_cast<T*>(buffer.raw), MAX_SIZE, Buffer_Size)
2406 {
2407 if (this != &other)
2408 {
2409 this->assign(other.begin(), other.end());
2410 }
2411 }
2412
2413#if ETL_USING_CPP11
2414 //*************************************************************************
2416 //*************************************************************************
2417 deque(deque&& other)
2418 : etl::ideque<T>(reinterpret_cast<T*>(buffer.raw), MAX_SIZE, Buffer_Size)
2419 {
2420 if (this != &other)
2421 {
2422 this->initialise();
2423
2424 typename etl::ideque<T>::iterator itr = other.begin();
2425 while (itr != other.end())
2426 {
2427 this->push_back(etl::move(*itr));
2428 ++itr;
2429 }
2430 }
2431 }
2432#endif
2433
2434 //*************************************************************************
2436 //*************************************************************************
2437 template <typename TIterator>
2438 deque(TIterator begin_, TIterator end_, typename etl::enable_if<!etl::is_integral<TIterator>::value, int>::type = 0)
2439 : etl::ideque<T>(reinterpret_cast<T*>(buffer.raw), MAX_SIZE, Buffer_Size)
2440 {
2441 this->assign(begin_, end_);
2442 }
2443
2444 //*************************************************************************
2446 //*************************************************************************
2447 explicit deque(size_t n, const_reference value = value_type())
2448 : etl::ideque<T>(reinterpret_cast<T*>(buffer.raw), MAX_SIZE, Buffer_Size)
2449 {
2450 this->assign(n, value);
2451 }
2452
2453#if ETL_HAS_INITIALIZER_LIST
2454 //*************************************************************************
2456 //*************************************************************************
2457 deque(std::initializer_list<T> init)
2458 : ideque<T>(reinterpret_cast<T*>(buffer.raw), MAX_SIZE, Buffer_Size)
2459 {
2460 this->assign(init.begin(), init.end());
2461 }
2462#endif
2463
2464 //*************************************************************************
2466 //*************************************************************************
2467 deque& operator=(const deque& rhs)
2468 {
2469 if (&rhs != this)
2470 {
2471 this->assign(rhs.begin(), rhs.end());
2472 }
2473
2474 return *this;
2475 }
2476
2477#if ETL_USING_CPP11
2478 //*************************************************************************
2480 //*************************************************************************
2481 deque& operator=(deque&& rhs)
2482 {
2483 if (&rhs != this)
2484 {
2485 this->clear();
2486 typename etl::ideque<T>::iterator itr = rhs.begin();
2487 while (itr != rhs.end())
2488 {
2489 this->push_back(etl::move(*itr));
2490 ++itr;
2491 }
2492 }
2493
2494 return *this;
2495 }
2496#endif
2497
2498 //*************************************************************************
2500 //*************************************************************************
2501#ifdef ETL_IDEQUE_REPAIR_ENABLE
2502 virtual void repair() ETL_OVERRIDE
2503#else
2504 void repair()
2505#endif
2506 {
2507#if ETL_CPP11_TYPE_TRAITS_IS_TRIVIAL_SUPPORTED
2508 ETL_ASSERT(etl::is_trivially_copyable<T>::value, ETL_ERROR(etl::deque_incompatible_type));
2509#endif
2510
2511 etl::ideque<T>::repair_buffer(reinterpret_cast<T*>(buffer.raw));
2512 }
2513
2514 private:
2515
2518 };
2519
2520 template <typename T, const size_t MAX_SIZE_>
2521 ETL_CONSTANT size_t deque<T, MAX_SIZE_>::MAX_SIZE;
2522
2523 //*************************************************************************
2525 //*************************************************************************
2526#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
2527 template <typename... T>
2528 deque(T...) -> deque<typename etl::common_type_t<T...>, sizeof...(T)>;
2529#endif
2530
2531 //*************************************************************************
2533 //*************************************************************************
2534#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
2535 template <typename T, typename... TValues>
2536 constexpr auto make_deque(TValues&&... values) -> etl::deque<T, sizeof...(TValues)>
2537 {
2538 return {etl::forward<T>(values)...};
2539 }
2540#endif
2541
2542 //***************************************************************************
2548 //***************************************************************************
2549 template <typename T>
2550 bool operator==(const etl::ideque<T>& lhs, const etl::ideque<T>& rhs)
2551 {
2552 return (lhs.size() == rhs.size()) && etl::equal(lhs.begin(), lhs.end(), rhs.begin());
2553 }
2554
2555 //***************************************************************************
2561 //***************************************************************************
2562 template <typename T>
2563 bool operator!=(const etl::ideque<T>& lhs, const etl::ideque<T>& rhs)
2564 {
2565 return !(lhs == rhs);
2566 }
2567
2568 //***************************************************************************
2574 //***************************************************************************
2575 template <typename T>
2576 bool operator<(const etl::ideque<T>& lhs, const etl::ideque<T>& rhs)
2577 {
2578 return etl::lexicographical_compare(lhs.begin(), lhs.end(), rhs.begin(), rhs.end());
2579 }
2580
2581 //***************************************************************************
2588 //***************************************************************************
2589 template <typename T>
2590 bool operator<=(const etl::ideque<T>& lhs, const etl::ideque<T>& rhs)
2591 {
2592 return !(lhs > rhs);
2593 }
2594
2595 //***************************************************************************
2601 //***************************************************************************
2602 template <typename T>
2603 bool operator>(const etl::ideque<T>& lhs, const etl::ideque<T>& rhs)
2604 {
2605 return (rhs < lhs);
2606 }
2607
2608 //***************************************************************************
2615 //***************************************************************************
2616 template <typename T>
2617 bool operator>=(const etl::ideque<T>& lhs, const etl::ideque<T>& rhs)
2618 {
2619 return !(lhs < rhs);
2620 }
2621} // namespace etl
2622
2623#include "private/minmax_pop.h"
2624
2625#endif
void swap(etl::array_view< T > &lhs, etl::array_view< T > &rhs) ETL_NOEXCEPT
Swaps the values.
Definition array_view.h:692
Const Iterator.
Definition deque.h:483
Iterator.
Definition deque.h:240
Definition memory.h:3153
reference emplace_front(const T1 &value1)
Definition deque.h:1968
reference emplace_back(const T1 &value1, const T2 &value2, const T3 &value3)
Definition deque.h:1859
const_reverse_iterator crbegin() const
Gets a const reverse iterator to the end of the deque.
Definition deque.h:936
void clear()
Clears the deque.
Definition deque.h:968
iterator erase(const_iterator erase_position)
Definition deque.h:1650
const size_type CAPACITY
The maximum number of elements in the deque.
Definition deque.h:210
void pop_back()
Removes the oldest item from the deque.
Definition deque.h:1891
ideque & operator=(const ideque &rhs)
Assignment operator.
Definition deque.h:2092
const_reverse_iterator rbegin() const
Gets a const reverse iterator to the end of the deque.
Definition deque.h:928
ETL_DECLARE_DEBUG_COUNT
Internal debugging.
Definition deque.h:212
void resize(size_t new_size, const value_type &value=value_type())
Definition deque.h:2049
iterator emplace(const_iterator insert_position, const T1 &value1, const T2 &value2, const T3 &value3, const T4 &value4)
Definition deque.h:1363
iterator begin()
Gets an iterator to the beginning of the deque.
Definition deque.h:872
reference front()
Definition deque.h:827
reference at(size_t index)
Definition deque.h:771
reference emplace_back(const T1 &value1, const T2 &value2)
Definition deque.h:1842
pointer p_buffer
Iterator to the _end item in the deque.
Definition deque.h:2178
friend difference_type operator-(const iterator &lhs, const iterator &rhs)
Definition deque.h:2076
reference emplace_front(const T1 &value1, const T2 &value2, const T3 &value3, const T4 &value4)
Definition deque.h:2019
reference emplace_front()
Definition deque.h:1951
etl::enable_if<!etl::is_integral< TIterator >::value, void >::type assign(TIterator range_begin, TIterator range_end)
Assigns a range to the deque.
Definition deque.h:734
void initialise()
Initialise the deque.
Definition deque.h:2146
reference operator[](size_t index)
Definition deque.h:801
~deque_base()
Destructor.
Definition deque.h:207
iterator _end
Iterator to the _begin item in the deque.
Definition deque.h:2177
reference emplace_front(const T1 &value1, const T2 &value2, const T3 &value3)
Definition deque.h:2002
size_type size() const
Definition deque.h:142
const_reference at(size_t index) const
Definition deque.h:787
const_reverse_iterator crend() const
Gets a const reverse iterator to the beginning of the deque.
Definition deque.h:960
const size_type Buffer_Size
The number of elements in the buffer.
Definition deque.h:211
iterator end()
Gets an iterator to the end of the deque.
Definition deque.h:896
const_iterator end() const
Gets a const iterator to the end of the deque.
Definition deque.h:904
void push_front(const_reference item)
Definition deque.h:1904
size_type max_size() const
Definition deque.h:169
~ideque()
Destructor.
Definition deque.h:2352
iterator erase(const_iterator range_begin, const_iterator range_end)
Definition deque.h:1693
iterator emplace(const_iterator insert_position, const T1 &value1)
Definition deque.h:1165
deque(const deque &other)
Copy constructor.
Definition deque.h:2404
friend difference_type operator-(const const_iterator &lhs, const const_iterator &rhs)
Definition deque.h:2084
iterator emplace(const_iterator insert_position, const T1 &value1, const T2 &value2)
Definition deque.h:1231
iterator insert(const_iterator insert_position, size_type n, const value_type &value)
Definition deque.h:1431
enable_if<!etl::is_integral< TIterator >::value, iterator >::type insert(const_iterator insert_position, TIterator range_begin, TIterator range_end)
Definition deque.h:1543
bool full() const
Definition deque.h:160
const_reference operator[](size_t index) const
Definition deque.h:813
size_type capacity() const
Definition deque.h:178
const_reference back() const
Definition deque.h:863
bool empty() const
Definition deque.h:151
void repair()
Fix the internal pointers after a low level memory copy.
Definition deque.h:2504
const_reverse_iterator rend() const
Gets a const reverse iterator to the beginning of the deque.
Definition deque.h:952
const_iterator cend() const
Gets a const iterator to the end of the deque.
Definition deque.h:912
reference emplace_back(const T1 &value1, const T2 &value2, const T3 &value3, const T4 &value4)
Definition deque.h:1876
reference emplace_back()
Definition deque.h:1808
deque_base(size_t max_size_, size_t buffer_size_)
Constructor.
Definition deque.h:197
reference emplace_front(const T1 &value1, const T2 &value2)
Definition deque.h:1985
void assign(size_type n, const value_type &value)
Definition deque.h:752
deque()
Default constructor.
Definition deque.h:2387
reference back()
Definition deque.h:851
iterator emplace(const_iterator insert_position, const T1 &value1, const T2 &value2, const T3 &value3)
Definition deque.h:1297
reverse_iterator rbegin()
Gets a reverse iterator to the end of the deque.
Definition deque.h:920
void fill(const T &value)
Fills the deque.
Definition deque.h:976
void pop_front()
Removes the oldest item from the deque.
Definition deque.h:2034
reference emplace_back(const T1 &value1)
Definition deque.h:1825
void push_back(const_reference item)
Definition deque.h:1761
const_iterator cbegin() const
Gets a const iterator to the beginning of the deque.
Definition deque.h:888
deque(TIterator begin_, TIterator end_, typename etl::enable_if<!etl::is_integral< TIterator >::value, int >::type=0)
Assigns data to the deque.
Definition deque.h:2438
~deque()
Destructor.
Definition deque.h:2396
reverse_iterator rend()
Gets a reverse iterator to the beginning of the deque.
Definition deque.h:944
const_reference front() const
Definition deque.h:839
deque(size_t n, const_reference value=value_type())
Assigns data to the deque.
Definition deque.h:2447
size_t available() const
Definition deque.h:187
deque & operator=(const deque &rhs)
Assignment operator.
Definition deque.h:2467
const_iterator begin() const
Gets a const iterator to the beginning of the deque.
Definition deque.h:880
iterator insert(const_iterator insert_position, const value_type &value)
Definition deque.h:988
void repair_buffer(pointer p_buffer_)
Fix the internal pointers after a low level memory copy.
Definition deque.h:2168
size_type current_size
The current number of elements in the deque.
Definition deque.h:209
ideque(pointer p_buffer_, size_t max_size_, size_t buffer_size_)
Constructor.
Definition deque.h:2137
Definition deque.h:2365
Definition deque.h:133
Definition deque.h:91
Definition deque.h:63
Definition deque.h:77
Definition deque.h:105
Definition deque.h:222
#define ETL_ASSERT(b, e)
Definition error_handler.h:511
ETL_EXCEPTION_CONSTEXPR exception(string_type reason_, string_type, numeric_type)
Constructor.
Definition exception.h:81
Definition exception.h:59
ETL_CONSTEXPR17 etl::enable_if<!etl::is_same< T, etl::nullptr_t >::value, T >::type * addressof(T &t)
Definition addressof.h:52
Definition deque.h:119
Definition absolute.h:40
ETL_CONSTEXPR14 bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1078
bool operator>(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1130
bool operator>=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1144
ETL_CONSTEXPR14 bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1090
bool operator<(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1103
bool operator<=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1117
iterator
Definition iterator.h:482
ETL_CONSTEXPR14 bool operator==(const etl::to_arithmetic_result< T > &lhs, const etl::to_arithmetic_result< T > &rhs)
Equality test for etl::to_arithmetic_result.
Definition to_arithmetic.h:903
ETL_CONSTEXPR14 bool operator!=(const etl::to_arithmetic_result< T > &lhs, const etl::to_arithmetic_result< T > &rhs)
Inequality test for etl::to_arithmetic_result.
Definition to_arithmetic.h:937