Embedded Template Library 1.0
Loading...
Searching...
No Matches
vector.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_VECTOR_INCLUDED
32#define ETL_VECTOR_INCLUDED
33
34#define ETL_IN_VECTOR_H
35
36#include "platform.h"
37#include "algorithm.h"
38#include "type_traits.h"
39#include "error_handler.h"
40#include "memory.h"
41#include "alignment.h"
42#include "array.h"
43#include "exception.h"
44#include "debug_count.h"
45#include "private/vector_base.h"
46#include "iterator.h"
47#include "functional.h"
48#include "static_assert.h"
49#include "placement_new.h"
50#include "initializer_list.h"
51
52#include <stddef.h>
53#include <stdint.h>
54#include <stddef.h>
55
56//*****************************************************************************
60//*****************************************************************************
61
62namespace etl
63{
64 //***************************************************************************
68 //***************************************************************************
69 template <typename T>
71 {
72 public:
73
74 typedef T value_type;
75 typedef T& reference;
76 typedef const T& const_reference;
77#if ETL_USING_CPP11
78 typedef T&& rvalue_reference;
79#endif
80 typedef T* pointer;
81 typedef const T* const_pointer;
82 typedef T* iterator;
83 typedef const T* const_iterator;
84 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
85 typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
86 typedef size_t size_type;
87 typedef typename etl::iterator_traits<iterator>::difference_type difference_type;
88
89 protected:
90
92
93 public:
94
95 //*********************************************************************
98 //*********************************************************************
99 iterator begin()
100 {
101 return p_buffer;
102 }
103
104 //*********************************************************************
107 //*********************************************************************
108 const_iterator begin() const
109 {
110 return p_buffer;
111 }
112
113 //*********************************************************************
116 //*********************************************************************
117 iterator end()
118 {
119 return p_end;
120 }
121
122 //*********************************************************************
125 //*********************************************************************
126 const_iterator end() const
127 {
128 return p_end;
129 }
130
131 //*********************************************************************
134 //*********************************************************************
135 const_iterator cbegin() const
136 {
137 return p_buffer;
138 }
139
140 //*********************************************************************
143 //*********************************************************************
144 const_iterator cend() const
145 {
146 return p_end;
147 }
148
149 //*********************************************************************
152 //*********************************************************************
153 reverse_iterator rbegin()
154 {
155 return reverse_iterator(end());
156 }
157
158 //*********************************************************************
161 //*********************************************************************
162 const_reverse_iterator rbegin() const
163 {
164 return const_reverse_iterator(end());
165 }
166
167 //*********************************************************************
170 //*********************************************************************
171 reverse_iterator rend()
172 {
173 return reverse_iterator(begin());
174 }
175
176 //*********************************************************************
179 //*********************************************************************
180 const_reverse_iterator rend() const
181 {
182 return const_reverse_iterator(begin());
183 }
184
185 //*********************************************************************
188 //*********************************************************************
189 const_reverse_iterator crbegin() const
190 {
191 return const_reverse_iterator(cend());
192 }
193
194 //*********************************************************************
197 //*********************************************************************
198 const_reverse_iterator crend() const
199 {
200 return const_reverse_iterator(cbegin());
201 }
202
203 //*********************************************************************
208 //*********************************************************************
209 void resize(size_t new_size)
210 {
211 resize(new_size, T());
212 }
213
214 //*********************************************************************
220 //*********************************************************************
221 void resize(size_t new_size, const_reference value)
222 {
223 ETL_ASSERT_OR_RETURN(new_size <= CAPACITY, ETL_ERROR(vector_full));
224
225 const size_t current_size = size();
226 size_t delta = (current_size < new_size) ? new_size - current_size : current_size - new_size;
227
228 if (current_size < new_size)
229 {
230 etl::uninitialized_fill_n(p_end, delta, value);
231 ETL_ADD_DEBUG_COUNT(delta);
232 }
233 else
234 {
235 etl::destroy_n(p_end - delta, delta);
236 ETL_SUBTRACT_DEBUG_COUNT(delta);
237 }
238
240 }
241
242 //*********************************************************************
245 //*********************************************************************
247 {
248 ETL_ASSERT_OR_RETURN(new_size <= CAPACITY, ETL_ERROR(vector_full));
249
250#if defined(ETL_DEBUG_COUNT)
251 if (size() < new_size)
252 {
253 ETL_ADD_DEBUG_COUNT(new_size - size());
254 }
255 else
256 {
257 ETL_SUBTRACT_DEBUG_COUNT(size() - new_size);
258 }
259#endif
260
262 }
263
264 //*********************************************************************
268 //*********************************************************************
269 void reserve(size_t n)
270 {
271 (void)n; // Stop 'unused parameter' warning in release mode.
273 }
274
275 //*********************************************************************
279 //*********************************************************************
280 reference operator [](size_t i)
281 {
282 return p_buffer[i];
283 }
284
285 //*********************************************************************
289 //*********************************************************************
290 const_reference operator [](size_t i) const
291 {
292 return p_buffer[i];
293 }
294
295 //*********************************************************************
300 //*********************************************************************
301 reference at(size_t i)
302 {
303 ETL_ASSERT(i < size(), ETL_ERROR(vector_out_of_bounds));
304 return p_buffer[i];
305 }
306
307 //*********************************************************************
312 //*********************************************************************
313 const_reference at(size_t i) const
314 {
315 ETL_ASSERT(i < size(), ETL_ERROR(vector_out_of_bounds));
316 return p_buffer[i];
317 }
318
319 //*********************************************************************
322 //*********************************************************************
323 reference front()
324 {
325 return *p_buffer;
326 }
327
328 //*********************************************************************
331 //*********************************************************************
332 const_reference front() const
333 {
334 return *p_buffer;
335 }
336
337 //*********************************************************************
340 //*********************************************************************
341 reference back()
342 {
343 return *(p_end - 1);
344 }
345
346 //*********************************************************************
349 //*********************************************************************
350 const_reference back() const
351 {
352 return *(p_end - 1);
353 }
354
355 //*********************************************************************
358 //*********************************************************************
359 pointer data()
360 {
361 return p_buffer;
362 }
363
364 //*********************************************************************
367 //*********************************************************************
368 ETL_CONSTEXPR const_pointer data() const
369 {
370 return p_buffer;
371 }
372
373 //*********************************************************************
379 //*********************************************************************
380 template <typename TIterator>
383 {
384 ETL_STATIC_ASSERT((etl::is_same<typename etl::remove_cv<T>::type, typename etl::remove_cv<typename etl::iterator_traits<TIterator>::value_type>::type>::value), "Iterator type does not match container type");
385
386#if ETL_IS_DEBUG_BUILD
387 difference_type d = etl::distance(first, last);
388 ETL_ASSERT_OR_RETURN(static_cast<size_t>(d) <= CAPACITY, ETL_ERROR(vector_full));
389#endif
390
391 initialise();
392
393 p_end = etl::uninitialized_copy(first, last, p_buffer);
394 ETL_ADD_DEBUG_COUNT(uint32_t(etl::distance(first, last)));
395 }
396
397 //*********************************************************************
402 //*********************************************************************
403 void assign(size_t n, parameter_t value)
404 {
405 ETL_ASSERT_OR_RETURN(n <= CAPACITY, ETL_ERROR(vector_full));
406
407 initialise();
408
410 ETL_ADD_DEBUG_COUNT(uint32_t(n));
411 }
412
413 //*************************************************************************
415 //*************************************************************************
416 void clear()
417 {
418 initialise();
419 }
420
421 //*************************************************************************
423 //*************************************************************************
424 void fill(const T& value)
425 {
426 etl::fill(begin(), end(), value);
427 }
428
429 //*********************************************************************
433 //*********************************************************************
434 void push_back(const_reference value)
435 {
436#if defined(ETL_CHECK_PUSH_POP)
437 ETL_ASSERT_OR_RETURN(size() != CAPACITY, ETL_ERROR(vector_full));
438#endif
439 create_back(value);
440 }
441
442#if ETL_USING_CPP11
443 //*********************************************************************
447 //*********************************************************************
448 void push_back(rvalue_reference value)
449 {
450#if defined(ETL_CHECK_PUSH_POP)
451 ETL_ASSERT_OR_RETURN(size() != CAPACITY, ETL_ERROR(vector_full));
452#endif
453 create_back(etl::move(value));
454 }
455#endif
456
457#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_VECTOR_FORCE_CPP03_IMPLEMENTATION)
458 //*********************************************************************
462 //*********************************************************************
463 template <typename ... Args>
464 reference emplace_back(Args && ... args)
465 {
466#if defined(ETL_CHECK_PUSH_POP)
467 ETL_ASSERT(size() != CAPACITY, ETL_ERROR(vector_full));
468#endif
470 ++p_end;
471 ETL_INCREMENT_DEBUG_COUNT;
472 return back();
473 }
474#else
475 //*********************************************************************
479 //*********************************************************************
480 reference emplace_back()
481 {
482#if defined(ETL_CHECK_PUSH_POP)
483 ETL_ASSERT(size() != CAPACITY, ETL_ERROR(vector_full));
484#endif
485 ::new (p_end) T();
486 ++p_end;
487 ETL_INCREMENT_DEBUG_COUNT;
488 return back();
489 }
490
491 //*********************************************************************
495 //*********************************************************************
496 template <typename T1>
497 reference emplace_back(const T1& value1)
498 {
499#if defined(ETL_CHECK_PUSH_POP)
500 ETL_ASSERT(size() != CAPACITY, ETL_ERROR(vector_full));
501#endif
502 ::new (p_end) T(value1);
503 ++p_end;
504 ETL_INCREMENT_DEBUG_COUNT;
505 return back();
506 }
507
508 //*********************************************************************
512 //*********************************************************************
513 template <typename T1, typename T2>
514 reference emplace_back(const T1& value1, const T2& value2)
515 {
516#if defined(ETL_CHECK_PUSH_POP)
517 ETL_ASSERT(size() != CAPACITY, ETL_ERROR(vector_full));
518#endif
519 ::new (p_end) T(value1, value2);
520 ++p_end;
521 ETL_INCREMENT_DEBUG_COUNT;
522 return back();
523 }
524
525 //*********************************************************************
529 //*********************************************************************
530 template <typename T1, typename T2, typename T3>
531 reference emplace_back(const T1& value1, const T2& value2, const T3& value3)
532 {
533#if defined(ETL_CHECK_PUSH_POP)
534 ETL_ASSERT(size() != CAPACITY, ETL_ERROR(vector_full));
535#endif
536 ::new (p_end) T(value1, value2, value3);
537 ++p_end;
538 ETL_INCREMENT_DEBUG_COUNT;
539 return back();
540 }
541
542 //*********************************************************************
546 //*********************************************************************
547 template <typename T1, typename T2, typename T3, typename T4>
548 reference emplace_back(const T1& value1, const T2& value2, const T3& value3, const T4& value4)
549 {
550#if defined(ETL_CHECK_PUSH_POP)
551 ETL_ASSERT(size() != CAPACITY, ETL_ERROR(vector_full));
552#endif
553 ::new (p_end) T(value1, value2, value3, value4);
554 ++p_end;
555 ETL_INCREMENT_DEBUG_COUNT;
556 return back();
557 }
558#endif
559
560 //*************************************************************************
563 //*************************************************************************
564 void pop_back()
565 {
566#if defined(ETL_CHECK_PUSH_POP)
567 ETL_ASSERT_OR_RETURN(size() > 0, ETL_ERROR(vector_empty));
568#endif
569 destroy_back();
570 }
571
572 //*********************************************************************
577 //*********************************************************************
578 iterator insert(const_iterator position, const_reference value)
579 {
580 ETL_ASSERT(size() != CAPACITY, ETL_ERROR(vector_full));
581
582 iterator position_ = to_iterator(position);
583
584 if (position_ == end())
585 {
586 create_back(value);
587 }
588 else
589 {
590 create_back(back());
591 etl::move_backward(position_, p_end - 2, p_end - 1);
592 *position_ = value;
593 }
594
595 return position_;
596 }
597
598#if ETL_USING_CPP11
599 //*********************************************************************
604 //*********************************************************************
605 iterator insert(const_iterator position, rvalue_reference value)
606 {
607 ETL_ASSERT(size() != CAPACITY, ETL_ERROR(vector_full));
608
609 iterator position_ = to_iterator(position);
610
611 if (position_ == end())
612 {
613 create_back(etl::move(value));
614 }
615 else
616 {
617 create_back(etl::move(back()));
618 etl::move_backward(position_, p_end - 2, p_end - 1);
619 *position_ = etl::move(value);
620 }
621
622 return position_;
623 }
624#endif
625
626 //*************************************************************************
628 //*************************************************************************
629#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT
630 template <typename ... Args>
631 iterator emplace(const_iterator position, Args && ... args)
632 {
633 ETL_ASSERT(!full(), ETL_ERROR(vector_full));
634
635 iterator position_ = to_iterator(position);
636
637 void* p;
638
639 if (position_ == end())
640 {
641 p = p_end++;
642 ETL_INCREMENT_DEBUG_COUNT;
643 }
644 else
645 {
647 create_back(back());
648 etl::move_backward(position_, p_end - 2, p_end - 1);
649 (*position_).~T();
650 }
651
653
654 return position_;
655 }
656#else
657 template <typename T1>
658 iterator emplace(const_iterator position, const T1& value1)
659 {
660 ETL_ASSERT(!full(), ETL_ERROR(vector_full));
661
662 iterator position_ = to_iterator(position);
663
664 void* p;
665
666 if (position_ == end())
667 {
668 p = p_end++;
669 ETL_INCREMENT_DEBUG_COUNT;
670 }
671 else
672 {
674 create_back(back());
675 etl::move_backward(position_, p_end - 2, p_end - 1);
676 (*position_).~T();
677 }
678
679 ::new (p) T(value1);
680
681 return position_;
682 }
683
684 template <typename T1, typename T2>
685 iterator emplace(const_iterator position, const T1& value1, const T2& value2)
686 {
687 ETL_ASSERT(!full(), ETL_ERROR(vector_full));
688
689 iterator position_ = to_iterator(position);
690
691 void* p;
692
693 if (position_ == end())
694 {
695 p = p_end++;
696 ETL_INCREMENT_DEBUG_COUNT;
697 }
698 else
699 {
701 create_back(back());
702 etl::move_backward(position_, p_end - 2, p_end - 1);
703 (*position_).~T();
704 }
705
706 ::new (p) T(value1, value2);
707
708 return position_;
709 }
710
711 template <typename T1, typename T2, typename T3>
712 iterator emplace(const_iterator position, const T1& value1, const T2& value2, const T3& value3)
713 {
714 ETL_ASSERT(!full(), ETL_ERROR(vector_full));
715
716 iterator position_ = to_iterator(position);
717
718 void* p;
719
720 if (position_ == end())
721 {
722 p = p_end++;
723 ETL_INCREMENT_DEBUG_COUNT;
724 }
725 else
726 {
728 create_back(back());
729 etl::move_backward(position_, p_end - 2, p_end - 1);
730 (*position_).~T();
731 }
732
733 ::new (p) T(value1, value2, value3);
734
735 return position_;
736 }
737
738 template <typename T1, typename T2, typename T3, typename T4>
739 iterator emplace(const_iterator position, const T1& value1, const T2& value2, const T3& value3, const T4& value4)
740 {
741 ETL_ASSERT(!full(), ETL_ERROR(vector_full));
742
743 iterator position_ = to_iterator(position);
744
745 void* p;
746
747 if (position_ == end())
748 {
749 p = p_end++;
750 ETL_INCREMENT_DEBUG_COUNT;
751 }
752 else
753 {
755 create_back(back());
756 etl::move_backward(position_, p_end - 2, p_end - 1);
757 (*position_).~T();
758 }
759
760 ::new (p) T(value1, value2, value3, value4);
761
762 return position_;
763 }
764#endif
765
766 //*********************************************************************
772 //*********************************************************************
773 void insert(const_iterator position, size_t n, parameter_t value)
774 {
775 ETL_ASSERT_OR_RETURN((size() + n) <= CAPACITY, ETL_ERROR(vector_full));
776
777 iterator position_ = to_iterator(position);
778
779 size_t insert_n = n;
780 size_t insert_begin = etl::distance(begin(), position_);
782
783 // Copy old data.
784 size_t copy_old_n;
785 size_t construct_old_n;
786 iterator p_construct_old;
787
788 if (insert_end > size())
789 {
790 copy_old_n = 0;
793 }
794 else
795 {
799 }
800
803
804 // Construct old.
806 ETL_ADD_DEBUG_COUNT(construct_old_n);
807
808 // Copy old.
810
811 // Construct new.
813 ETL_ADD_DEBUG_COUNT(construct_new_n);
814
815 // Copy new.
816 etl::fill_n(p_buffer + insert_begin, copy_new_n, value);
817
818 p_end += n;
819 }
820
821 //*********************************************************************
828 //*********************************************************************
829 template <class TIterator>
830 void insert(const_iterator position, TIterator first, TIterator last, typename etl::enable_if<!etl::is_integral<TIterator>::value, int>::type = 0)
831 {
832 size_t count = etl::distance(first, last);
833
834 ETL_ASSERT_OR_RETURN((size() + count) <= CAPACITY, ETL_ERROR(vector_full));
835
836 size_t insert_n = count;
837 size_t insert_begin = etl::distance(cbegin(), position);
839
840 // Move old data.
841 size_t copy_old_n;
842 size_t construct_old_n;
843 iterator p_construct_old;
844
845 if (insert_end > size())
846 {
847 copy_old_n = 0;
850 }
851 else
852 {
856 }
857
860
861 // Move construct old.
863 ETL_ADD_DEBUG_COUNT(construct_old_n);
864
865 // Move old.
867
868 // Copy construct new.
870 ETL_ADD_DEBUG_COUNT(construct_new_n);
871
872 // Copy new.
873 etl::copy(first, first + copy_new_n, p_buffer + insert_begin);
874
875 p_end += count;
876 }
877
878 //*********************************************************************
882 //*********************************************************************
883 iterator erase(iterator i_element)
884 {
885 etl::move(i_element + 1, end(), i_element);
886 destroy_back();
887
888 return i_element;
889 }
890
891 //*********************************************************************
895 //*********************************************************************
896 iterator erase(const_iterator i_element)
897 {
898 iterator i_element_ = to_iterator(i_element);
899
900 etl::move(i_element_ + 1, end(), i_element_);
901 destroy_back();
902
903 return i_element_;
904 }
905
906 //*********************************************************************
913 //*********************************************************************
914 iterator erase(const_iterator first, const_iterator last)
915 {
916 iterator first_ = to_iterator(first);
917 iterator last_ = to_iterator(last);
918
919 if (first == begin() && last == end())
920 {
921 clear();
922 }
923 else
924 {
925 etl::move(last_, end(), first_);
926 size_t n_delete = etl::distance(first_, last_);
927
928 // Destroy the elements left over at the end.
930 ETL_SUBTRACT_DEBUG_COUNT(n_delete);
931 p_end -= n_delete;
932 }
933
934 return first_;
935 }
936
937 //*************************************************************************
939 //*************************************************************************
941 {
942 if (&rhs != this)
943 {
944 assign(rhs.cbegin(), rhs.cend());
945 }
946
947 return *this;
948 }
949
950#if ETL_USING_CPP11
951 //*************************************************************************
953 //*************************************************************************
955 {
956 if (&rhs != this)
957 {
958 clear();
959 iterator itr = rhs.begin();
960 while (itr != rhs.end())
961 {
962 push_back(etl::move(*itr));
963 ++itr;
964 }
965
966 rhs.initialise();
967 }
968
969 return *this;
970 }
971#endif
972
973 //*************************************************************************
976 //*************************************************************************
977 size_type size() const
978 {
979 return size_t(p_end - p_buffer);
980 }
981
982 //*************************************************************************
985 //*************************************************************************
986 bool empty() const
987 {
988 return (p_end == p_buffer);
989 }
990
991 //*************************************************************************
994 //*************************************************************************
995 bool full() const
996 {
997 return size() == CAPACITY;
998 }
999
1000 //*************************************************************************
1003 //*************************************************************************
1004 size_t available() const
1005 {
1006 return max_size() - size();
1007 }
1008
1009#ifdef ETL_IVECTOR_REPAIR_ENABLE
1010 //*************************************************************************
1012 //*************************************************************************
1013 virtual void repair() = 0;
1014#endif
1015
1016 protected:
1017
1018 //*********************************************************************
1020 //*********************************************************************
1021 ivector(T* p_buffer_, size_t MAX_SIZE)
1022 : vector_base(MAX_SIZE)
1024 , p_end(p_buffer_)
1025 {
1026 }
1027
1028 //*********************************************************************
1030 //*********************************************************************
1032 {
1033 if ETL_IF_CONSTEXPR(etl::is_trivially_destructible<T>::value)
1034 {
1035 ETL_RESET_DEBUG_COUNT;
1036 }
1037 else
1038 {
1040 ETL_SUBTRACT_DEBUG_COUNT(int32_t(etl::distance(p_buffer, p_end)));
1041 }
1042
1043 p_end = p_buffer;
1044 }
1045
1046 //*************************************************************************
1048 //*************************************************************************
1050 {
1051 uintptr_t length = p_end - p_buffer;
1053 p_end = p_buffer_ + length;
1054 }
1055
1056 pointer p_buffer;
1057 pointer p_end;
1058
1059 private:
1060
1061 //*********************************************************************
1063 //*********************************************************************
1064 void create_back()
1065 {
1066 etl::create_value_at(p_end);
1067 ETL_INCREMENT_DEBUG_COUNT;
1068
1069 ++p_end;
1070 }
1071
1072 //*********************************************************************
1074 //*********************************************************************
1075 void create_back(const_reference value)
1076 {
1077 etl::create_copy_at(p_end, value);
1078 ETL_INCREMENT_DEBUG_COUNT;
1079
1080 ++p_end;
1081 }
1082
1083#if ETL_USING_CPP11
1084 //*********************************************************************
1086 //*********************************************************************
1087 void create_back(rvalue_reference value)
1088 {
1089 etl::create_copy_at(p_end, etl::move(value));
1090 ETL_INCREMENT_DEBUG_COUNT;
1091
1092 ++p_end;
1093 }
1094#endif
1095
1096 //*********************************************************************
1098 //*********************************************************************
1099 void destroy_back()
1100 {
1101 --p_end;
1102
1104 ETL_DECREMENT_DEBUG_COUNT;
1105 }
1106
1107 // Disable copy construction.
1108 ivector(const ivector&) ETL_DELETE;
1109
1110 private:
1111
1112 //*************************************************************************
1114 //*************************************************************************
1115 ETL_CONSTEXPR iterator to_iterator(const_iterator itr) const
1116 {
1117 return const_cast<iterator>(itr);
1118 }
1119 };
1120
1121 //***************************************************************************
1127 //***************************************************************************
1128 template <typename T>
1130 {
1131 return (lhs.size() == rhs.size()) && etl::equal(lhs.begin(), lhs.end(), rhs.begin());
1132 }
1133
1134 //***************************************************************************
1140 //***************************************************************************
1141 template <typename T>
1143 {
1144 return !(lhs == rhs);
1145 }
1146
1147 //***************************************************************************
1153 //***************************************************************************
1154 template <typename T>
1156 {
1157 return etl::lexicographical_compare(lhs.begin(), lhs.end(), rhs.begin(), rhs.end());
1158 }
1159
1160 //***************************************************************************
1166 //***************************************************************************
1167 template <typename T>
1169 {
1170 return (rhs < lhs);
1171 }
1172
1173 //***************************************************************************
1179 //***************************************************************************
1180 template <typename T>
1182 {
1183 return !(lhs > rhs);
1184 }
1185
1186 //***************************************************************************
1192 //***************************************************************************
1193 template <typename T>
1195 {
1196 return !(lhs < rhs);
1197 }
1198}
1199
1200#include "private/ivectorpointer.h"
1201
1202namespace etl
1203{
1204 //***************************************************************************
1209 //***************************************************************************
1210 template <typename T, const size_t MAX_SIZE_>
1211 class vector : public etl::ivector<T>
1212 {
1213 public:
1214
1215 ETL_STATIC_ASSERT((MAX_SIZE_ > 0U), "Zero capacity etl::vector is not valid");
1216
1217 static const size_t MAX_SIZE = MAX_SIZE_;
1218
1219 //*************************************************************************
1221 //*************************************************************************
1222 vector()
1223 : etl::ivector<T>(reinterpret_cast<T*>(&buffer), MAX_SIZE)
1224 {
1225 this->initialise();
1226 }
1227
1228 //*************************************************************************
1231 //*************************************************************************
1232 explicit vector(size_t initial_size)
1233 : etl::ivector<T>(reinterpret_cast<T*>(&buffer), MAX_SIZE)
1234 {
1235 this->initialise();
1236 this->resize(initial_size);
1237 }
1238
1239 //*************************************************************************
1243 //*************************************************************************
1244 vector(size_t initial_size, typename etl::ivector<T>::parameter_t value)
1245 : etl::ivector<T>(reinterpret_cast<T*>(&buffer), MAX_SIZE)
1246 {
1247 this->initialise();
1248 this->resize(initial_size, value);
1249 }
1250
1251 //*************************************************************************
1256 //*************************************************************************
1257 template <typename TIterator>
1258 vector(TIterator first, TIterator last, typename etl::enable_if<!etl::is_integral<TIterator>::value, int>::type = 0)
1259 : etl::ivector<T>(reinterpret_cast<T*>(&buffer), MAX_SIZE)
1260 {
1261 this->assign(first, last);
1262 }
1263
1264#if ETL_HAS_INITIALIZER_LIST
1265 //*************************************************************************
1267 //*************************************************************************
1268 vector(std::initializer_list<T> init)
1269 : etl::ivector<T>(reinterpret_cast<T*>(&buffer), MAX_SIZE)
1270 {
1271 this->assign(init.begin(), init.end());
1272 }
1273#endif
1274
1275 //*************************************************************************
1277 //*************************************************************************
1278 vector(const vector& other)
1279 : etl::ivector<T>(reinterpret_cast<T*>(&buffer), MAX_SIZE)
1280 {
1281 this->assign(other.begin(), other.end());
1282 }
1283
1284 //*************************************************************************
1286 //*************************************************************************
1287 vector& operator = (const vector& rhs)
1288 {
1289 if (&rhs != this)
1290 {
1291 this->assign(rhs.cbegin(), rhs.cend());
1292 }
1293
1294 return *this;
1295 }
1296
1297#if ETL_USING_CPP11
1298 //*************************************************************************
1300 //*************************************************************************
1301 vector(vector&& other)
1302 : etl::ivector<T>(reinterpret_cast<T*>(&buffer), MAX_SIZE)
1303 {
1304 if (this != &other)
1305 {
1306 this->initialise();
1307
1308 typename etl::ivector<T>::iterator itr = other.begin();
1309 while (itr != other.end())
1310 {
1311 this->push_back(etl::move(*itr));
1312 ++itr;
1313 }
1314
1315 other.initialise();
1316 }
1317 }
1318
1319 //*************************************************************************
1321 //*************************************************************************
1322 vector& operator = (vector&& rhs)
1323 {
1324 if (&rhs != this)
1325 {
1326 this->clear();
1327 typename etl::ivector<T>::iterator itr = rhs.begin();
1328 while (itr != rhs.end())
1329 {
1330 this->push_back(etl::move(*itr));
1331 ++itr;
1332 }
1333
1334 rhs.initialise();
1335 }
1336
1337 return *this;
1338 }
1339#endif
1340
1341 //*************************************************************************
1343 //*************************************************************************
1344#ifdef ETL_IVECTOR_REPAIR_ENABLE
1345 virtual
1346#endif
1347 ~vector()
1348 {
1349 this->clear();
1350 }
1351
1352 //*************************************************************************
1354 //*************************************************************************
1355#ifdef ETL_IVECTOR_REPAIR_ENABLE
1356 virtual void repair() ETL_OVERRIDE
1357#else
1358 void repair()
1359#endif
1360 {
1362
1364 }
1365
1366 private:
1367
1368 typename etl::aligned_storage<sizeof(T) * MAX_SIZE, etl::alignment_of<T>::value>::type buffer;
1369 };
1370
1371 //*************************************************************************
1373 //*************************************************************************
1374#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
1375 template <typename... T>
1376 vector(T...) -> vector<typename etl::common_type_t<T...>, sizeof...(T)>;
1377#endif
1378
1379 //*************************************************************************
1381 //*************************************************************************
1382#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
1383 template <typename... T>
1384 constexpr auto make_vector(T&&... t) -> etl::vector<typename etl::common_type_t<T...>, sizeof...(T)>
1385 {
1386 return { etl::forward<T>(t)... };
1387 }
1388#endif
1389
1390 //***************************************************************************
1395 //***************************************************************************
1396 template <typename T>
1397 class vector_ext : public etl::ivector<T>
1398 {
1399 public:
1400
1401 //*************************************************************************
1403 //*************************************************************************
1404 vector_ext(void* buffer, size_t max_size)
1405 : etl::ivector<T>(reinterpret_cast<T*>(buffer), max_size)
1406 {
1407 this->initialise();
1408 }
1409
1410 //*************************************************************************
1413 //*************************************************************************
1414 explicit vector_ext(size_t initial_size, void* buffer, size_t max_size)
1415 : etl::ivector<T>(reinterpret_cast<T*>(buffer), max_size)
1416 {
1417 this->initialise();
1418 this->resize(initial_size);
1419 }
1420
1421 //*************************************************************************
1425 //*************************************************************************
1426 vector_ext(size_t initial_size, typename etl::ivector<T>::parameter_t value, void* buffer, size_t max_size)
1427 : etl::ivector<T>(reinterpret_cast<T*>(buffer), max_size)
1428 {
1429 this->initialise();
1430 this->resize(initial_size, value);
1431 }
1432
1433 //*************************************************************************
1438 //*************************************************************************
1439 template <typename TIterator>
1440 vector_ext(TIterator first, TIterator last, void* buffer, size_t max_size, typename etl::enable_if<!etl::is_integral<TIterator>::value, int>::type = 0)
1441 : etl::ivector<T>(reinterpret_cast<T*>(buffer), max_size)
1442 {
1443 this->assign(first, last);
1444 }
1445
1446#if ETL_HAS_INITIALIZER_LIST
1447 //*************************************************************************
1449 //*************************************************************************
1450 vector_ext(std::initializer_list<T> init, void* buffer, size_t max_size)
1451 : etl::ivector<T>(reinterpret_cast<T*>(buffer), max_size)
1452 {
1453 this->assign(init.begin(), init.end());
1454 }
1455#endif
1456
1457 //*************************************************************************
1459 //*************************************************************************
1460 vector_ext(const vector_ext& other, void* buffer, size_t max_size)
1461 : etl::ivector<T>(reinterpret_cast<T*>(buffer), max_size)
1462 {
1463 this->assign(other.begin(), other.end());
1464 }
1465
1466 //*************************************************************************
1468 //*************************************************************************
1469 vector_ext& operator = (const vector_ext& rhs)
1470 {
1471 if (&rhs != this)
1472 {
1473 this->assign(rhs.cbegin(), rhs.cend());
1474 }
1475
1476 return *this;
1477 }
1478
1479#if ETL_USING_CPP11
1480 //*************************************************************************
1482 //*************************************************************************
1483 vector_ext(vector_ext&& other, void* buffer, size_t max_size)
1484 : etl::ivector<T>(reinterpret_cast<T*>(buffer), max_size)
1485 {
1486 if (this != &other)
1487 {
1488 this->initialise();
1489
1490 typename etl::ivector<T>::iterator itr = other.begin();
1491 while (itr != other.end())
1492 {
1493 this->push_back(etl::move(*itr));
1494 ++itr;
1495 }
1496
1497 other.initialise();
1498 }
1499 }
1500
1501 //*************************************************************************
1503 //*************************************************************************
1504 vector_ext& operator = (vector_ext&& rhs)
1505 {
1506 if (&rhs != this)
1507 {
1508 this->clear();
1509
1510 typename etl::ivector<T>::iterator itr = rhs.begin();
1511 while (itr != rhs.end())
1512 {
1513 this->push_back(etl::move(*itr));
1514 ++itr;
1515 }
1516
1517 rhs.initialise();
1518 }
1519
1520 return *this;
1521 }
1522#endif
1523
1524 //*************************************************************************
1526 //*************************************************************************
1527 ~vector_ext()
1528 {
1529 this->clear();
1530 }
1531
1532 //*************************************************************************
1534 //*************************************************************************
1535#ifdef ETL_IVECTOR_REPAIR_ENABLE
1536 virtual void repair() ETL_OVERRIDE
1537#else
1538 void repair()
1539#endif
1540 {
1541 }
1542 };
1543
1544 //***************************************************************************
1549 //***************************************************************************
1550 template <typename T, const size_t MAX_SIZE_>
1551 class vector<T*, MAX_SIZE_> : public etl::ivector<T*>
1552 {
1553 public:
1554
1555 ETL_STATIC_ASSERT((MAX_SIZE_ > 0U), "Zero capacity etl::vector is not valid");
1556
1557 static const size_t MAX_SIZE = MAX_SIZE_;
1558
1559 //*************************************************************************
1561 //*************************************************************************
1562 vector()
1563 : etl::ivector<T*>(reinterpret_cast<T**>(&buffer), MAX_SIZE)
1564 {
1565 this->initialise();
1566 }
1567
1568 //*************************************************************************
1571 //*************************************************************************
1572 explicit vector(size_t initial_size)
1573 : etl::ivector<T*>(reinterpret_cast<T**>(&buffer), MAX_SIZE)
1574 {
1575 this->initialise();
1576 this->resize(initial_size);
1577 }
1578
1579 //*************************************************************************
1583 //*************************************************************************
1584 vector(size_t initial_size, typename etl::ivector<T*>::parameter_t value)
1585 : etl::ivector<T*>(reinterpret_cast<T**>(&buffer), MAX_SIZE)
1586 {
1587 this->initialise();
1588 this->resize(initial_size, value);
1589 }
1590
1591 //*************************************************************************
1596 //*************************************************************************
1597 template <typename TIterator>
1598 vector(TIterator first, TIterator last, typename etl::enable_if<!etl::is_integral<TIterator>::value, int>::type = 0)
1599 : etl::ivector<T*>(reinterpret_cast<T**>(&buffer), MAX_SIZE)
1600 {
1601 this->assign(first, last);
1602 }
1603
1604#if ETL_HAS_INITIALIZER_LIST
1605 //*************************************************************************
1607 //*************************************************************************
1608 vector(std::initializer_list<T*> init)
1609 : etl::ivector<T*>(reinterpret_cast<T**>(&buffer), MAX_SIZE)
1610 {
1611 this->assign(init.begin(), init.end());
1612 }
1613#endif
1614
1615 //*************************************************************************
1617 //*************************************************************************
1618 vector(const vector& other)
1619 : etl::ivector<T*>(reinterpret_cast<T**>(&buffer), MAX_SIZE)
1620 {
1622 }
1623
1624 //*************************************************************************
1626 //*************************************************************************
1627 vector& operator = (const vector& rhs)
1628 {
1630
1631 return *this;
1632 }
1633
1634#if ETL_USING_CPP11
1635 //*************************************************************************
1637 //*************************************************************************
1638 vector(vector&& other)
1639 : etl::ivector<T*>(reinterpret_cast<T**>(&buffer), MAX_SIZE)
1640 {
1641 (void)etl::ivector<T*>::operator = (etl::move(other));
1642 }
1643
1644 //*************************************************************************
1646 //*************************************************************************
1647 vector& operator = (vector&& rhs)
1648 {
1649 (void)etl::ivector<T*>::operator = (etl::move(rhs));
1650
1651 return *this;
1652 }
1653#endif
1654
1655 //*************************************************************************
1657 //*************************************************************************
1658#ifdef ETL_IVECTOR_REPAIR_ENABLE
1659 virtual void repair() ETL_OVERRIDE
1660#else
1661 void repair()
1662#endif
1663 {
1665 }
1666
1667 private:
1668
1669 typename etl::aligned_storage<sizeof(T*) * MAX_SIZE, etl::alignment_of<T*>::value>::type buffer;
1670 };
1671
1672 //*************************************************************************
1674 //*************************************************************************
1675#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
1676 template <typename... T>
1677 vector(T*...) -> vector<typename etl::common_type_t<T*...>, sizeof...(T)>;
1678#endif
1679
1680#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
1681 template <typename... T>
1682 constexpr auto make_vector(T*... t) -> etl::vector<typename etl::common_type_t<T*...>, sizeof...(T)>
1683 {
1684 return { etl::forward<T*>(t)... };
1685 }
1686#endif
1687
1688 //***************************************************************************
1693 //***************************************************************************
1694 template <typename T>
1695 class vector_ext<T*> : public etl::ivector<T*>
1696 {
1697 public:
1698
1699 //*************************************************************************
1701 //*************************************************************************
1702 vector_ext(void* buffer, size_t max_size)
1703 : etl::ivector<T*>(reinterpret_cast<T**>(buffer), max_size)
1704 {
1705 this->initialise();
1706 }
1707
1708 //*************************************************************************
1711 //*************************************************************************
1712 vector_ext(size_t initial_size, void* buffer, size_t max_size)
1713 : etl::ivector<T*>(reinterpret_cast<T**>(buffer), max_size)
1714 {
1715 this->initialise();
1716 this->resize(initial_size);
1717 }
1718
1719 //*************************************************************************
1723 //*************************************************************************
1724 vector_ext(size_t initial_size, typename etl::ivector<T*>::parameter_t value, void* buffer, size_t max_size)
1725 : etl::ivector<T*>(reinterpret_cast<T**>(buffer), max_size)
1726 {
1727 this->initialise();
1728 this->resize(initial_size, value);
1729 }
1730
1731 //*************************************************************************
1736 //*************************************************************************
1737 template <typename TIterator>
1738 vector_ext(TIterator first, TIterator last, void* buffer, size_t max_size, typename etl::enable_if<!etl::is_integral<TIterator>::value, int>::type = 0)
1739 : etl::ivector<T*>(reinterpret_cast<T**>(buffer), max_size)
1740 {
1741 this->assign(first, last);
1742 }
1743
1744#if ETL_HAS_INITIALIZER_LIST
1745 //*************************************************************************
1747 //*************************************************************************
1748 vector_ext(std::initializer_list<T*> init, void* buffer, size_t max_size)
1749 : etl::ivector<T*>(reinterpret_cast<T**>(buffer), max_size)
1750 {
1751 this->assign(init.begin(), init.end());
1752 }
1753#endif
1754
1755 //*************************************************************************
1757 //*************************************************************************
1758 vector_ext(const vector_ext& other, void* buffer, size_t max_size)
1759 : etl::ivector<T*>(reinterpret_cast<T**>(buffer), max_size)
1760 {
1762 }
1763
1764 //*************************************************************************
1766 //*************************************************************************
1767 vector_ext(const vector_ext& other) ETL_DELETE;
1768
1769 //*************************************************************************
1771 //*************************************************************************
1772 vector_ext& operator = (const vector_ext& rhs)
1773 {
1775
1776 return *this;
1777 }
1778
1779#if ETL_USING_CPP11
1780 //*************************************************************************
1782 //*************************************************************************
1783 vector_ext(vector_ext&& other, void* buffer, size_t max_size)
1784 : etl::ivector<T*>(reinterpret_cast<T**>(buffer), max_size)
1785 {
1786 (void)etl::ivector<T*>::operator = (etl::move(other));
1787 }
1788
1789 //*************************************************************************
1791 //*************************************************************************
1792 vector_ext(vector_ext&& other) ETL_DELETE;
1793
1794 //*************************************************************************
1796 //*************************************************************************
1797 vector_ext& operator = (vector_ext&& rhs)
1798 {
1799 (void)etl::ivector<T*>::operator = (etl::move(rhs));
1800
1801 return *this;
1802 }
1803#endif
1804
1805 //*************************************************************************
1807 //*************************************************************************
1808 ~vector_ext()
1809 {
1810 this->clear();
1811 }
1812
1813 //*************************************************************************
1815 //*************************************************************************
1816#ifdef ETL_IVECTOR_REPAIR_ENABLE
1817 virtual void repair() ETL_OVERRIDE
1818#else
1819 void repair()
1820#endif
1821 {
1822 etl::ivector<T*>::repair_buffer(this->p_buffer);
1823 }
1824 };
1825
1826 //***************************************************************************
1828 //***************************************************************************
1829 template <typename T, typename U>
1830 typename etl::ivector<T>::difference_type
1831 erase(etl::ivector<T>& v, const U& value)
1832 {
1833 typename etl::ivector<T>::iterator itr = etl::remove(v.begin(), v.end(), value);
1834 typename etl::ivector<T>::difference_type d = etl::distance(itr, v.end());
1835 v.erase(itr, v.end());
1836
1837 return d;
1838 }
1839
1840 //***************************************************************************
1842 //***************************************************************************
1843 template <typename T, typename TPredicate>
1844 typename etl::ivector<T>::difference_type
1846 {
1847 typename etl::ivector<T>::iterator itr = etl::remove_if(v.begin(), v.end(), predicate);
1848 typename etl::ivector<T>::difference_type d = etl::distance(itr, v.end());
1849 v.erase(itr, v.end());
1850
1851 return d;
1852 }
1853}
1854
1855#endif
Definition constant.h:45
ETL_CONSTEXPR14 TIterator remove(TIterator first, TIterator last, const T &value)
Definition algorithm.h:2300
ETL_CONSTEXPR14 TIterator remove_if(TIterator first, TIterator last, TUnaryPredicate predicate)
Definition algorithm.h:2326
Definition alignment.h:245
#define ETL_ASSERT(b, e)
Definition error_handler.h:356
ETL_CONSTEXPR17 etl::enable_if<!etl::is_same< T, etl::nullptr_t >::value, T >::type * addressof(T &t)
Definition addressof.h:52
etl::enable_if< etl::is_trivially_destructible< T >::value, void >::type destroy_at(T *)
Definition memory.h:1027
etl::enable_if< etl::is_trivially_destructible< typenameetl::iterator_traits< TIterator >::value_type >::value, TIterator >::type destroy_n(TIterator i_begin, TSize n)
Definition memory.h:1190
TOutputIterator uninitialized_move(TInputIterator i_begin, TInputIterator i_end, TOutputIterator o_begin)
Definition memory.h:480
TOutputIterator uninitialized_copy(TInputIterator i_begin, TInputIterator i_end, TOutputIterator o_begin)
Definition memory.h:237
TOutputIterator uninitialized_fill_n(TOutputIterator o_begin, TSize n, const T &value)
Definition memory.h:210
add_rvalue_reference
Definition type_traits_generator.h:1366
enable_if
Definition type_traits_generator.h:1230
is_integral
Definition type_traits_generator.h:1040
is_same
Definition type_traits_generator.h:1080
remove_cv
Definition type_traits_generator.h:1007
iterator erase(const_iterator i_element)
Definition vector.h:896
void initialise()
Initialise the vector.
Definition vector.h:1031
iterator begin()
Definition vector.h:99
const_reference at(size_t i) const
Definition vector.h:313
size_type max_size() const
Definition vector_base.h:140
reference emplace_back(const T1 &value1, const T2 &value2, const T3 &value3, const T4 &value4)
Definition vector.h:548
const_iterator begin() const
Definition vector.h:108
void push_back(const_reference value)
Definition vector.h:434
const_reverse_iterator crbegin() const
Definition vector.h:189
reverse_iterator rend()
Definition vector.h:171
const_iterator cend() const
Definition vector.h:144
void clear()
Clears the vector.
Definition vector.h:416
etl::enable_if<!etl::is_integral< TIterator >::value, void >::type assign(TIterator first, TIterator last)
Definition vector.h:382
iterator erase(const_iterator first, const_iterator last)
Definition vector.h:914
const size_type CAPACITY
The maximum number of elements in the vector.
Definition vector_base.h:170
void insert(const_iterator position, TIterator first, TIterator last, typename etl::enable_if<!etl::is_integral< TIterator >::value, int >::type=0)
Definition vector.h:830
reference emplace_back(const T1 &value1, const T2 &value2)
Definition vector.h:514
pointer p_buffer
Pointer to the start of the buffer.
Definition vector.h:1056
reference front()
Definition vector.h:323
iterator end()
Definition vector.h:117
pointer data()
Definition vector.h:359
const_reverse_iterator crend() const
Definition vector.h:198
reference operator[](size_t i)
Definition vector.h:280
const_iterator cbegin() const
Definition vector.h:135
ivector(T *p_buffer_, size_t MAX_SIZE)
Constructor.
Definition vector.h:1021
const_iterator end() const
Definition vector.h:126
const_reverse_iterator rend() const
Definition vector.h:180
void pop_back()
Definition vector.h:564
void resize(size_t new_size, const_reference value)
Definition vector.h:221
void assign(size_t n, parameter_t value)
Definition vector.h:403
reference at(size_t i)
Definition vector.h:301
ivector & operator=(const ivector &rhs)
Assignment operator.
Definition vector.h:940
const_reference back() const
Definition vector.h:350
reference emplace_back(const T1 &value1)
Definition vector.h:497
void repair_buffer(T *p_buffer_)
Fix the internal pointers after a low level memory copy.
Definition vector.h:1049
void fill(const T &value)
Fills the vector.
Definition vector.h:424
bool full() const
Definition vector.h:995
reference emplace_back()
Definition vector.h:480
pointer p_end
Pointer to one past the last element in the buffer.
Definition vector.h:1057
size_type size() const
Definition vector.h:977
iterator erase(iterator i_element)
Definition vector.h:883
void insert(const_iterator position, size_t n, parameter_t value)
Definition vector.h:773
bool empty() const
Definition vector.h:986
const_reverse_iterator rbegin() const
Definition vector.h:162
void resize(size_t new_size)
Definition vector.h:209
ETL_CONSTEXPR const_pointer data() const
Definition vector.h:368
reference back()
Definition vector.h:341
void uninitialized_resize(size_t new_size)
Definition vector.h:246
size_t available() const
Definition vector.h:1004
iterator emplace(const_iterator position, const T1 &value1)
Emplaces a value to the vector at the specified position.
Definition vector.h:658
void reserve(size_t n)
Definition vector.h:269
reverse_iterator rbegin()
Definition vector.h:153
const_reference front() const
Definition vector.h:332
iterator insert(const_iterator position, const_reference value)
Definition vector.h:578
reference emplace_back(const T1 &value1, const T2 &value2, const T3 &value3)
Definition vector.h:531
Definition vector.h:71
Definition vector_base.h:122
Definition vector_base.h:80
Definition vector_base.h:66
Definition vector_base.h:108
Definition vector_base.h:94
bitset_ext
Definition absolute.h:38
bool operator>(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1148
size_t max_size() const
Returns the maximum number of items in the variant_pool.
Definition variant_pool_generator.h:395
bool operator>=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1160
bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1109
bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1097
void destroy(const T *const p)
Destroys the object.
Definition variant_pool_generator.h:370
ETL_NODISCARD ETL_CONSTEXPR14 T round_half_even_unscaled(T value) ETL_NOEXCEPT
Definition scaled_rounding.h:314
bool operator<(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1121
bool operator<=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1136
Definition type_traits_generator.h:2204
Definition type_traits_generator.h:2190
iterator
Definition iterator.h:399