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 "alignment.h"
39#include "array.h"
40#include "debug_count.h"
41#include "error_handler.h"
42#include "exception.h"
43#include "functional.h"
44#include "initializer_list.h"
45#include "iterator.h"
46#include "memory.h"
47#include "placement_new.h"
48#include "static_assert.h"
49#include "type_traits.h"
50#include "private/vector_base.h"
51
52#include <stddef.h>
53#include <stdint.h>
54
55//*****************************************************************************
59//*****************************************************************************
60
61namespace etl
62{
63 //***************************************************************************
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
91 typedef typename etl::parameter_type<T>::type parameter_t;
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 //*********************************************************************
221 //*********************************************************************
222 void resize(size_t new_size, const_reference value)
223 {
224 ETL_ASSERT_OR_RETURN(new_size <= CAPACITY, ETL_ERROR(vector_full));
225
226 const size_t current_size = size();
227 size_t delta = (current_size < new_size) ? new_size - current_size : current_size - new_size;
228
229 if (current_size < new_size)
230 {
231 etl::uninitialized_fill_n(p_end, delta, value);
232 ETL_ADD_DEBUG_COUNT(delta);
233 }
234 else
235 {
236 etl::destroy_n(p_end - delta, delta);
237 ETL_SUBTRACT_DEBUG_COUNT(delta);
238 }
239
240 p_end = p_buffer + new_size;
241 }
242
243 //*********************************************************************
246 //*********************************************************************
247 void uninitialized_resize(size_t new_size)
248 {
249 ETL_ASSERT_OR_RETURN(new_size <= CAPACITY, ETL_ERROR(vector_full));
250
251#if defined(ETL_DEBUG_COUNT)
252 if (size() < new_size)
253 {
254 ETL_ADD_DEBUG_COUNT(new_size - size());
255 }
256 else
257 {
258 ETL_SUBTRACT_DEBUG_COUNT(size() - new_size);
259 }
260#endif
261
262 p_end = p_buffer + new_size;
263 }
264
265 //*********************************************************************
270 //*********************************************************************
271 void reserve(size_t n)
272 {
273 (void)n; // Stop 'unused parameter' warning in release mode.
274 ETL_ASSERT(n <= CAPACITY, ETL_ERROR(vector_out_of_bounds));
275 }
276
277 //*********************************************************************
281 //*********************************************************************
282 reference operator[](size_t i)
283 {
284 ETL_ASSERT_CHECK_INDEX_OPERATOR(i < size(), ETL_ERROR(vector_out_of_bounds));
285 return p_buffer[i];
286 }
287
288 //*********************************************************************
292 //*********************************************************************
293 const_reference operator[](size_t i) const
294 {
295 ETL_ASSERT_CHECK_INDEX_OPERATOR(i < size(), ETL_ERROR(vector_out_of_bounds));
296 return p_buffer[i];
297 }
298
299 //*********************************************************************
305 //*********************************************************************
306 reference at(size_t i)
307 {
308 ETL_ASSERT(i < size(), ETL_ERROR(vector_out_of_bounds));
309 return p_buffer[i];
310 }
311
312 //*********************************************************************
318 //*********************************************************************
319 const_reference at(size_t i) const
320 {
321 ETL_ASSERT(i < size(), ETL_ERROR(vector_out_of_bounds));
322 return p_buffer[i];
323 }
324
325 //*********************************************************************
328 //*********************************************************************
329 reference front()
330 {
331 ETL_ASSERT_CHECK_EXTRA(size() > 0, ETL_ERROR(vector_out_of_bounds));
332 return *p_buffer;
333 }
334
335 //*********************************************************************
338 //*********************************************************************
339 const_reference front() const
340 {
341 ETL_ASSERT_CHECK_EXTRA(size() > 0, ETL_ERROR(vector_out_of_bounds));
342 return *p_buffer;
343 }
344
345 //*********************************************************************
348 //*********************************************************************
349 reference back()
350 {
351 ETL_ASSERT_CHECK_EXTRA(size() > 0, ETL_ERROR(vector_out_of_bounds));
352 return *(p_end - 1);
353 }
354
355 //*********************************************************************
358 //*********************************************************************
359 const_reference back() const
360 {
361 ETL_ASSERT_CHECK_EXTRA(size() > 0, ETL_ERROR(vector_out_of_bounds));
362 return *(p_end - 1);
363 }
364
365 //*********************************************************************
368 //*********************************************************************
369 pointer data()
370 {
371 return p_buffer;
372 }
373
374 //*********************************************************************
377 //*********************************************************************
378 ETL_CONSTEXPR const_pointer data() const
379 {
380 return p_buffer;
381 }
382
383 //*********************************************************************
390 //*********************************************************************
391 template <typename TIterator>
392 typename etl::enable_if<!etl::is_integral<TIterator>::value, void>::type assign(TIterator first, TIterator last)
393 {
394 ETL_STATIC_ASSERT((etl::is_same<typename etl::remove_cv<T>::type,
395 typename etl::remove_cv< typename etl::iterator_traits< TIterator>::value_type>::type>::value),
396 "Iterator type does not match container type");
397
398#if ETL_IS_DEBUG_BUILD
399 difference_type d = etl::distance(first, last);
400 ETL_ASSERT_OR_RETURN(static_cast<size_t>(d) <= CAPACITY, ETL_ERROR(vector_full));
401#endif
402
403 initialise();
404
405 p_end = etl::uninitialized_copy(first, last, p_buffer);
406 ETL_ADD_DEBUG_COUNT(uint32_t(etl::distance(first, last)));
407 }
408
409 //*********************************************************************
415 //*********************************************************************
416 void assign(size_t n, parameter_t value)
417 {
418 ETL_ASSERT_OR_RETURN(n <= CAPACITY, ETL_ERROR(vector_full));
419
420 initialise();
421
423 ETL_ADD_DEBUG_COUNT(uint32_t(n));
424 }
425
426 //*************************************************************************
428 //*************************************************************************
429 void clear()
430 {
431 initialise();
432 }
433
434 //*************************************************************************
436 //*************************************************************************
437 void fill(const T& value)
438 {
439 etl::fill(begin(), end(), value);
440 }
441
442 //*********************************************************************
447 //*********************************************************************
448 void push_back(const_reference value)
449 {
450 ETL_ASSERT_CHECK_PUSH_POP_OR_RETURN(size() != CAPACITY, ETL_ERROR(vector_full));
451
452 create_back(value);
453 }
454
455#if ETL_USING_CPP11
456 //*********************************************************************
461 //*********************************************************************
462 void push_back(rvalue_reference value)
463 {
464 ETL_ASSERT_CHECK_PUSH_POP_OR_RETURN(size() != CAPACITY, ETL_ERROR(vector_full));
465
466 create_back(etl::move(value));
467 }
468#endif
469
470#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_VECTOR_FORCE_CPP03_IMPLEMENTATION)
471 //*********************************************************************
476 //*********************************************************************
477 template <typename... Args>
478 reference emplace_back(Args&&... args)
479 {
480 ETL_ASSERT_CHECK_PUSH_POP(size() != CAPACITY, ETL_ERROR(vector_full));
481
482 ::new (p_end) T(etl::forward<Args>(args)...);
483 ++p_end;
484 ETL_INCREMENT_DEBUG_COUNT;
485 return back();
486 }
487#else
488 //*********************************************************************
493 //*********************************************************************
494 reference emplace_back()
495 {
496 ETL_ASSERT_CHECK_PUSH_POP(size() != CAPACITY, ETL_ERROR(vector_full));
497
498 ::new (p_end) T();
499 ++p_end;
500 ETL_INCREMENT_DEBUG_COUNT;
501 return back();
502 }
503
504 //*********************************************************************
509 //*********************************************************************
510 template <typename T1>
511 reference emplace_back(const T1& value1)
512 {
513 ETL_ASSERT_CHECK_PUSH_POP(size() != CAPACITY, ETL_ERROR(vector_full));
514
515 ::new (p_end) T(value1);
516 ++p_end;
517 ETL_INCREMENT_DEBUG_COUNT;
518 return back();
519 }
520
521 //*********************************************************************
526 //*********************************************************************
527 template <typename T1, typename T2>
528 reference emplace_back(const T1& value1, const T2& value2)
529 {
530 ETL_ASSERT_CHECK_PUSH_POP(size() != CAPACITY, ETL_ERROR(vector_full));
531
532 ::new (p_end) T(value1, value2);
533 ++p_end;
534 ETL_INCREMENT_DEBUG_COUNT;
535 return back();
536 }
537
538 //*********************************************************************
543 //*********************************************************************
544 template <typename T1, typename T2, typename T3>
545 reference emplace_back(const T1& value1, const T2& value2, const T3& value3)
546 {
547 ETL_ASSERT_CHECK_PUSH_POP(size() != CAPACITY, ETL_ERROR(vector_full));
548
549 ::new (p_end) T(value1, value2, value3);
550 ++p_end;
551 ETL_INCREMENT_DEBUG_COUNT;
552 return back();
553 }
554
555 //*********************************************************************
560 //*********************************************************************
561 template <typename T1, typename T2, typename T3, typename T4>
562 reference emplace_back(const T1& value1, const T2& value2, const T3& value3, const T4& value4)
563 {
564 ETL_ASSERT_CHECK_PUSH_POP(size() != CAPACITY, ETL_ERROR(vector_full));
565
566 ::new (p_end) T(value1, value2, value3, value4);
567 ++p_end;
568 ETL_INCREMENT_DEBUG_COUNT;
569 return back();
570 }
571#endif
572
573 //*************************************************************************
578 //*************************************************************************
579 void pop_back()
580 {
581 ETL_ASSERT_CHECK_PUSH_POP_OR_RETURN(size() > 0, ETL_ERROR(vector_empty));
582
583 destroy_back();
584 }
585
586 //*********************************************************************
592 //*********************************************************************
593 iterator insert(const_iterator position, const_reference value)
594 {
595 ETL_ASSERT(size() != CAPACITY, ETL_ERROR(vector_full));
596 ETL_ASSERT_CHECK_EXTRA(cbegin() <= position && position <= cend(), ETL_ERROR(vector_out_of_bounds));
597
598 iterator position_ = to_iterator(position);
599
600 if (position_ == end())
601 {
602 create_back(value);
603 }
604 else
605 {
606 create_back(back());
607 etl::move_backward(position_, p_end - 2, p_end - 1);
608 *position_ = value;
609 }
610
611 return position_;
612 }
613
614#if ETL_USING_CPP11
615 //*********************************************************************
621 //*********************************************************************
622 iterator insert(const_iterator position, rvalue_reference value)
623 {
624 ETL_ASSERT(size() != CAPACITY, ETL_ERROR(vector_full));
625 ETL_ASSERT_CHECK_EXTRA(cbegin() <= position && position <= cend(), ETL_ERROR(vector_out_of_bounds));
626
627 iterator position_ = to_iterator(position);
628
629 if (position_ == end())
630 {
631 create_back(etl::move(value));
632 }
633 else
634 {
635 create_back(etl::move(back()));
636 etl::move_backward(position_, p_end - 2, p_end - 1);
637 *position_ = etl::move(value);
638 }
639
640 return position_;
641 }
642#endif
643
644 //*************************************************************************
646 //*************************************************************************
647#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT
648 template <typename... Args>
649 iterator emplace(const_iterator position, Args&&... args)
650 {
651 ETL_ASSERT(!full(), ETL_ERROR(vector_full));
652 ETL_ASSERT_CHECK_EXTRA(cbegin() <= position && position <= cend(), ETL_ERROR(vector_out_of_bounds));
653
654 iterator position_ = to_iterator(position);
655
656 void* p;
657
658 if (position_ == end())
659 {
660 p = p_end++;
661 ETL_INCREMENT_DEBUG_COUNT;
662 }
663 else
664 {
665 p = etl::addressof(*position_);
666 create_back(back());
667 etl::move_backward(position_, p_end - 2, p_end - 1);
668 (*position_).~T();
669 }
670
671 ::new (p) T(etl::forward<Args>(args)...);
672
673 return position_;
674 }
675#else
676 template <typename T1>
677 iterator emplace(const_iterator position, const T1& value1)
678 {
679 ETL_ASSERT(!full(), ETL_ERROR(vector_full));
680 ETL_ASSERT_CHECK_EXTRA(cbegin() <= position && position <= cend(), ETL_ERROR(vector_out_of_bounds));
681
682 iterator position_ = to_iterator(position);
683
684 void* p;
685
686 if (position_ == end())
687 {
688 p = p_end++;
689 ETL_INCREMENT_DEBUG_COUNT;
690 }
691 else
692 {
693 p = etl::addressof(*position_);
694 create_back(back());
695 etl::move_backward(position_, p_end - 2, p_end - 1);
696 (*position_).~T();
697 }
698
699 ::new (p) T(value1);
700
701 return position_;
702 }
703
704 template <typename T1, typename T2>
705 iterator emplace(const_iterator position, const T1& value1, const T2& value2)
706 {
707 ETL_ASSERT(!full(), ETL_ERROR(vector_full));
708 ETL_ASSERT_CHECK_EXTRA(cbegin() <= position && position <= cend(), ETL_ERROR(vector_out_of_bounds));
709
710 iterator position_ = to_iterator(position);
711
712 void* p;
713
714 if (position_ == end())
715 {
716 p = p_end++;
717 ETL_INCREMENT_DEBUG_COUNT;
718 }
719 else
720 {
721 p = etl::addressof(*position_);
722 create_back(back());
723 etl::move_backward(position_, p_end - 2, p_end - 1);
724 (*position_).~T();
725 }
726
727 ::new (p) T(value1, value2);
728
729 return position_;
730 }
731
732 template <typename T1, typename T2, typename T3>
733 iterator emplace(const_iterator position, const T1& value1, const T2& value2, const T3& value3)
734 {
735 ETL_ASSERT(!full(), ETL_ERROR(vector_full));
736 ETL_ASSERT_CHECK_EXTRA(cbegin() <= position && position <= cend(), ETL_ERROR(vector_out_of_bounds));
737
738 iterator position_ = to_iterator(position);
739
740 void* p;
741
742 if (position_ == end())
743 {
744 p = p_end++;
745 ETL_INCREMENT_DEBUG_COUNT;
746 }
747 else
748 {
749 p = etl::addressof(*position_);
750 create_back(back());
751 etl::move_backward(position_, p_end - 2, p_end - 1);
752 (*position_).~T();
753 }
754
755 ::new (p) T(value1, value2, value3);
756
757 return position_;
758 }
759
760 template <typename T1, typename T2, typename T3, typename T4>
761 iterator emplace(const_iterator position, const T1& value1, const T2& value2, const T3& value3, const T4& value4)
762 {
763 ETL_ASSERT(!full(), ETL_ERROR(vector_full));
764 ETL_ASSERT_CHECK_EXTRA(cbegin() <= position && position <= cend(), ETL_ERROR(vector_out_of_bounds));
765
766 iterator position_ = to_iterator(position);
767
768 void* p;
769
770 if (position_ == end())
771 {
772 p = p_end++;
773 ETL_INCREMENT_DEBUG_COUNT;
774 }
775 else
776 {
777 p = etl::addressof(*position_);
778 create_back(back());
779 etl::move_backward(position_, p_end - 2, p_end - 1);
780 (*position_).~T();
781 }
782
783 ::new (p) T(value1, value2, value3, value4);
784
785 return position_;
786 }
787#endif
788
789 //*********************************************************************
796 //*********************************************************************
797 void insert(const_iterator position, size_t n, parameter_t value)
798 {
799 ETL_ASSERT_OR_RETURN((size() + n) <= CAPACITY, ETL_ERROR(vector_full));
800 ETL_ASSERT_CHECK_EXTRA(cbegin() <= position && position <= cend(), ETL_ERROR(vector_out_of_bounds));
801
802 iterator position_ = to_iterator(position);
803
804 size_t insert_n = n;
805 size_t insert_begin = static_cast<size_t>(etl::distance(begin(), position_));
806 size_t insert_end = insert_begin + insert_n;
807
808 // Copy old data.
809 size_t copy_old_n;
810 size_t construct_old_n;
811 iterator p_construct_old;
812
813 if (insert_end > size())
814 {
815 copy_old_n = 0;
816 construct_old_n = size() - insert_begin;
817 p_construct_old = p_buffer + insert_end;
818 }
819 else
820 {
821 copy_old_n = size() - insert_begin - insert_n;
822 construct_old_n = insert_n;
823 p_construct_old = p_end;
824 }
825
826 size_t copy_new_n = construct_old_n;
827 size_t construct_new_n = insert_n - copy_new_n;
828
829 // Construct old.
830 etl::uninitialized_move(p_end - construct_old_n, p_end, p_construct_old);
831 ETL_ADD_DEBUG_COUNT(construct_old_n);
832
833 // Copy old.
834 etl::move_backward(p_buffer + insert_begin, p_buffer + insert_begin + copy_old_n, p_buffer + insert_end + copy_old_n);
835
836 // Construct new.
837 etl::uninitialized_fill_n(p_end, construct_new_n, value);
838 ETL_ADD_DEBUG_COUNT(construct_new_n);
839
840 // Copy new.
841 etl::fill_n(p_buffer + insert_begin, copy_new_n, value);
842
843 p_end += n;
844 }
845
846 //*********************************************************************
853 //*********************************************************************
854 template <class TIterator>
855 void insert(const_iterator position, TIterator first, TIterator last, typename etl::enable_if<!etl::is_integral<TIterator>::value, int>::type = 0)
856 {
857 size_t count = static_cast<size_t>(etl::distance(first, last));
858
859 ETL_ASSERT_OR_RETURN((size() + count) <= CAPACITY, ETL_ERROR(vector_full));
860 ETL_ASSERT_CHECK_EXTRA(cbegin() <= position && position <= cend(), ETL_ERROR(vector_out_of_bounds));
861
862 size_t insert_n = count;
863 size_t insert_begin = static_cast<size_t>(etl::distance(cbegin(), position));
864 size_t insert_end = insert_begin + insert_n;
865
866 // Move old data.
867 size_t copy_old_n;
868 size_t construct_old_n;
869 iterator p_construct_old;
870
871 if (insert_end > size())
872 {
873 copy_old_n = 0;
874 construct_old_n = size() - insert_begin;
875 p_construct_old = p_buffer + insert_end;
876 }
877 else
878 {
879 copy_old_n = size() - insert_begin - insert_n;
880 construct_old_n = insert_n;
881 p_construct_old = p_end;
882 }
883
884 size_t copy_new_n = construct_old_n;
885 size_t construct_new_n = insert_n - copy_new_n;
886
887 // Move construct old.
888 etl::uninitialized_move(p_end - construct_old_n, p_end, p_construct_old);
889 ETL_ADD_DEBUG_COUNT(construct_old_n);
890
891 // Move old.
892 etl::move_backward(p_buffer + insert_begin, p_buffer + insert_begin + copy_old_n, p_buffer + insert_end + copy_old_n);
893
894 // Copy construct new.
895 typedef typename etl::iterator_traits<TIterator>::difference_type diff_t;
896 etl::uninitialized_copy(first + static_cast<diff_t>(copy_new_n), first + static_cast<diff_t>(copy_new_n + construct_new_n), p_end);
897 ETL_ADD_DEBUG_COUNT(construct_new_n);
898
899 // Copy new.
900 etl::copy(first, first + static_cast<diff_t>(copy_new_n), p_buffer + insert_begin);
901
902 p_end += count;
903 }
904
905 //*********************************************************************
910 //*********************************************************************
911 iterator erase(iterator i_element)
912 {
913 ETL_ASSERT_CHECK_EXTRA(cbegin() <= i_element && i_element < cend(), ETL_ERROR(vector_out_of_bounds));
914
915 etl::move(i_element + 1, end(), i_element);
916 destroy_back();
917
918 return i_element;
919 }
920
921 //*********************************************************************
926 //*********************************************************************
927 iterator erase(const_iterator i_element)
928 {
929 ETL_ASSERT_CHECK_EXTRA(cbegin() <= i_element && i_element < cend(), ETL_ERROR(vector_out_of_bounds));
930
931 iterator i_element_ = to_iterator(i_element);
932
933 etl::move(i_element_ + 1, end(), i_element_);
934 destroy_back();
935
936 return i_element_;
937 }
938
939 //*********************************************************************
947 //*********************************************************************
948 iterator erase(const_iterator first, const_iterator last)
949 {
950 ETL_ASSERT_CHECK_EXTRA(cbegin() <= first && first <= last && last <= cend(), ETL_ERROR(vector_out_of_bounds));
951
952 iterator first_ = to_iterator(first);
953 iterator last_ = to_iterator(last);
954
955 if (first == begin() && last == end())
956 {
957 clear();
958 }
959 else
960 {
961 etl::move(last_, end(), first_);
962 size_t n_delete = static_cast<size_t>(etl::distance(first_, last_));
963
964 // Destroy the elements left over at the end.
965 etl::destroy(p_end - n_delete, p_end);
966 ETL_SUBTRACT_DEBUG_COUNT(n_delete);
967 p_end -= n_delete;
968 }
969
970 return first_;
971 }
972
973 //*********************************************************************
977 //*********************************************************************
978 void swap(ivector<T>& other)
979 {
980 if (this == &other)
981 {
982 return;
983 }
984
985 ETL_ASSERT_OR_RETURN(this->max_size() >= other.size() && other.max_size() >= this->size(), ETL_ERROR(vector_full));
986
987 ivector<T>& smaller = other.size() > this->size() ? *this : other;
988 ivector<T>& larger = other.size() > this->size() ? other : *this;
989
990 etl::swap_ranges(smaller.begin(), smaller.end(), larger.begin());
991
992 typename ivector<T>::iterator larger_itr =
993 etl::next(larger.begin(), static_cast<typename etl::iterator_traits< typename ivector<T>::iterator>::difference_type>(smaller.size()));
994
995 etl::move(larger_itr, larger.end(), etl::back_inserter(smaller));
996
997 larger.erase(larger_itr, larger.end());
998 }
999
1000 //*************************************************************************
1002 //*************************************************************************
1004 {
1005 if (&rhs != this)
1006 {
1007 assign(rhs.cbegin(), rhs.cend());
1008 }
1009
1010 return *this;
1011 }
1012
1013#if ETL_USING_CPP11
1014 //*************************************************************************
1016 //*************************************************************************
1017 ivector& operator=(ivector&& rhs)
1018 {
1019 if (&rhs != this)
1020 {
1021 clear();
1022 iterator itr = rhs.begin();
1023 while (itr != rhs.end())
1024 {
1025 push_back(etl::move(*itr));
1026 ++itr;
1027 }
1028
1029 rhs.initialise();
1030 }
1031
1032 return *this;
1033 }
1034#endif
1035
1036 //*************************************************************************
1039 //*************************************************************************
1040 size_type size() const
1041 {
1042 return size_t(p_end - p_buffer);
1043 }
1044
1045 //*************************************************************************
1048 //*************************************************************************
1049 bool empty() const
1050 {
1051 return (p_end == p_buffer);
1052 }
1053
1054 //*************************************************************************
1057 //*************************************************************************
1058 bool full() const
1059 {
1060 return size() == CAPACITY;
1061 }
1062
1063 //*************************************************************************
1066 //*************************************************************************
1067 size_t available() const
1068 {
1069 return max_size() - size();
1070 }
1071
1072#ifdef ETL_IVECTOR_REPAIR_ENABLE
1073 //*************************************************************************
1075 //*************************************************************************
1076 virtual void repair() = 0;
1077#endif
1078
1079 protected:
1080
1081 //*********************************************************************
1083 //*********************************************************************
1084 ivector(T* p_buffer_, size_t MAX_SIZE)
1085 : vector_base(MAX_SIZE)
1086 , p_buffer(p_buffer_)
1087 , p_end(p_buffer_)
1088 {
1089 }
1090
1091 //*********************************************************************
1093 //*********************************************************************
1095 {
1096 if ETL_IF_CONSTEXPR (etl::is_trivially_destructible<T>::value)
1097 {
1098 ETL_RESET_DEBUG_COUNT;
1099 }
1100 else
1101 {
1103 ETL_SUBTRACT_DEBUG_COUNT(int32_t(etl::distance(p_buffer, p_end)));
1104 }
1105
1106 p_end = p_buffer;
1107 }
1108
1109 //*************************************************************************
1111 //*************************************************************************
1112 void repair_buffer(T* p_buffer_)
1113 {
1114 uintptr_t length = static_cast<uintptr_t>(p_end - p_buffer);
1115 p_buffer = p_buffer_;
1116 p_end = p_buffer_ + length;
1117 }
1118
1119 pointer p_buffer;
1120 pointer p_end;
1121
1122 private:
1123
1124 //*********************************************************************
1126 //*********************************************************************
1127 void create_back()
1128 {
1130 ETL_INCREMENT_DEBUG_COUNT;
1131
1132 ++p_end;
1133 }
1134
1135 //*********************************************************************
1137 //*********************************************************************
1138 void create_back(const_reference value)
1139 {
1140 etl::create_copy_at(p_end, value);
1141 ETL_INCREMENT_DEBUG_COUNT;
1142
1143 ++p_end;
1144 }
1145
1146#if ETL_USING_CPP11
1147 //*********************************************************************
1149 //*********************************************************************
1150 void create_back(rvalue_reference value)
1151 {
1152 etl::create_copy_at(p_end, etl::move(value));
1153 ETL_INCREMENT_DEBUG_COUNT;
1154
1155 ++p_end;
1156 }
1157#endif
1158
1159 //*********************************************************************
1161 //*********************************************************************
1162 void destroy_back()
1163 {
1164 --p_end;
1165
1167 ETL_DECREMENT_DEBUG_COUNT;
1168 }
1169
1170 // Disable copy construction.
1171 ivector(const ivector&) ETL_DELETE;
1172
1173 private:
1174
1175 //*************************************************************************
1177 //*************************************************************************
1178 ETL_CONSTEXPR iterator to_iterator(const_iterator itr) const
1179 {
1180 return const_cast<iterator>(itr);
1181 }
1182 };
1183
1184 //***************************************************************************
1190 //***************************************************************************
1191 template <typename T>
1192 bool operator==(const etl::ivector<T>& lhs, const etl::ivector<T>& rhs)
1193 {
1194 return (lhs.size() == rhs.size()) && etl::equal(lhs.begin(), lhs.end(), rhs.begin());
1195 }
1196
1197 //***************************************************************************
1203 //***************************************************************************
1204 template <typename T>
1205 bool operator!=(const etl::ivector<T>& lhs, const etl::ivector<T>& rhs)
1206 {
1207 return !(lhs == rhs);
1208 }
1209
1210 //***************************************************************************
1216 //***************************************************************************
1217 template <typename T>
1218 bool operator<(const etl::ivector<T>& lhs, const etl::ivector<T>& rhs)
1219 {
1220 return etl::lexicographical_compare(lhs.begin(), lhs.end(), rhs.begin(), rhs.end());
1221 }
1222
1223 //***************************************************************************
1229 //***************************************************************************
1230 template <typename T>
1231 bool operator>(const etl::ivector<T>& lhs, const etl::ivector<T>& rhs)
1232 {
1233 return (rhs < lhs);
1234 }
1235
1236 //***************************************************************************
1243 //***************************************************************************
1244 template <typename T>
1245 bool operator<=(const etl::ivector<T>& lhs, const etl::ivector<T>& rhs)
1246 {
1247 return !(lhs > rhs);
1248 }
1249
1250 //***************************************************************************
1257 //***************************************************************************
1258 template <typename T>
1259 bool operator>=(const etl::ivector<T>& lhs, const etl::ivector<T>& rhs)
1260 {
1261 return !(lhs < rhs);
1262 }
1263} // namespace etl
1264
1265#include "private/ivectorpointer.h"
1266
1267namespace etl
1268{
1269 //***************************************************************************
1274 //***************************************************************************
1275 template <typename T, const size_t MAX_SIZE_>
1276 class vector : public etl::ivector<T>
1277 {
1278 public:
1279
1280 ETL_STATIC_ASSERT((MAX_SIZE_ > 0U), "Zero capacity etl::vector is not valid");
1281
1282 static const size_t MAX_SIZE = MAX_SIZE_;
1283
1284 //*************************************************************************
1286 //*************************************************************************
1288 : etl::ivector<T>(reinterpret_cast<T*>(&buffer), MAX_SIZE)
1289 {
1290 this->initialise();
1291 }
1292
1293 //*************************************************************************
1296 //*************************************************************************
1297 explicit vector(size_t initial_size)
1298 : etl::ivector<T>(reinterpret_cast<T*>(&buffer), MAX_SIZE)
1299 {
1300 this->initialise();
1301 this->resize(initial_size);
1302 }
1303
1304 //*************************************************************************
1308 //*************************************************************************
1309 vector(size_t initial_size, typename etl::ivector<T>::parameter_t value)
1310 : etl::ivector<T>(reinterpret_cast<T*>(&buffer), MAX_SIZE)
1311 {
1312 this->initialise();
1313 this->resize(initial_size, value);
1314 }
1315
1316 //*************************************************************************
1321 //*************************************************************************
1322 template <typename TIterator>
1323 vector(TIterator first, TIterator last, typename etl::enable_if<!etl::is_integral<TIterator>::value, int>::type = 0)
1324 : etl::ivector<T>(reinterpret_cast<T*>(&buffer), MAX_SIZE)
1325 {
1326 this->assign(first, last);
1327 }
1328
1329#if ETL_HAS_INITIALIZER_LIST
1330 //*************************************************************************
1332 //*************************************************************************
1333 vector(std::initializer_list<T> init)
1334 : etl::ivector<T>(reinterpret_cast<T*>(&buffer), MAX_SIZE)
1335 {
1336 this->assign(init.begin(), init.end());
1337 }
1338#endif
1339
1340 //*************************************************************************
1342 //*************************************************************************
1343 vector(const vector& other)
1344 : etl::ivector<T>(reinterpret_cast<T*>(&buffer), MAX_SIZE)
1345 {
1346 this->assign(other.begin(), other.end());
1347 }
1348
1349 //*************************************************************************
1351 //*************************************************************************
1353 {
1354 if (&rhs != this)
1355 {
1356 this->assign(rhs.cbegin(), rhs.cend());
1357 }
1358
1359 return *this;
1360 }
1361
1362#if ETL_USING_CPP11
1363 //*************************************************************************
1365 //*************************************************************************
1366 vector(vector&& other)
1367 : etl::ivector<T>(reinterpret_cast<T*>(&buffer), MAX_SIZE)
1368 {
1369 if (this != &other)
1370 {
1371 this->initialise();
1372
1373 typename etl::ivector<T>::iterator itr = other.begin();
1374 while (itr != other.end())
1375 {
1376 this->push_back(etl::move(*itr));
1377 ++itr;
1378 }
1379
1380 other.initialise();
1381 }
1382 }
1383
1384 //*************************************************************************
1386 //*************************************************************************
1387 vector& operator=(vector&& rhs)
1388 {
1389 if (&rhs != this)
1390 {
1391 this->clear();
1392 typename etl::ivector<T>::iterator itr = rhs.begin();
1393 while (itr != rhs.end())
1394 {
1395 this->push_back(etl::move(*itr));
1396 ++itr;
1397 }
1398
1399 rhs.initialise();
1400 }
1401
1402 return *this;
1403 }
1404#endif
1405
1406 //*************************************************************************
1408 //*************************************************************************
1409#ifdef ETL_IVECTOR_REPAIR_ENABLE
1410 virtual
1411#endif
1413 {
1414 this->clear();
1415 }
1416
1417 //*************************************************************************
1419 //*************************************************************************
1420#ifdef ETL_IVECTOR_REPAIR_ENABLE
1421 virtual void repair() ETL_OVERRIDE
1422#else
1423 void repair()
1424#endif
1425 {
1426 ETL_ASSERT_OR_RETURN(etl::is_trivially_copyable<T>::value, ETL_ERROR(etl::vector_incompatible_type));
1427
1429 }
1430
1431 private:
1432
1433 typename etl::aligned_storage<sizeof(T) * MAX_SIZE, etl::alignment_of<T>::value>::type buffer;
1434 };
1435
1436 //*************************************************************************
1438 //*************************************************************************
1439#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
1440 template <typename... T>
1441 vector(T...) -> vector<typename etl::common_type_t<T...>, sizeof...(T)>;
1442#endif
1443
1444 //*************************************************************************
1446 //*************************************************************************
1447#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
1448 template <typename... T>
1449 constexpr auto make_vector(T&&... t) -> etl::vector<typename etl::common_type_t<T...>, sizeof...(T)>
1450 {
1451 return {etl::forward<T>(t)...};
1452 }
1453#endif
1454
1455 //***************************************************************************
1460 //***************************************************************************
1461 template <typename T>
1462 class vector_ext : public etl::ivector<T>
1463 {
1464 public:
1465
1466 //*************************************************************************
1468 //*************************************************************************
1469 vector_ext(void* buffer, size_t max_size)
1470 : etl::ivector<T>(reinterpret_cast<T*>(buffer), max_size)
1471 {
1472 this->initialise();
1473 }
1474
1475 //*************************************************************************
1478 //*************************************************************************
1479 explicit vector_ext(size_t initial_size, void* buffer, size_t max_size)
1480 : etl::ivector<T>(reinterpret_cast<T*>(buffer), max_size)
1481 {
1482 this->initialise();
1483 this->resize(initial_size);
1484 }
1485
1486 //*************************************************************************
1490 //*************************************************************************
1491 vector_ext(size_t initial_size, typename etl::ivector<T>::parameter_t value, void* buffer, size_t max_size)
1492 : etl::ivector<T>(reinterpret_cast<T*>(buffer), max_size)
1493 {
1494 this->initialise();
1495 this->resize(initial_size, value);
1496 }
1497
1498 //*************************************************************************
1503 //*************************************************************************
1504 template <typename TIterator>
1505 vector_ext(TIterator first, TIterator last, void* buffer, size_t max_size,
1506 typename etl::enable_if<!etl::is_integral<TIterator>::value, int>::type = 0)
1507 : etl::ivector<T>(reinterpret_cast<T*>(buffer), max_size)
1508 {
1509 this->assign(first, last);
1510 }
1511
1512#if ETL_HAS_INITIALIZER_LIST
1513 //*************************************************************************
1515 //*************************************************************************
1516 vector_ext(std::initializer_list<T> init, void* buffer, size_t max_size)
1517 : etl::ivector<T>(reinterpret_cast<T*>(buffer), max_size)
1518 {
1519 this->assign(init.begin(), init.end());
1520 }
1521#endif
1522
1523 //*************************************************************************
1525 //*************************************************************************
1526 vector_ext(const vector_ext& other, void* buffer, size_t max_size)
1527 : etl::ivector<T>(reinterpret_cast<T*>(buffer), max_size)
1528 {
1529 this->assign(other.begin(), other.end());
1530 }
1531
1532 //*************************************************************************
1534 //*************************************************************************
1536 {
1537 if (&rhs != this)
1538 {
1539 this->assign(rhs.cbegin(), rhs.cend());
1540 }
1541
1542 return *this;
1543 }
1544
1545#if ETL_USING_CPP11
1546 //*************************************************************************
1548 //*************************************************************************
1549 vector_ext(vector_ext&& other, void* buffer, size_t max_size)
1550 : etl::ivector<T>(reinterpret_cast<T*>(buffer), max_size)
1551 {
1552 if (this != &other)
1553 {
1554 this->initialise();
1555
1556 typename etl::ivector<T>::iterator itr = other.begin();
1557 while (itr != other.end())
1558 {
1559 this->push_back(etl::move(*itr));
1560 ++itr;
1561 }
1562
1563 other.initialise();
1564 }
1565 }
1566
1567 //*************************************************************************
1569 //*************************************************************************
1571 {
1572 if (&rhs != this)
1573 {
1574 this->clear();
1575
1576 typename etl::ivector<T>::iterator itr = rhs.begin();
1577 while (itr != rhs.end())
1578 {
1579 this->push_back(etl::move(*itr));
1580 ++itr;
1581 }
1582
1583 rhs.initialise();
1584 }
1585
1586 return *this;
1587 }
1588#endif
1589
1590 //*************************************************************************
1592 //*************************************************************************
1594 {
1595 this->clear();
1596 }
1597
1598 //*************************************************************************
1600 //*************************************************************************
1601#ifdef ETL_IVECTOR_REPAIR_ENABLE
1602 virtual void repair() ETL_OVERRIDE
1603#else
1604 void repair()
1605#endif
1606 {
1607 }
1608 };
1609
1610 //***************************************************************************
1615 //***************************************************************************
1616 template <typename T, const size_t MAX_SIZE_>
1617 class vector<T*, MAX_SIZE_> : public etl::ivector<T*>
1618 {
1619 public:
1620
1621 ETL_STATIC_ASSERT((MAX_SIZE_ > 0U), "Zero capacity etl::vector is not valid");
1622
1623 static const size_t MAX_SIZE = MAX_SIZE_;
1624
1625 //*************************************************************************
1627 //*************************************************************************
1629 : etl::ivector<T*>(reinterpret_cast<T**>(&buffer), MAX_SIZE)
1630 {
1631 this->initialise();
1632 }
1633
1634 //*************************************************************************
1637 //*************************************************************************
1638 explicit vector(size_t initial_size)
1639 : etl::ivector<T*>(reinterpret_cast<T**>(&buffer), MAX_SIZE)
1640 {
1641 this->initialise();
1642 this->resize(initial_size);
1643 }
1644
1645 //*************************************************************************
1649 //*************************************************************************
1650 vector(size_t initial_size, typename etl::ivector<T*>::parameter_t value)
1651 : etl::ivector<T*>(reinterpret_cast<T**>(&buffer), MAX_SIZE)
1652 {
1653 this->initialise();
1654 this->resize(initial_size, value);
1655 }
1656
1657 //*************************************************************************
1662 //*************************************************************************
1663 template <typename TIterator>
1664 vector(TIterator first, TIterator last, typename etl::enable_if<!etl::is_integral<TIterator>::value, int>::type = 0)
1665 : etl::ivector<T*>(reinterpret_cast<T**>(&buffer), MAX_SIZE)
1666 {
1667 this->assign(first, last);
1668 }
1669
1670#if ETL_HAS_INITIALIZER_LIST
1671 //*************************************************************************
1673 //*************************************************************************
1674 vector(std::initializer_list<T*> init)
1675 : etl::ivector<T*>(reinterpret_cast<T**>(&buffer), MAX_SIZE)
1676 {
1677 this->assign(init.begin(), init.end());
1678 }
1679#endif
1680
1681 //*************************************************************************
1683 //*************************************************************************
1684 vector(const vector& other)
1685 : etl::ivector<T*>(reinterpret_cast<T**>(&buffer), MAX_SIZE)
1686 {
1687 (void)etl::ivector<T*>::operator=(other);
1688 }
1689
1690 //*************************************************************************
1692 //*************************************************************************
1694 {
1695 (void)etl::ivector<T*>::operator=(rhs);
1696
1697 return *this;
1698 }
1699
1700#if ETL_USING_CPP11
1701 //*************************************************************************
1703 //*************************************************************************
1704 vector(vector&& other)
1705 : etl::ivector<T*>(reinterpret_cast<T**>(&buffer), MAX_SIZE)
1706 {
1707 (void)etl::ivector<T*>::operator=(etl::move(other));
1708 }
1709
1710 //*************************************************************************
1712 //*************************************************************************
1713 vector& operator=(vector&& rhs)
1714 {
1715 (void)etl::ivector<T*>::operator=(etl::move(rhs));
1716
1717 return *this;
1718 }
1719#endif
1720
1721 //*************************************************************************
1723 //*************************************************************************
1724#ifdef ETL_IVECTOR_REPAIR_ENABLE
1725 virtual void repair() ETL_OVERRIDE
1726#else
1727 void repair()
1728#endif
1729 {
1731 }
1732
1733 private:
1734
1735 typename etl::aligned_storage<sizeof(T*) * MAX_SIZE, etl::alignment_of<T*>::value>::type buffer;
1736 };
1737
1738 //*************************************************************************
1740 //*************************************************************************
1741#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
1742 template <typename... T>
1743 vector(T*...) -> vector<typename etl::common_type_t<T*...>, sizeof...(T)>;
1744#endif
1745
1746#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
1747 template <typename... T>
1748 constexpr auto make_vector(T*... t) -> etl::vector<typename etl::common_type_t<T*...>, sizeof...(T)>
1749 {
1750 return {etl::forward<T*>(t)...};
1751 }
1752#endif
1753
1754 //***************************************************************************
1759 //***************************************************************************
1760 template <typename T>
1761 class vector_ext<T*> : public etl::ivector<T*>
1762 {
1763 public:
1764
1765 //*************************************************************************
1767 //*************************************************************************
1768 vector_ext(void* buffer, size_t max_size)
1769 : etl::ivector<T*>(reinterpret_cast<T**>(buffer), max_size)
1770 {
1771 this->initialise();
1772 }
1773
1774 //*************************************************************************
1777 //*************************************************************************
1778 vector_ext(size_t initial_size, void* buffer, size_t max_size)
1779 : etl::ivector<T*>(reinterpret_cast<T**>(buffer), max_size)
1780 {
1781 this->initialise();
1782 this->resize(initial_size);
1783 }
1784
1785 //*************************************************************************
1789 //*************************************************************************
1790 vector_ext(size_t initial_size, typename etl::ivector<T*>::parameter_t value, void* buffer, size_t max_size)
1791 : etl::ivector<T*>(reinterpret_cast<T**>(buffer), max_size)
1792 {
1793 this->initialise();
1794 this->resize(initial_size, value);
1795 }
1796
1797 //*************************************************************************
1802 //*************************************************************************
1803 template <typename TIterator>
1804 vector_ext(TIterator first, TIterator last, void* buffer, size_t max_size,
1805 typename etl::enable_if<!etl::is_integral<TIterator>::value, int>::type = 0)
1806 : etl::ivector<T*>(reinterpret_cast<T**>(buffer), max_size)
1807 {
1808 this->assign(first, last);
1809 }
1810
1811#if ETL_HAS_INITIALIZER_LIST
1812 //*************************************************************************
1814 //*************************************************************************
1815 vector_ext(std::initializer_list<T*> init, void* buffer, size_t max_size)
1816 : etl::ivector<T*>(reinterpret_cast<T**>(buffer), max_size)
1817 {
1818 this->assign(init.begin(), init.end());
1819 }
1820#endif
1821
1822 //*************************************************************************
1824 //*************************************************************************
1825 vector_ext(const vector_ext& other, void* buffer, size_t max_size)
1826 : etl::ivector<T*>(reinterpret_cast<T**>(buffer), max_size)
1827 {
1828 (void)etl::ivector<T*>::operator=(other);
1829 }
1830
1831 //*************************************************************************
1833 //*************************************************************************
1834 vector_ext(const vector_ext& other) ETL_DELETE;
1835
1836 //*************************************************************************
1838 //*************************************************************************
1840 {
1841 (void)etl::ivector<T*>::operator=(rhs);
1842
1843 return *this;
1844 }
1845
1846#if ETL_USING_CPP11
1847 //*************************************************************************
1849 //*************************************************************************
1850 vector_ext(vector_ext&& other, void* buffer, size_t max_size)
1851 : etl::ivector<T*>(reinterpret_cast<T**>(buffer), max_size)
1852 {
1853 (void)etl::ivector<T*>::operator=(etl::move(other));
1854 }
1855
1856 //*************************************************************************
1858 //*************************************************************************
1859 vector_ext(vector_ext&& other) ETL_DELETE;
1860
1861 //*************************************************************************
1863 //*************************************************************************
1864 vector_ext& operator=(vector_ext&& rhs)
1865 {
1866 (void)etl::ivector<T*>::operator=(etl::move(rhs));
1867
1868 return *this;
1869 }
1870#endif
1871
1872 //*************************************************************************
1874 //*************************************************************************
1876 {
1877 this->clear();
1878 }
1879
1880 //*************************************************************************
1882 //*************************************************************************
1883#ifdef ETL_IVECTOR_REPAIR_ENABLE
1884 virtual void repair() ETL_OVERRIDE
1885#else
1886 void repair()
1887#endif
1888 {
1890 }
1891 };
1892
1893 //***************************************************************************
1895 //***************************************************************************
1896 template <typename T, typename U>
1897 typename etl::ivector<T>::difference_type erase(etl::ivector<T>& v, const U& value)
1898 {
1899 typename etl::ivector<T>::iterator itr = etl::remove(v.begin(), v.end(), value);
1900 typename etl::ivector<T>::difference_type d = etl::distance(itr, v.end());
1901 v.erase(itr, v.end());
1902
1903 return d;
1904 }
1905
1906 //***************************************************************************
1908 //***************************************************************************
1909 template <typename T, typename TPredicate>
1910 typename etl::ivector<T>::difference_type erase_if(etl::ivector<T>& v, TPredicate predicate)
1911 {
1912 typename etl::ivector<T>::iterator itr = etl::remove_if(v.begin(), v.end(), predicate);
1913 typename etl::ivector<T>::difference_type d = etl::distance(itr, v.end());
1914 v.erase(itr, v.end());
1915
1916 return d;
1917 }
1918
1919 //*********************************************************************
1923 //*********************************************************************
1924 template <typename T>
1925 void swap(ivector<T>& lhs, ivector<T>& rhs)
1926 {
1927 lhs.swap(rhs);
1928 }
1929} // namespace etl
1930
1931#endif
ETL_CONSTEXPR14 TIterator remove(TIterator first, TIterator last, const T &value)
Definition algorithm.h:2344
ETL_CONSTEXPR14 TIterator remove_if(TIterator first, TIterator last, TUnaryPredicate predicate)
Definition algorithm.h:2369
Definition alignment.h:251
#define ETL_ASSERT(b, e)
Definition error_handler.h:511
ETL_CONSTEXPR17 etl::enable_if<!etl::is_same< T, etl::nullptr_t >::value, T >::type * addressof(T &t)
Definition addressof.h:52
void create_copy_at(T *p, const T &value)
Definition memory.h:2369
void create_value_at(T *p)
Definition memory.h:2348
etl::enable_if< etl::is_trivially_destructible< typenameetl::iterator_traits< TIterator >::value_type >::value, void >::type destroy(TIterator, TIterator)
Definition memory.h:1585
etl::enable_if< etl::is_trivially_destructible< T >::value, void >::type destroy_at(T *)
Definition memory.h:1511
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:1671
TOutputIterator uninitialized_move(TInputIterator i_begin, TInputIterator i_end, TOutputIterator o_begin)
Definition memory.h:669
TOutputIterator uninitialized_copy(TInputIterator i_begin, TInputIterator i_end, TOutputIterator o_begin)
Definition memory.h:239
TOutputIterator uninitialized_fill_n(TOutputIterator o_begin, TSize n, const T &value)
Definition memory.h:212
iterator erase(const_iterator i_element)
Definition vector.h:927
void initialise()
Initialise the vector.
Definition vector.h:1094
iterator begin()
Definition vector.h:99
~vector_ext()
Destructor.
Definition vector.h:1593
vector_ext & operator=(const vector_ext &rhs)
Assignment operator.
Definition vector.h:1839
const_reference at(size_t i) const
Definition vector.h:319
void assign(TIterator first, TIterator last)
Definition ivectorpointer.h:323
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:562
const_iterator begin() const
Definition vector.h:108
void push_back(const_reference value)
Definition vector.h:448
vector_ext(size_t initial_size, typename etl::ivector< T >::parameter_t value, void *buffer, size_t max_size)
Definition vector.h:1491
vector()
Constructor.
Definition vector.h:1628
vector_ext(TIterator first, TIterator last, void *buffer, size_t max_size, typename etl::enable_if<!etl::is_integral< TIterator >::value, int >::type=0)
Definition vector.h:1505
const_reverse_iterator crbegin() const
Definition vector.h:189
vector(size_t initial_size)
Definition vector.h:1297
reverse_iterator rend()
Definition vector.h:171
const_iterator cend() const
Definition vector.h:144
void repair()
Fix the internal pointers after a low level memory copy.
Definition vector.h:1423
vector(const vector &other)
Copy constructor.
Definition vector.h:1343
vector_ext(void *buffer, size_t max_size)
Constructor.
Definition vector.h:1469
void clear()
Clears the vector.
Definition vector.h:429
vector_ext(size_t initial_size, void *buffer, size_t max_size)
Definition vector.h:1479
etl::enable_if<!etl::is_integral< TIterator >::value, void >::type assign(TIterator first, TIterator last)
Definition vector.h:392
iterator erase(const_iterator first, const_iterator last)
Definition vector.h:948
vector_base(size_t max_size_)
Constructor.
Definition vector_base.h:150
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:855
reference emplace_back(const T1 &value1, const T2 &value2)
Definition vector.h:528
pointer p_buffer
Definition vector.h:1119
vector_ext(size_t initial_size, typename etl::ivector< T * >::parameter_t value, void *buffer, size_t max_size)
Definition vector.h:1790
vector & operator=(const vector &rhs)
Assignment operator.
Definition vector.h:1693
reference front()
Definition vector.h:329
iterator end()
Definition vector.h:117
pointer data()
Definition vector.h:369
vector(size_t initial_size, typename etl::ivector< T * >::parameter_t value)
Definition vector.h:1650
const_reverse_iterator crend() const
Definition vector.h:198
vector(size_t initial_size, typename etl::ivector< T >::parameter_t value)
Definition vector.h:1309
reference operator[](size_t i)
Definition vector.h:282
~vector_ext()
Destructor.
Definition vector.h:1875
void swap(ivector< T > &other)
Definition vector.h:978
const_iterator cbegin() const
Definition vector.h:135
ivector(T *p_buffer_, size_t MAX_SIZE)
Constructor.
Definition vector.h:1084
const_iterator end() const
Definition vector.h:126
const_reverse_iterator rend() const
Definition vector.h:180
vector_ext(size_t initial_size, void *buffer, size_t max_size)
Definition vector.h:1778
vector(TIterator first, TIterator last, typename etl::enable_if<!etl::is_integral< TIterator >::value, int >::type=0)
Definition vector.h:1323
void pop_back()
Definition vector.h:579
void resize(size_t new_size, const_reference value)
Definition vector.h:222
void assign(size_t n, parameter_t value)
Definition vector.h:416
ivector(T **p_buffer_, size_t MAX_SIZE_)
Constructor.
Definition ivectorpointer.h:545
reference at(size_t i)
Definition vector.h:306
ivector & operator=(const ivector &rhs)
Assignment operator.
Definition vector.h:1003
const_reference back() const
Definition vector.h:359
vector_ext(TIterator first, TIterator last, void *buffer, size_t max_size, typename etl::enable_if<!etl::is_integral< TIterator >::value, int >::type=0)
Definition vector.h:1804
reference emplace_back(const T1 &value1)
Definition vector.h:511
vector(TIterator first, TIterator last, typename etl::enable_if<!etl::is_integral< TIterator >::value, int >::type=0)
Definition vector.h:1664
void repair()
Fix the internal pointers after a low level memory copy.
Definition vector.h:1604
vector_ext(void *buffer, size_t max_size)
Constructor.
Definition vector.h:1768
vector_ext & operator=(const vector_ext &rhs)
Assignment operator.
Definition vector.h:1535
void repair_buffer(T *p_buffer_)
Fix the internal pointers after a low level memory copy.
Definition vector.h:1112
vector(const vector &other)
Copy constructor.
Definition vector.h:1684
void repair()
Fix the internal pointers after a low level memory copy.
Definition vector.h:1727
const_reference operator[](size_t i) const
Definition vector.h:293
void fill(const T &value)
Fills the vector.
Definition vector.h:437
bool full() const
Definition vector.h:1058
vector_ext(const vector_ext &other, void *buffer, size_t max_size)
Copy constructor.
Definition vector.h:1526
reference emplace_back()
Definition vector.h:494
pointer p_end
Definition vector.h:1120
vector(size_t initial_size)
Definition vector.h:1638
size_type size() const
Definition vector.h:1040
iterator erase(iterator i_element)
Definition vector.h:911
void repair()
Fix the internal pointers after a low level memory copy.
Definition vector.h:1886
void insert(const_iterator position, size_t n, parameter_t value)
Definition vector.h:797
bool empty() const
Definition vector.h:1049
const_reverse_iterator rbegin() const
Definition vector.h:162
void resize(size_t new_size)
Definition vector.h:209
void clear()
Clears the vector.
Definition ivectorpointer.h:343
~vector()
Destructor.
Definition vector.h:1412
ETL_CONSTEXPR const_pointer data() const
Definition vector.h:378
reference back()
Definition vector.h:349
void uninitialized_resize(size_t new_size)
Definition vector.h:247
size_t available() const
Definition vector.h:1067
vector()
Constructor.
Definition vector.h:1287
iterator emplace(const_iterator position, const T1 &value1)
Emplaces a value to the vector at the specified position.
Definition vector.h:677
vector_ext(const vector_ext &other, void *buffer, size_t max_size)
Construct a copy.
Definition vector.h:1825
void reserve(size_t n)
Definition vector.h:271
vector & operator=(const vector &rhs)
Assignment operator.
Definition vector.h:1352
reverse_iterator rbegin()
Definition vector.h:153
const_reference front() const
Definition vector.h:339
iterator insert(const_iterator position, const_reference value)
Definition vector.h:593
reference emplace_back(const T1 &value1, const T2 &value2, const T3 &value3)
Definition vector.h:545
vector_ext(const vector_ext &other) ETL_DELETE
Copy constructor (Deleted).
void resize(size_t new_size)
Definition ivectorpointer.h:189
Definition vector.h:71
Definition vector.h:1277
Definition vector_base.h:122
Definition vector_base.h:80
Template deduction guides.
Definition vector.h:1463
Definition vector_base.h:66
Definition vector_base.h:108
Definition vector_base.h:94
bitset_ext
Definition absolute.h:40
ETL_CONSTEXPR14 void swap(etl::typed_storage_ext< T > &lhs, etl::typed_storage_ext< T > &rhs) ETL_NOEXCEPT
Swap two etl::typed_storage_ext.
Definition alignment.h:856
ETL_CONSTEXPR14 bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1081
bool operator>(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1133
bool operator>=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1147
etl::ivector< T >::difference_type erase(etl::ivector< T > &v, const U &value)
erase
Definition vector.h:1897
ETL_CONSTEXPR14 bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1093
ETL_NODISCARD ETL_CONSTEXPR14 etl::back_insert_iterator< TContainer > back_inserter(TContainer &container)
Creates a back_insert_iterator from a container.
Definition iterator.h:673
etl::ivector< T >::difference_type erase_if(etl::ivector< T > &v, TPredicate predicate)
erase_if
Definition vector.h:1910
bool operator<(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1106
bool operator<=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1120
Definition iterator.h:74
iterator
Definition iterator.h:424
etl::conditional< etl::is_fundamental< T >::value||etl::is_pointer< T >::value, T, constT & >::type type
By default fundamental and pointer types are passed by value.
Definition parameter_type.h:46
remove_cv
Definition type_traits.h:325