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
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 //*********************************************************************
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
239 p_end = p_buffer + new_size;
240 }
241
242 //*********************************************************************
245 //*********************************************************************
246 void uninitialized_resize(size_t new_size)
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
261 p_end = p_buffer + new_size;
262 }
263
264 //*********************************************************************
268 //*********************************************************************
269 void reserve(size_t n)
270 {
271 (void)n; // Stop 'unused parameter' warning in release mode.
272 ETL_ASSERT(n <= CAPACITY, ETL_ERROR(vector_out_of_bounds));
273 }
274
275 //*********************************************************************
279 //*********************************************************************
280 reference operator [](size_t i)
281 {
282 ETL_ASSERT_CHECK_INDEX_OPERATOR(i < size(), ETL_ERROR(vector_out_of_bounds));
283 return p_buffer[i];
284 }
285
286 //*********************************************************************
290 //*********************************************************************
291 const_reference operator [](size_t i) const
292 {
293 ETL_ASSERT_CHECK_INDEX_OPERATOR(i < size(), ETL_ERROR(vector_out_of_bounds));
294 return p_buffer[i];
295 }
296
297 //*********************************************************************
302 //*********************************************************************
303 reference at(size_t i)
304 {
305 ETL_ASSERT(i < size(), ETL_ERROR(vector_out_of_bounds));
306 return p_buffer[i];
307 }
308
309 //*********************************************************************
314 //*********************************************************************
315 const_reference at(size_t i) const
316 {
317 ETL_ASSERT(i < size(), ETL_ERROR(vector_out_of_bounds));
318 return p_buffer[i];
319 }
320
321 //*********************************************************************
324 //*********************************************************************
325 reference front()
326 {
327 ETL_ASSERT_CHECK_EXTRA(size() > 0, ETL_ERROR(vector_out_of_bounds));
328 return *p_buffer;
329 }
330
331 //*********************************************************************
334 //*********************************************************************
335 const_reference front() const
336 {
337 ETL_ASSERT_CHECK_EXTRA(size() > 0, ETL_ERROR(vector_out_of_bounds));
338 return *p_buffer;
339 }
340
341 //*********************************************************************
344 //*********************************************************************
345 reference back()
346 {
347 ETL_ASSERT_CHECK_EXTRA(size() > 0, ETL_ERROR(vector_out_of_bounds));
348 return *(p_end - 1);
349 }
350
351 //*********************************************************************
354 //*********************************************************************
355 const_reference back() const
356 {
357 ETL_ASSERT_CHECK_EXTRA(size() > 0, ETL_ERROR(vector_out_of_bounds));
358 return *(p_end - 1);
359 }
360
361 //*********************************************************************
364 //*********************************************************************
365 pointer data()
366 {
367 return p_buffer;
368 }
369
370 //*********************************************************************
373 //*********************************************************************
374 ETL_CONSTEXPR const_pointer data() const
375 {
376 return p_buffer;
377 }
378
379 //*********************************************************************
385 //*********************************************************************
386 template <typename TIterator>
388 assign(TIterator first, TIterator last)
389 {
390 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");
391
392#if ETL_IS_DEBUG_BUILD
393 difference_type d = etl::distance(first, last);
394 ETL_ASSERT_OR_RETURN(static_cast<size_t>(d) <= CAPACITY, ETL_ERROR(vector_full));
395#endif
396
397 initialise();
398
399 p_end = etl::uninitialized_copy(first, last, p_buffer);
400 ETL_ADD_DEBUG_COUNT(uint32_t(etl::distance(first, last)));
401 }
402
403 //*********************************************************************
408 //*********************************************************************
409 void assign(size_t n, parameter_t value)
410 {
411 ETL_ASSERT_OR_RETURN(n <= CAPACITY, ETL_ERROR(vector_full));
412
413 initialise();
414
416 ETL_ADD_DEBUG_COUNT(uint32_t(n));
417 }
418
419 //*************************************************************************
421 //*************************************************************************
422 void clear()
423 {
424 initialise();
425 }
426
427 //*************************************************************************
429 //*************************************************************************
430 void fill(const T& value)
431 {
432 etl::fill(begin(), end(), value);
433 }
434
435 //*********************************************************************
439 //*********************************************************************
440 void push_back(const_reference value)
441 {
442 ETL_ASSERT_CHECK_PUSH_POP_OR_RETURN(size() != CAPACITY, ETL_ERROR(vector_full));
443
444 create_back(value);
445 }
446
447#if ETL_USING_CPP11
448 //*********************************************************************
452 //*********************************************************************
453 void push_back(rvalue_reference value)
454 {
455 ETL_ASSERT_CHECK_PUSH_POP_OR_RETURN(size() != CAPACITY, ETL_ERROR(vector_full));
456
457 create_back(etl::move(value));
458 }
459#endif
460
461#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_VECTOR_FORCE_CPP03_IMPLEMENTATION)
462 //*********************************************************************
466 //*********************************************************************
467 template <typename ... Args>
468 reference emplace_back(Args && ... args)
469 {
470 ETL_ASSERT_CHECK_PUSH_POP(size() != CAPACITY, ETL_ERROR(vector_full));
471
472 ::new (p_end) T(etl::forward<Args>(args)...);
473 ++p_end;
474 ETL_INCREMENT_DEBUG_COUNT;
475 return back();
476 }
477#else
478 //*********************************************************************
482 //*********************************************************************
483 reference emplace_back()
484 {
485 ETL_ASSERT_CHECK_PUSH_POP(size() != CAPACITY, ETL_ERROR(vector_full));
486
487 ::new (p_end) T();
488 ++p_end;
489 ETL_INCREMENT_DEBUG_COUNT;
490 return back();
491 }
492
493 //*********************************************************************
497 //*********************************************************************
498 template <typename T1>
499 reference emplace_back(const T1& value1)
500 {
501 ETL_ASSERT_CHECK_PUSH_POP(size() != CAPACITY, ETL_ERROR(vector_full));
502
503 ::new (p_end) T(value1);
504 ++p_end;
505 ETL_INCREMENT_DEBUG_COUNT;
506 return back();
507 }
508
509 //*********************************************************************
513 //*********************************************************************
514 template <typename T1, typename T2>
515 reference emplace_back(const T1& value1, const T2& value2)
516 {
517 ETL_ASSERT_CHECK_PUSH_POP(size() != CAPACITY, ETL_ERROR(vector_full));
518
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 ETL_ASSERT_CHECK_PUSH_POP(size() != CAPACITY, ETL_ERROR(vector_full));
534
535 ::new (p_end) T(value1, value2, value3);
536 ++p_end;
537 ETL_INCREMENT_DEBUG_COUNT;
538 return back();
539 }
540
541 //*********************************************************************
545 //*********************************************************************
546 template <typename T1, typename T2, typename T3, typename T4>
547 reference emplace_back(const T1& value1, const T2& value2, const T3& value3, const T4& value4)
548 {
549 ETL_ASSERT_CHECK_PUSH_POP(size() != CAPACITY, ETL_ERROR(vector_full));
550
551 ::new (p_end) T(value1, value2, value3, value4);
552 ++p_end;
553 ETL_INCREMENT_DEBUG_COUNT;
554 return back();
555 }
556#endif
557
558 //*************************************************************************
562 //*************************************************************************
563 void pop_back()
564 {
565 ETL_ASSERT_CHECK_PUSH_POP_OR_RETURN(size() > 0, ETL_ERROR(vector_empty));
566
567 destroy_back();
568 }
569
570 //*********************************************************************
575 //*********************************************************************
576 iterator insert(const_iterator position, const_reference value)
577 {
578 ETL_ASSERT(size() != CAPACITY, ETL_ERROR(vector_full));
579 ETL_ASSERT_CHECK_EXTRA(cbegin() <= position && position <= cend(), ETL_ERROR(vector_out_of_bounds));
580
581 iterator position_ = to_iterator(position);
582
583 if (position_ == end())
584 {
585 create_back(value);
586 }
587 else
588 {
589 create_back(back());
590 etl::move_backward(position_, p_end - 2, p_end - 1);
591 *position_ = value;
592 }
593
594 return position_;
595 }
596
597#if ETL_USING_CPP11
598 //*********************************************************************
603 //*********************************************************************
604 iterator insert(const_iterator position, rvalue_reference value)
605 {
606 ETL_ASSERT(size() != CAPACITY, ETL_ERROR(vector_full));
607 ETL_ASSERT_CHECK_EXTRA(cbegin() <= position && position <= cend(), ETL_ERROR(vector_out_of_bounds));
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 ETL_ASSERT_CHECK_EXTRA(cbegin() <= position && position <= cend(), ETL_ERROR(vector_out_of_bounds));
635
636 iterator position_ = to_iterator(position);
637
638 void* p;
639
640 if (position_ == end())
641 {
642 p = p_end++;
643 ETL_INCREMENT_DEBUG_COUNT;
644 }
645 else
646 {
647 p = etl::addressof(*position_);
648 create_back(back());
649 etl::move_backward(position_, p_end - 2, p_end - 1);
650 (*position_).~T();
651 }
652
653 ::new (p) T(etl::forward<Args>(args)...);
654
655 return position_;
656 }
657#else
658 template <typename T1>
659 iterator emplace(const_iterator position, const T1& value1)
660 {
661 ETL_ASSERT(!full(), ETL_ERROR(vector_full));
662 ETL_ASSERT_CHECK_EXTRA(cbegin() <= position && position <= cend(), ETL_ERROR(vector_out_of_bounds));
663
664 iterator position_ = to_iterator(position);
665
666 void* p;
667
668 if (position_ == end())
669 {
670 p = p_end++;
671 ETL_INCREMENT_DEBUG_COUNT;
672 }
673 else
674 {
675 p = etl::addressof(*position_);
676 create_back(back());
677 etl::move_backward(position_, p_end - 2, p_end - 1);
678 (*position_).~T();
679 }
680
681 ::new (p) T(value1);
682
683 return position_;
684 }
685
686 template <typename T1, typename T2>
687 iterator emplace(const_iterator position, const T1& value1, const T2& value2)
688 {
689 ETL_ASSERT(!full(), ETL_ERROR(vector_full));
690 ETL_ASSERT_CHECK_EXTRA(cbegin() <= position && position <= cend(), ETL_ERROR(vector_out_of_bounds));
691
692 iterator position_ = to_iterator(position);
693
694 void* p;
695
696 if (position_ == end())
697 {
698 p = p_end++;
699 ETL_INCREMENT_DEBUG_COUNT;
700 }
701 else
702 {
703 p = etl::addressof(*position_);
704 create_back(back());
705 etl::move_backward(position_, p_end - 2, p_end - 1);
706 (*position_).~T();
707 }
708
709 ::new (p) T(value1, value2);
710
711 return position_;
712 }
713
714 template <typename T1, typename T2, typename T3>
715 iterator emplace(const_iterator position, const T1& value1, const T2& value2, const T3& value3)
716 {
717 ETL_ASSERT(!full(), ETL_ERROR(vector_full));
718 ETL_ASSERT_CHECK_EXTRA(cbegin() <= position && position <= cend(), ETL_ERROR(vector_out_of_bounds));
719
720 iterator position_ = to_iterator(position);
721
722 void* p;
723
724 if (position_ == end())
725 {
726 p = p_end++;
727 ETL_INCREMENT_DEBUG_COUNT;
728 }
729 else
730 {
731 p = etl::addressof(*position_);
732 create_back(back());
733 etl::move_backward(position_, p_end - 2, p_end - 1);
734 (*position_).~T();
735 }
736
737 ::new (p) T(value1, value2, value3);
738
739 return position_;
740 }
741
742 template <typename T1, typename T2, typename T3, typename T4>
743 iterator emplace(const_iterator position, const T1& value1, const T2& value2, const T3& value3, const T4& value4)
744 {
745 ETL_ASSERT(!full(), ETL_ERROR(vector_full));
746 ETL_ASSERT_CHECK_EXTRA(cbegin() <= position && position <= cend(), ETL_ERROR(vector_out_of_bounds));
747
748 iterator position_ = to_iterator(position);
749
750 void* p;
751
752 if (position_ == end())
753 {
754 p = p_end++;
755 ETL_INCREMENT_DEBUG_COUNT;
756 }
757 else
758 {
759 p = etl::addressof(*position_);
760 create_back(back());
761 etl::move_backward(position_, p_end - 2, p_end - 1);
762 (*position_).~T();
763 }
764
765 ::new (p) T(value1, value2, value3, value4);
766
767 return position_;
768 }
769#endif
770
771 //*********************************************************************
777 //*********************************************************************
778 void insert(const_iterator position, size_t n, parameter_t value)
779 {
780 ETL_ASSERT_OR_RETURN((size() + n) <= CAPACITY, ETL_ERROR(vector_full));
781 ETL_ASSERT_CHECK_EXTRA(cbegin() <= position && position <= cend(), ETL_ERROR(vector_out_of_bounds));
782
783 iterator position_ = to_iterator(position);
784
785 size_t insert_n = n;
786 size_t insert_begin = etl::distance(begin(), position_);
787 size_t insert_end = insert_begin + insert_n;
788
789 // Copy old data.
790 size_t copy_old_n;
791 size_t construct_old_n;
792 iterator p_construct_old;
793
794 if (insert_end > size())
795 {
796 copy_old_n = 0;
797 construct_old_n = size() - insert_begin;
798 p_construct_old = p_buffer + insert_end;
799 }
800 else
801 {
802 copy_old_n = size() - insert_begin - insert_n;
803 construct_old_n = insert_n;
804 p_construct_old = p_end;
805 }
806
807 size_t copy_new_n = construct_old_n;
808 size_t construct_new_n = insert_n - copy_new_n;
809
810 // Construct old.
811 etl::uninitialized_move(p_end - construct_old_n, p_end, p_construct_old);
812 ETL_ADD_DEBUG_COUNT(construct_old_n);
813
814 // Copy old.
815 etl::move_backward(p_buffer + insert_begin, p_buffer + insert_begin + copy_old_n, p_buffer + insert_end + copy_old_n);
816
817 // Construct new.
818 etl::uninitialized_fill_n(p_end, construct_new_n, value);
819 ETL_ADD_DEBUG_COUNT(construct_new_n);
820
821 // Copy new.
822 etl::fill_n(p_buffer + insert_begin, copy_new_n, value);
823
824 p_end += n;
825 }
826
827 //*********************************************************************
834 //*********************************************************************
835 template <class TIterator>
836 void insert(const_iterator position, TIterator first, TIterator last, typename etl::enable_if<!etl::is_integral<TIterator>::value, int>::type = 0)
837 {
838 size_t count = etl::distance(first, last);
839
840 ETL_ASSERT_OR_RETURN((size() + count) <= CAPACITY, ETL_ERROR(vector_full));
841 ETL_ASSERT_CHECK_EXTRA(cbegin() <= position && position <= cend(), ETL_ERROR(vector_out_of_bounds));
842
843 size_t insert_n = count;
844 size_t insert_begin = etl::distance(cbegin(), position);
845 size_t insert_end = insert_begin + insert_n;
846
847 // Move old data.
848 size_t copy_old_n;
849 size_t construct_old_n;
850 iterator p_construct_old;
851
852 if (insert_end > size())
853 {
854 copy_old_n = 0;
855 construct_old_n = size() - insert_begin;
856 p_construct_old = p_buffer + insert_end;
857 }
858 else
859 {
860 copy_old_n = size() - insert_begin - insert_n;
861 construct_old_n = insert_n;
862 p_construct_old = p_end;
863 }
864
865 size_t copy_new_n = construct_old_n;
866 size_t construct_new_n = insert_n - copy_new_n;
867
868 // Move construct old.
869 etl::uninitialized_move(p_end - construct_old_n, p_end, p_construct_old);
870 ETL_ADD_DEBUG_COUNT(construct_old_n);
871
872 // Move old.
873 etl::move_backward(p_buffer + insert_begin, p_buffer + insert_begin + copy_old_n, p_buffer + insert_end + copy_old_n);
874
875 // Copy construct new.
876 etl::uninitialized_copy(first + copy_new_n, first + copy_new_n + construct_new_n, p_end);
877 ETL_ADD_DEBUG_COUNT(construct_new_n);
878
879 // Copy new.
880 etl::copy(first, first + copy_new_n, p_buffer + insert_begin);
881
882 p_end += count;
883 }
884
885 //*********************************************************************
889 //*********************************************************************
890 iterator erase(iterator i_element)
891 {
892 ETL_ASSERT_CHECK_EXTRA(cbegin() <= i_element && i_element < cend(), ETL_ERROR(vector_out_of_bounds));
893
894 etl::move(i_element + 1, end(), i_element);
895 destroy_back();
896
897 return i_element;
898 }
899
900 //*********************************************************************
904 //*********************************************************************
905 iterator erase(const_iterator i_element)
906 {
907 ETL_ASSERT_CHECK_EXTRA(cbegin() <= i_element && i_element < cend(), ETL_ERROR(vector_out_of_bounds));
908
909 iterator i_element_ = to_iterator(i_element);
910
911 etl::move(i_element_ + 1, end(), i_element_);
912 destroy_back();
913
914 return i_element_;
915 }
916
917 //*********************************************************************
924 //*********************************************************************
925 iterator erase(const_iterator first, const_iterator last)
926 {
927 ETL_ASSERT_CHECK_EXTRA(cbegin() <= first && first <= last && last <= cend(), ETL_ERROR(vector_out_of_bounds));
928
929 iterator first_ = to_iterator(first);
930 iterator last_ = to_iterator(last);
931
932 if (first == begin() && last == end())
933 {
934 clear();
935 }
936 else
937 {
938 etl::move(last_, end(), first_);
939 size_t n_delete = etl::distance(first_, last_);
940
941 // Destroy the elements left over at the end.
942 etl::destroy(p_end - n_delete, p_end);
943 ETL_SUBTRACT_DEBUG_COUNT(n_delete);
944 p_end -= n_delete;
945 }
946
947 return first_;
948 }
949
950 //*************************************************************************
952 //*************************************************************************
954 {
955 if (&rhs != this)
956 {
957 assign(rhs.cbegin(), rhs.cend());
958 }
959
960 return *this;
961 }
962
963#if ETL_USING_CPP11
964 //*************************************************************************
966 //*************************************************************************
968 {
969 if (&rhs != this)
970 {
971 clear();
972 iterator itr = rhs.begin();
973 while (itr != rhs.end())
974 {
975 push_back(etl::move(*itr));
976 ++itr;
977 }
978
979 rhs.initialise();
980 }
981
982 return *this;
983 }
984#endif
985
986 //*************************************************************************
989 //*************************************************************************
990 size_type size() const
991 {
992 return size_t(p_end - p_buffer);
993 }
994
995 //*************************************************************************
998 //*************************************************************************
999 bool empty() const
1000 {
1001 return (p_end == p_buffer);
1002 }
1003
1004 //*************************************************************************
1007 //*************************************************************************
1008 bool full() const
1009 {
1010 return size() == CAPACITY;
1011 }
1012
1013 //*************************************************************************
1016 //*************************************************************************
1017 size_t available() const
1018 {
1019 return max_size() - size();
1020 }
1021
1022#ifdef ETL_IVECTOR_REPAIR_ENABLE
1023 //*************************************************************************
1025 //*************************************************************************
1026 virtual void repair() = 0;
1027#endif
1028
1029 protected:
1030
1031 //*********************************************************************
1033 //*********************************************************************
1034 ivector(T* p_buffer_, size_t MAX_SIZE)
1035 : vector_base(MAX_SIZE)
1036 , p_buffer(p_buffer_)
1037 , p_end(p_buffer_)
1038 {
1039 }
1040
1041 //*********************************************************************
1043 //*********************************************************************
1045 {
1046 if ETL_IF_CONSTEXPR(etl::is_trivially_destructible<T>::value)
1047 {
1048 ETL_RESET_DEBUG_COUNT;
1049 }
1050 else
1051 {
1053 ETL_SUBTRACT_DEBUG_COUNT(int32_t(etl::distance(p_buffer, p_end)));
1054 }
1055
1056 p_end = p_buffer;
1057 }
1058
1059 //*************************************************************************
1061 //*************************************************************************
1062 void repair_buffer(T* p_buffer_)
1063 {
1064 uintptr_t length = p_end - p_buffer;
1065 p_buffer = p_buffer_;
1066 p_end = p_buffer_ + length;
1067 }
1068
1069 pointer p_buffer;
1070 pointer p_end;
1071
1072 private:
1073
1074 //*********************************************************************
1076 //*********************************************************************
1077 void create_back()
1078 {
1080 ETL_INCREMENT_DEBUG_COUNT;
1081
1082 ++p_end;
1083 }
1084
1085 //*********************************************************************
1087 //*********************************************************************
1088 void create_back(const_reference value)
1089 {
1090 etl::create_copy_at(p_end, value);
1091 ETL_INCREMENT_DEBUG_COUNT;
1092
1093 ++p_end;
1094 }
1095
1096#if ETL_USING_CPP11
1097 //*********************************************************************
1099 //*********************************************************************
1100 void create_back(rvalue_reference value)
1101 {
1102 etl::create_copy_at(p_end, etl::move(value));
1103 ETL_INCREMENT_DEBUG_COUNT;
1104
1105 ++p_end;
1106 }
1107#endif
1108
1109 //*********************************************************************
1111 //*********************************************************************
1112 void destroy_back()
1113 {
1114 --p_end;
1115
1117 ETL_DECREMENT_DEBUG_COUNT;
1118 }
1119
1120 // Disable copy construction.
1121 ivector(const ivector&) ETL_DELETE;
1122
1123 private:
1124
1125 //*************************************************************************
1127 //*************************************************************************
1128 ETL_CONSTEXPR iterator to_iterator(const_iterator itr) const
1129 {
1130 return const_cast<iterator>(itr);
1131 }
1132 };
1133
1134 //***************************************************************************
1140 //***************************************************************************
1141 template <typename T>
1142 bool operator ==(const etl::ivector<T>& lhs, const etl::ivector<T>& rhs)
1143 {
1144 return (lhs.size() == rhs.size()) && etl::equal(lhs.begin(), lhs.end(), rhs.begin());
1145 }
1146
1147 //***************************************************************************
1153 //***************************************************************************
1154 template <typename T>
1155 bool operator !=(const etl::ivector<T>& lhs, const etl::ivector<T>& rhs)
1156 {
1157 return !(lhs == rhs);
1158 }
1159
1160 //***************************************************************************
1166 //***************************************************************************
1167 template <typename T>
1168 bool operator <(const etl::ivector<T>& lhs, const etl::ivector<T>& rhs)
1169 {
1170 return etl::lexicographical_compare(lhs.begin(), lhs.end(), rhs.begin(), rhs.end());
1171 }
1172
1173 //***************************************************************************
1179 //***************************************************************************
1180 template <typename T>
1181 bool operator >(const etl::ivector<T>& lhs, const etl::ivector<T>& rhs)
1182 {
1183 return (rhs < lhs);
1184 }
1185
1186 //***************************************************************************
1192 //***************************************************************************
1193 template <typename T>
1194 bool operator <=(const etl::ivector<T>& lhs, const etl::ivector<T>& rhs)
1195 {
1196 return !(lhs > rhs);
1197 }
1198
1199 //***************************************************************************
1205 //***************************************************************************
1206 template <typename T>
1207 bool operator >=(const etl::ivector<T>& lhs, const etl::ivector<T>& rhs)
1208 {
1209 return !(lhs < rhs);
1210 }
1211}
1212
1213#include "private/ivectorpointer.h"
1214
1215namespace etl
1216{
1217 //***************************************************************************
1222 //***************************************************************************
1223 template <typename T, const size_t MAX_SIZE_>
1224 class vector : public etl::ivector<T>
1225 {
1226 public:
1227
1228 ETL_STATIC_ASSERT((MAX_SIZE_ > 0U), "Zero capacity etl::vector is not valid");
1229
1230 static const size_t MAX_SIZE = MAX_SIZE_;
1231
1232 //*************************************************************************
1234 //*************************************************************************
1236 : etl::ivector<T>(reinterpret_cast<T*>(&buffer), MAX_SIZE)
1237 {
1238 this->initialise();
1239 }
1240
1241 //*************************************************************************
1244 //*************************************************************************
1245 explicit vector(size_t initial_size)
1246 : etl::ivector<T>(reinterpret_cast<T*>(&buffer), MAX_SIZE)
1247 {
1248 this->initialise();
1249 this->resize(initial_size);
1250 }
1251
1252 //*************************************************************************
1256 //*************************************************************************
1257 vector(size_t initial_size, typename etl::ivector<T>::parameter_t value)
1258 : etl::ivector<T>(reinterpret_cast<T*>(&buffer), MAX_SIZE)
1259 {
1260 this->initialise();
1261 this->resize(initial_size, value);
1262 }
1263
1264 //*************************************************************************
1269 //*************************************************************************
1270 template <typename TIterator>
1271 vector(TIterator first, TIterator last, typename etl::enable_if<!etl::is_integral<TIterator>::value, int>::type = 0)
1272 : etl::ivector<T>(reinterpret_cast<T*>(&buffer), MAX_SIZE)
1273 {
1274 this->assign(first, last);
1275 }
1276
1277#if ETL_HAS_INITIALIZER_LIST
1278 //*************************************************************************
1280 //*************************************************************************
1281 vector(std::initializer_list<T> init)
1282 : etl::ivector<T>(reinterpret_cast<T*>(&buffer), MAX_SIZE)
1283 {
1284 this->assign(init.begin(), init.end());
1285 }
1286#endif
1287
1288 //*************************************************************************
1290 //*************************************************************************
1291 vector(const vector& other)
1292 : etl::ivector<T>(reinterpret_cast<T*>(&buffer), MAX_SIZE)
1293 {
1294 this->assign(other.begin(), other.end());
1295 }
1296
1297 //*************************************************************************
1299 //*************************************************************************
1301 {
1302 if (&rhs != this)
1303 {
1304 this->assign(rhs.cbegin(), rhs.cend());
1305 }
1306
1307 return *this;
1308 }
1309
1310#if ETL_USING_CPP11
1311 //*************************************************************************
1313 //*************************************************************************
1314 vector(vector&& other)
1315 : etl::ivector<T>(reinterpret_cast<T*>(&buffer), MAX_SIZE)
1316 {
1317 if (this != &other)
1318 {
1319 this->initialise();
1320
1321 typename etl::ivector<T>::iterator itr = other.begin();
1322 while (itr != other.end())
1323 {
1324 this->push_back(etl::move(*itr));
1325 ++itr;
1326 }
1327
1328 other.initialise();
1329 }
1330 }
1331
1332 //*************************************************************************
1334 //*************************************************************************
1335 vector& operator = (vector&& rhs)
1336 {
1337 if (&rhs != this)
1338 {
1339 this->clear();
1340 typename etl::ivector<T>::iterator itr = rhs.begin();
1341 while (itr != rhs.end())
1342 {
1343 this->push_back(etl::move(*itr));
1344 ++itr;
1345 }
1346
1347 rhs.initialise();
1348 }
1349
1350 return *this;
1351 }
1352#endif
1353
1354 //*************************************************************************
1356 //*************************************************************************
1357#ifdef ETL_IVECTOR_REPAIR_ENABLE
1358 virtual
1359#endif
1361 {
1362 this->clear();
1363 }
1364
1365 //*************************************************************************
1367 //*************************************************************************
1368#ifdef ETL_IVECTOR_REPAIR_ENABLE
1369 virtual void repair() ETL_OVERRIDE
1370#else
1371 void repair()
1372#endif
1373 {
1374 ETL_ASSERT_OR_RETURN(etl::is_trivially_copyable<T>::value, ETL_ERROR(etl::vector_incompatible_type));
1375
1377 }
1378
1379 private:
1380
1381 typename etl::aligned_storage<sizeof(T) * MAX_SIZE, etl::alignment_of<T>::value>::type buffer;
1382 };
1383
1384 //*************************************************************************
1386 //*************************************************************************
1387#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
1388 template <typename... T>
1389 vector(T...) -> vector<typename etl::common_type_t<T...>, sizeof...(T)>;
1390#endif
1391
1392 //*************************************************************************
1394 //*************************************************************************
1395#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
1396 template <typename... T>
1397 constexpr auto make_vector(T&&... t) -> etl::vector<typename etl::common_type_t<T...>, sizeof...(T)>
1398 {
1399 return { etl::forward<T>(t)... };
1400 }
1401#endif
1402
1403 //***************************************************************************
1408 //***************************************************************************
1409 template <typename T>
1410 class vector_ext : public etl::ivector<T>
1411 {
1412 public:
1413
1414 //*************************************************************************
1416 //*************************************************************************
1417 vector_ext(void* buffer, size_t max_size)
1418 : etl::ivector<T>(reinterpret_cast<T*>(buffer), max_size)
1419 {
1420 this->initialise();
1421 }
1422
1423 //*************************************************************************
1426 //*************************************************************************
1427 explicit vector_ext(size_t initial_size, void* buffer, size_t max_size)
1428 : etl::ivector<T>(reinterpret_cast<T*>(buffer), max_size)
1429 {
1430 this->initialise();
1431 this->resize(initial_size);
1432 }
1433
1434 //*************************************************************************
1438 //*************************************************************************
1439 vector_ext(size_t initial_size, typename etl::ivector<T>::parameter_t value, void* buffer, size_t max_size)
1440 : etl::ivector<T>(reinterpret_cast<T*>(buffer), max_size)
1441 {
1442 this->initialise();
1443 this->resize(initial_size, value);
1444 }
1445
1446 //*************************************************************************
1451 //*************************************************************************
1452 template <typename TIterator>
1453 vector_ext(TIterator first, TIterator last, void* buffer, size_t max_size, typename etl::enable_if<!etl::is_integral<TIterator>::value, int>::type = 0)
1454 : etl::ivector<T>(reinterpret_cast<T*>(buffer), max_size)
1455 {
1456 this->assign(first, last);
1457 }
1458
1459#if ETL_HAS_INITIALIZER_LIST
1460 //*************************************************************************
1462 //*************************************************************************
1463 vector_ext(std::initializer_list<T> init, void* buffer, size_t max_size)
1464 : etl::ivector<T>(reinterpret_cast<T*>(buffer), max_size)
1465 {
1466 this->assign(init.begin(), init.end());
1467 }
1468#endif
1469
1470 //*************************************************************************
1472 //*************************************************************************
1473 vector_ext(const vector_ext& other, void* buffer, size_t max_size)
1474 : etl::ivector<T>(reinterpret_cast<T*>(buffer), max_size)
1475 {
1476 this->assign(other.begin(), other.end());
1477 }
1478
1479 //*************************************************************************
1481 //*************************************************************************
1483 {
1484 if (&rhs != this)
1485 {
1486 this->assign(rhs.cbegin(), rhs.cend());
1487 }
1488
1489 return *this;
1490 }
1491
1492#if ETL_USING_CPP11
1493 //*************************************************************************
1495 //*************************************************************************
1496 vector_ext(vector_ext&& other, void* buffer, size_t max_size)
1497 : etl::ivector<T>(reinterpret_cast<T*>(buffer), max_size)
1498 {
1499 if (this != &other)
1500 {
1501 this->initialise();
1502
1503 typename etl::ivector<T>::iterator itr = other.begin();
1504 while (itr != other.end())
1505 {
1506 this->push_back(etl::move(*itr));
1507 ++itr;
1508 }
1509
1510 other.initialise();
1511 }
1512 }
1513
1514 //*************************************************************************
1516 //*************************************************************************
1518 {
1519 if (&rhs != this)
1520 {
1521 this->clear();
1522
1523 typename etl::ivector<T>::iterator itr = rhs.begin();
1524 while (itr != rhs.end())
1525 {
1526 this->push_back(etl::move(*itr));
1527 ++itr;
1528 }
1529
1530 rhs.initialise();
1531 }
1532
1533 return *this;
1534 }
1535#endif
1536
1537 //*************************************************************************
1539 //*************************************************************************
1541 {
1542 this->clear();
1543 }
1544
1545 //*************************************************************************
1547 //*************************************************************************
1548#ifdef ETL_IVECTOR_REPAIR_ENABLE
1549 virtual void repair() ETL_OVERRIDE
1550#else
1551 void repair()
1552#endif
1553 {
1554 }
1555 };
1556
1557 //***************************************************************************
1562 //***************************************************************************
1563 template <typename T, const size_t MAX_SIZE_>
1564 class vector<T*, MAX_SIZE_> : public etl::ivector<T*>
1565 {
1566 public:
1567
1568 ETL_STATIC_ASSERT((MAX_SIZE_ > 0U), "Zero capacity etl::vector is not valid");
1569
1570 static const size_t MAX_SIZE = MAX_SIZE_;
1571
1572 //*************************************************************************
1574 //*************************************************************************
1576 : etl::ivector<T*>(reinterpret_cast<T**>(&buffer), MAX_SIZE)
1577 {
1578 this->initialise();
1579 }
1580
1581 //*************************************************************************
1584 //*************************************************************************
1585 explicit vector(size_t initial_size)
1586 : etl::ivector<T*>(reinterpret_cast<T**>(&buffer), MAX_SIZE)
1587 {
1588 this->initialise();
1589 this->resize(initial_size);
1590 }
1591
1592 //*************************************************************************
1596 //*************************************************************************
1597 vector(size_t initial_size, typename etl::ivector<T*>::parameter_t value)
1598 : etl::ivector<T*>(reinterpret_cast<T**>(&buffer), MAX_SIZE)
1599 {
1600 this->initialise();
1601 this->resize(initial_size, value);
1602 }
1603
1604 //*************************************************************************
1609 //*************************************************************************
1610 template <typename TIterator>
1611 vector(TIterator first, TIterator last, typename etl::enable_if<!etl::is_integral<TIterator>::value, int>::type = 0)
1612 : etl::ivector<T*>(reinterpret_cast<T**>(&buffer), MAX_SIZE)
1613 {
1614 this->assign(first, last);
1615 }
1616
1617#if ETL_HAS_INITIALIZER_LIST
1618 //*************************************************************************
1620 //*************************************************************************
1621 vector(std::initializer_list<T*> init)
1622 : etl::ivector<T*>(reinterpret_cast<T**>(&buffer), MAX_SIZE)
1623 {
1624 this->assign(init.begin(), init.end());
1625 }
1626#endif
1627
1628 //*************************************************************************
1630 //*************************************************************************
1631 vector(const vector& other)
1632 : etl::ivector<T*>(reinterpret_cast<T**>(&buffer), MAX_SIZE)
1633 {
1634 (void)etl::ivector<T*>::operator = (other);
1635 }
1636
1637 //*************************************************************************
1639 //*************************************************************************
1640 vector& operator = (const vector& rhs)
1641 {
1642 (void)etl::ivector<T*>::operator = (rhs);
1643
1644 return *this;
1645 }
1646
1647#if ETL_USING_CPP11
1648 //*************************************************************************
1650 //*************************************************************************
1651 vector(vector&& other)
1652 : etl::ivector<T*>(reinterpret_cast<T**>(&buffer), MAX_SIZE)
1653 {
1654 (void)etl::ivector<T*>::operator = (etl::move(other));
1655 }
1656
1657 //*************************************************************************
1659 //*************************************************************************
1660 vector& operator = (vector&& rhs)
1661 {
1662 (void)etl::ivector<T*>::operator = (etl::move(rhs));
1663
1664 return *this;
1665 }
1666#endif
1667
1668 //*************************************************************************
1670 //*************************************************************************
1671#ifdef ETL_IVECTOR_REPAIR_ENABLE
1672 virtual void repair() ETL_OVERRIDE
1673#else
1674 void repair()
1675#endif
1676 {
1678 }
1679
1680 private:
1681
1682 typename etl::aligned_storage<sizeof(T*) * MAX_SIZE, etl::alignment_of<T*>::value>::type buffer;
1683 };
1684
1685 //*************************************************************************
1687 //*************************************************************************
1688#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
1689 template <typename... T>
1690 vector(T*...) -> vector<typename etl::common_type_t<T*...>, sizeof...(T)>;
1691#endif
1692
1693#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
1694 template <typename... T>
1695 constexpr auto make_vector(T*... t) -> etl::vector<typename etl::common_type_t<T*...>, sizeof...(T)>
1696 {
1697 return { etl::forward<T*>(t)... };
1698 }
1699#endif
1700
1701 //***************************************************************************
1706 //***************************************************************************
1707 template <typename T>
1708 class vector_ext<T*> : public etl::ivector<T*>
1709 {
1710 public:
1711
1712 //*************************************************************************
1714 //*************************************************************************
1715 vector_ext(void* buffer, size_t max_size)
1716 : etl::ivector<T*>(reinterpret_cast<T**>(buffer), max_size)
1717 {
1718 this->initialise();
1719 }
1720
1721 //*************************************************************************
1724 //*************************************************************************
1725 vector_ext(size_t initial_size, void* buffer, size_t max_size)
1726 : etl::ivector<T*>(reinterpret_cast<T**>(buffer), max_size)
1727 {
1728 this->initialise();
1729 this->resize(initial_size);
1730 }
1731
1732 //*************************************************************************
1736 //*************************************************************************
1737 vector_ext(size_t initial_size, typename etl::ivector<T*>::parameter_t value, void* buffer, size_t max_size)
1738 : etl::ivector<T*>(reinterpret_cast<T**>(buffer), max_size)
1739 {
1740 this->initialise();
1741 this->resize(initial_size, value);
1742 }
1743
1744 //*************************************************************************
1749 //*************************************************************************
1750 template <typename TIterator>
1751 vector_ext(TIterator first, TIterator last, void* buffer, size_t max_size, typename etl::enable_if<!etl::is_integral<TIterator>::value, int>::type = 0)
1752 : etl::ivector<T*>(reinterpret_cast<T**>(buffer), max_size)
1753 {
1754 this->assign(first, last);
1755 }
1756
1757#if ETL_HAS_INITIALIZER_LIST
1758 //*************************************************************************
1760 //*************************************************************************
1761 vector_ext(std::initializer_list<T*> init, void* buffer, size_t max_size)
1762 : etl::ivector<T*>(reinterpret_cast<T**>(buffer), max_size)
1763 {
1764 this->assign(init.begin(), init.end());
1765 }
1766#endif
1767
1768 //*************************************************************************
1770 //*************************************************************************
1771 vector_ext(const vector_ext& other, void* buffer, size_t max_size)
1772 : etl::ivector<T*>(reinterpret_cast<T**>(buffer), max_size)
1773 {
1774 (void)etl::ivector<T*>::operator = (other);
1775 }
1776
1777 //*************************************************************************
1779 //*************************************************************************
1780 vector_ext(const vector_ext& other) ETL_DELETE;
1781
1782 //*************************************************************************
1784 //*************************************************************************
1785 vector_ext& operator = (const vector_ext& rhs)
1786 {
1787 (void)etl::ivector<T*>::operator = (rhs);
1788
1789 return *this;
1790 }
1791
1792#if ETL_USING_CPP11
1793 //*************************************************************************
1795 //*************************************************************************
1796 vector_ext(vector_ext&& other, void* buffer, size_t max_size)
1797 : etl::ivector<T*>(reinterpret_cast<T**>(buffer), max_size)
1798 {
1799 (void)etl::ivector<T*>::operator = (etl::move(other));
1800 }
1801
1802 //*************************************************************************
1804 //*************************************************************************
1805 vector_ext(vector_ext&& other) ETL_DELETE;
1806
1807 //*************************************************************************
1809 //*************************************************************************
1810 vector_ext& operator = (vector_ext&& rhs)
1811 {
1812 (void)etl::ivector<T*>::operator = (etl::move(rhs));
1813
1814 return *this;
1815 }
1816#endif
1817
1818 //*************************************************************************
1820 //*************************************************************************
1822 {
1823 this->clear();
1824 }
1825
1826 //*************************************************************************
1828 //*************************************************************************
1829#ifdef ETL_IVECTOR_REPAIR_ENABLE
1830 virtual void repair() ETL_OVERRIDE
1831#else
1832 void repair()
1833#endif
1834 {
1836 }
1837 };
1838
1839 //***************************************************************************
1841 //***************************************************************************
1842 template <typename T, typename U>
1843 typename etl::ivector<T>::difference_type
1844 erase(etl::ivector<T>& v, const U& value)
1845 {
1846 typename etl::ivector<T>::iterator itr = etl::remove(v.begin(), v.end(), value);
1847 typename etl::ivector<T>::difference_type d = etl::distance(itr, v.end());
1848 v.erase(itr, v.end());
1849
1850 return d;
1851 }
1852
1853 //***************************************************************************
1855 //***************************************************************************
1856 template <typename T, typename TPredicate>
1857 typename etl::ivector<T>::difference_type
1858 erase_if(etl::ivector<T>& v, TPredicate predicate)
1859 {
1860 typename etl::ivector<T>::iterator itr = etl::remove_if(v.begin(), v.end(), predicate);
1861 typename etl::ivector<T>::difference_type d = etl::distance(itr, v.end());
1862 v.erase(itr, v.end());
1863
1864 return d;
1865 }
1866}
1867
1868#endif
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:246
#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
void create_copy_at(T *p, const T &value)
Definition memory.h:1826
void create_value_at(T *p)
Definition memory.h:1805
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:1413
enable_if
Definition type_traits_generator.h:1254
is_same
Definition type_traits_generator.h:1104
remove_cv
Definition type_traits_generator.h:1031
iterator erase(const_iterator i_element)
Definition vector.h:905
void initialise()
Initialise the vector.
Definition vector.h:1044
iterator begin()
Definition vector.h:99
~vector_ext()
Destructor.
Definition vector.h:1540
const_reference at(size_t i) const
Definition vector.h:315
void assign(TIterator first, TIterator last)
Definition ivectorpointer.h:318
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:547
const_iterator begin() const
Definition vector.h:108
void push_back(const_reference value)
Definition vector.h:440
vector_ext(size_t initial_size, typename etl::ivector< T >::parameter_t value, void *buffer, size_t max_size)
Definition vector.h:1439
vector()
Constructor.
Definition vector.h:1575
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:1453
const_reverse_iterator crbegin() const
Definition vector.h:189
vector(size_t initial_size)
Definition vector.h:1245
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:1371
vector(const vector &other)
Copy constructor.
Definition vector.h:1291
vector_ext(void *buffer, size_t max_size)
Constructor.
Definition vector.h:1417
void clear()
Clears the vector.
Definition vector.h:422
vector_ext(size_t initial_size, void *buffer, size_t max_size)
Definition vector.h:1427
etl::enable_if<!etl::is_integral< TIterator >::value, void >::type assign(TIterator first, TIterator last)
Definition vector.h:388
iterator erase(const_iterator first, const_iterator last)
Definition vector.h:925
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:836
reference emplace_back(const T1 &value1, const T2 &value2)
Definition vector.h:515
pointer p_buffer
Definition vector.h:1069
vector_ext(size_t initial_size, typename etl::ivector< T * >::parameter_t value, void *buffer, size_t max_size)
Definition vector.h:1737
reference front()
Definition vector.h:325
iterator end()
Definition vector.h:117
pointer data()
Definition vector.h:365
vector(size_t initial_size, typename etl::ivector< T * >::parameter_t value)
Definition vector.h:1597
const_reverse_iterator crend() const
Definition vector.h:198
vector(size_t initial_size, typename etl::ivector< T >::parameter_t value)
Definition vector.h:1257
reference operator[](size_t i)
Definition vector.h:280
~vector_ext()
Destructor.
Definition vector.h:1821
const_iterator cbegin() const
Definition vector.h:135
ivector(T *p_buffer_, size_t MAX_SIZE)
Constructor.
Definition vector.h:1034
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:1725
vector(TIterator first, TIterator last, typename etl::enable_if<!etl::is_integral< TIterator >::value, int >::type=0)
Definition vector.h:1271
void pop_back()
Definition vector.h:563
void resize(size_t new_size, const_reference value)
Definition vector.h:221
void assign(size_t n, parameter_t value)
Definition vector.h:409
ivector(T **p_buffer_, size_t MAX_SIZE_)
Constructor.
Definition ivectorpointer.h:504
reference at(size_t i)
Definition vector.h:303
ivector & operator=(const ivector &rhs)
Assignment operator.
Definition vector.h:953
const_reference back() const
Definition vector.h:355
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:1751
reference emplace_back(const T1 &value1)
Definition vector.h:499
vector(TIterator first, TIterator last, typename etl::enable_if<!etl::is_integral< TIterator >::value, int >::type=0)
Definition vector.h:1611
void repair()
Fix the internal pointers after a low level memory copy.
Definition vector.h:1551
vector_ext(void *buffer, size_t max_size)
Constructor.
Definition vector.h:1715
vector_ext & operator=(const vector_ext &rhs)
Assignment operator.
Definition vector.h:1482
void repair_buffer(T *p_buffer_)
Fix the internal pointers after a low level memory copy.
Definition vector.h:1062
vector(const vector &other)
Copy constructor.
Definition vector.h:1631
void repair()
Fix the internal pointers after a low level memory copy.
Definition vector.h:1674
void fill(const T &value)
Fills the vector.
Definition vector.h:430
bool full() const
Definition vector.h:1008
vector_ext(const vector_ext &other, void *buffer, size_t max_size)
Copy constructor.
Definition vector.h:1473
reference emplace_back()
Definition vector.h:483
pointer p_end
Definition vector.h:1070
vector(size_t initial_size)
Definition vector.h:1585
size_type size() const
Definition vector.h:990
iterator erase(iterator i_element)
Definition vector.h:890
void repair()
Fix the internal pointers after a low level memory copy.
Definition vector.h:1832
void insert(const_iterator position, size_t n, parameter_t value)
Definition vector.h:778
bool empty() const
Definition vector.h:999
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:337
~vector()
Destructor.
Definition vector.h:1360
ETL_CONSTEXPR const_pointer data() const
Definition vector.h:374
reference back()
Definition vector.h:345
void uninitialized_resize(size_t new_size)
Definition vector.h:246
size_t available() const
Definition vector.h:1017
vector()
Constructor.
Definition vector.h:1235
iterator emplace(const_iterator position, const T1 &value1)
Emplaces a value to the vector at the specified position.
Definition vector.h:659
vector_ext(const vector_ext &other, void *buffer, size_t max_size)
Construct a copy.
Definition vector.h:1771
void reserve(size_t n)
Definition vector.h:269
vector & operator=(const vector &rhs)
Assignment operator.
Definition vector.h:1300
reverse_iterator rbegin()
Definition vector.h:153
const_reference front() const
Definition vector.h:335
iterator insert(const_iterator position, const_reference value)
Definition vector.h:576
reference emplace_back(const T1 &value1, const T2 &value2, const T3 &value3)
Definition vector.h:531
vector_ext(const vector_ext &other) ETL_DELETE
Copy constructor (Deleted).
void resize(size_t new_size)
Definition ivectorpointer.h:188
Definition vector.h:71
Definition vector.h:1225
Definition vector_base.h:122
Definition vector_base.h:80
Template deduction guides.
Definition vector.h:1411
Definition vector_base.h:66
Definition vector_base.h:108
Definition vector_base.h:94
bitset_ext
Definition absolute.h:39
bool operator>(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1190
bool operator>=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1202
bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1151
etl::ivector< T >::difference_type erase(etl::ivector< T > &v, const U &value)
erase
Definition vector.h:1844
bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1139
void destroy(const T *const p)
Destroys the object.
Definition variant_pool_generator.h:370
etl::ivector< T >::difference_type erase_if(etl::ivector< T > &v, TPredicate predicate)
erase_if
Definition vector.h:1858
bool operator<(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1163
bool operator<=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1178
iterator
Definition iterator.h:399
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:48