31#ifndef ETL_INDIRECT_VECTOR_INCLUDED
32#define ETL_INDIRECT_VECTOR_INCLUDED
40#include "static_assert.h"
55 class indirect_vector_buffer_missmatch :
public vector_exception
59 indirect_vector_buffer_missmatch(string_type file_name_, numeric_type line_number_)
60 : vector_exception(ETL_ERROR_TEXT(
"indirect_vector:buffer_missmatch", ETL_INDIRECT_VECTOR_FILE_ID
"A"), file_name_, line_number_)
77 typedef const T& const_reference;
79 typedef T&& rvalue_reference;
82 typedef const T* const_pointer;
84 typedef typename etl::ivector<T*>::iterator indirect_iterator;
85 typedef typename etl::ivector<T*>::const_iterator indirect_const_iterator;
87 typedef typename etl::ivector<T*>::size_type size_type;
88 typedef typename etl::ivector<T*>::difference_type difference_type;
93 template <
typename TUnaryFunction,
typename TReturnType =
void>
94 class unary_function_adaptor
98 unary_function_adaptor(TUnaryFunction unary_function_)
99 : unary_function(unary_function_)
103 TReturnType operator()(const_pointer indirect_itr)
105 return unary_function(*indirect_itr);
108 TUnaryFunction unary_function;
112 template <
typename TUnaryFunction>
113 class unary_function_adaptor<TUnaryFunction, void>
117 unary_function_adaptor(TUnaryFunction unary_function_)
118 : unary_function(unary_function_)
122 void operator()(const_pointer indirect_itr)
124 unary_function(*indirect_itr);
127 TUnaryFunction unary_function;
133 template <
typename TBinaryFunction,
typename TReturnType =
void>
134 class binary_function_adaptor
138 binary_function_adaptor(TBinaryFunction binary_function_)
139 : binary_function(binary_function_)
143 TReturnType operator()(const_pointer indirect_itr_lhs,
144 const_pointer indirect_itr_rhs)
146 return binary_function(*indirect_itr_lhs, *indirect_itr_rhs);
149 TBinaryFunction binary_function;
153 template <
typename TBinaryFunction>
154 class binary_function_adaptor<TBinaryFunction, void>
158 binary_function_adaptor(TBinaryFunction binary_function_)
159 : binary_function(binary_function_)
163 void operator()(const_pointer indirect_itr_lhs,
164 const_pointer indirect_itr_rhs)
166 binary_function(*indirect_itr_lhs, *indirect_itr_rhs);
169 TBinaryFunction binary_function;
175 class iterator :
public etl::iterator<ETL_OR_STD::random_access_iterator_tag, T>
179 friend class iindirect_vector;
180 friend class const_iterator;
187 iterator(
const iterator& other)
188 : lookup_itr(other.lookup_itr)
192 iterator& operator ++()
198 iterator operator ++(
int)
200 iterator temp(*
this);
205 iterator& operator --()
211 iterator operator --(
int)
213 iterator temp(*
this);
218 iterator& operator =(
const iterator& other)
220 lookup_itr = other.lookup_itr;
224 iterator operator +=(size_type n)
230 iterator operator -=(size_type n)
236 reference operator *()
const
241 pointer operator &()
const
243 return &(**lookup_itr);
246 pointer operator ->()
const
248 return &(**lookup_itr);
251 friend iterator operator +(
const iterator& lhs, difference_type offset)
253 iterator result(lhs);
258 friend iterator operator -(
const iterator& lhs, difference_type offset)
260 iterator result(lhs);
265 indirect_iterator indirection()
270 indirect_const_iterator indirection()
const
275 friend difference_type operator -(
const iterator& lhs,
const iterator& rhs)
277 return lhs.lookup_itr - rhs.lookup_itr;
280 friend bool operator == (
const iterator& lhs,
const iterator& rhs)
282 return lhs.lookup_itr == rhs.lookup_itr;
285 friend bool operator != (
const iterator& lhs,
const iterator& rhs)
287 return !(lhs == rhs);
290 friend bool operator < (
const iterator& lhs,
const iterator& rhs)
292 return lhs.lookup_itr < rhs.lookup_itr;
297 iterator(indirect_iterator itr_)
302 indirect_iterator lookup_itr;
308 class const_iterator :
public etl::iterator<ETL_OR_STD::random_access_iterator_tag, const T>
312 friend class iindirect_vector;
319 const_iterator(
const const_iterator& other)
320 : lookup_itr(other.lookup_itr)
325 : lookup_itr(other.lookup_itr)
329 const_iterator& operator ++()
335 const_iterator operator ++(
int)
337 const_iterator temp(*
this);
342 const_iterator& operator --()
348 const_iterator operator --(
int)
350 const_iterator temp(*
this);
355 const_iterator operator +=(size_type n)
361 const_iterator operator -=(size_type n)
367 const_iterator& operator =(
const const_iterator& other)
369 lookup_itr = other.lookup_itr;
373 const_reference operator *()
const
378 const_pointer operator &()
const
380 return &(**lookup_itr);
383 const_pointer operator ->()
const
385 return &(**lookup_itr);
388 indirect_const_iterator indirection()
const
393 friend const_iterator operator +(
const const_iterator& lhs, difference_type offset)
395 const_iterator result(lhs);
400 friend const_iterator operator -(
const const_iterator& lhs, difference_type offset)
402 const_iterator result(lhs);
407 friend difference_type operator -(
const const_iterator& lhs,
const const_iterator& rhs)
409 return lhs.lookup_itr - rhs.lookup_itr;
412 friend bool operator == (
const const_iterator& lhs,
const const_iterator& rhs)
414 return lhs.lookup_itr == rhs.lookup_itr;
417 friend bool operator != (
const const_iterator& lhs,
const const_iterator& rhs)
419 return !(lhs == rhs);
422 friend bool operator < (
const const_iterator& lhs,
const const_iterator& rhs)
424 return lhs.lookup_itr < rhs.lookup_itr;
429 typedef typename etl::ivector<T*>::const_iterator lookup_itr_t;
431 const_iterator(indirect_const_iterator itr_)
436 indirect_const_iterator lookup_itr;
439 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
440 typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
508 return reverse_iterator(
end());
517 return const_reverse_iterator(
end());
526 return reverse_iterator(
begin());
533 const_reverse_iterator
rend()
const
535 return const_reverse_iterator(
begin());
544 return const_reverse_iterator(
cend());
551 const_reverse_iterator
crend()
const
553 return const_reverse_iterator(
cbegin());
574 void resize(
size_t new_size, const_reference value)
580 if (new_size >
size())
582 size_type n = new_size -
size();
586 T* p = storage.create<T>(value);
592 size_type n =
size() - new_size;
639 reference
at(
size_t i)
641 return *lookup.at(i);
650 const_reference
at(
size_t i)
const
652 return *lookup.at(i);
661 return *(lookup.front());
670 return *(lookup.front());
679 return *(lookup.back());
688 return *(lookup.back());
698 template <
typename TIterator>
699 void assign(TIterator first, TIterator last)
701 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");
703#if ETL_IS_DEBUG_BUILD
704 difference_type d = etl::distance(first, last);
710 while (first != last)
712 T* p = storage.create<T>(*first);
732 T* p = storage.create<T>(value);
762 T* p = storage.create<T>(value);
776 T* p = storage.
create<T>(etl::move(value));
781#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_VECTOR_FORCE_CPP03_IMPLEMENTATION)
787 template <
typename ... Args>
790 T* p = storage.
create<T>(etl::forward<Args>(args)...);
802 T* p = storage.create<T>(T());
812 template <
typename T1>
815 T* p = storage.create<T>(T(value1));
825 template <
typename T1,
typename T2>
828 T* p = storage.create<T>(T(value1, value2));
838 template <
typename T1,
typename T2,
typename T3>
839 reference
emplace_back(
const T1& value1,
const T2& value2,
const T3& value3)
841 T* p = storage.create<T>(T(value1, value2, value3));
851 template <
typename T1,
typename T2,
typename T3,
typename T4>
852 reference
emplace_back(
const T1& value1,
const T2& value2,
const T3& value3,
const T4& value4)
854 T* p = storage.create<T>(T(value1, value2, value3, value4));
867 reference
object =
back();
882 T* p = storage.create<T>(T(value));
883 position =
iterator(lookup.insert(position.lookup_itr, p));
899 T* p = storage.
create<T>(T(etl::move(value)));
909#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_VECTOR_FORCE_CPP03_IMPLEMENTATION)
910 template <
typename ... Args>
911 iterator
emplace(iterator position, Args && ... args)
915 T* p = storage.
create<T>(T(etl::forward<Args>(args)...));
916 position = iterator(lookup.
insert(position.lookup_itr, p));
925 T* p = storage.create<T>(T());
926 position =
iterator(lookup.insert(position.lookup_itr, p));
931 template <
typename T1>
936 T* p = storage.
create<T>(T(value1));
942 template <
typename T1,
typename T2>
943 iterator
emplace(iterator position,
const T1& value1,
const T2& value2)
947 T* p = storage.
create<T>(T(value1, value2));
948 position = iterator(lookup.
insert(position.lookup_itr, p));
953 template <
typename T1,
typename T2,
typename T3>
958 T* p = storage.create<T>(T(value1, value2, value3));
959 position =
iterator(lookup.insert(position.lookup_itr, p));
964 template <
typename T1,
typename T2,
typename T3,
typename T4>
969 T* p = storage.create<T>(T(value1, value2, value3, value4));
970 position =
iterator(lookup.insert(position.lookup_itr, p));
990 typename etl::ivector<T*>::iterator lookup_itr = position_.lookup_itr;
991 lookup.insert(lookup_itr, n, ETL_NULLPTR);
995 T* p = storage.create<T>(value);
1009 template <
class TIterator>
1012 size_t count = size_t(etl::distance(first, last));
1017 typename etl::ivector<T*>::iterator lookup_itr =
to_iterator(position).lookup_itr;
1018 lookup.insert(lookup_itr, count, ETL_NULLPTR);
1020 while (first != last)
1022 T* p = storage.create<T>(*first);
1039 return iterator(lookup.erase(i_element.lookup_itr));
1051 return iterator(lookup.erase(i_element.lookup_itr));
1066 while (element != last)
1072 lookup.erase(first.lookup_itr, last.lookup_itr);
1100 while (itr != rhs.end())
1119 return lookup.size();
1128 return lookup.capacity();
1137 return lookup.empty();
1146 return lookup.full();
1155 return lookup.max_size();
1164 return lookup.available();
1183 if ETL_IF_CONSTEXPR(etl::is_trivially_destructible<T>::value)
1185 storage.release_all();
1191 while (itr !=
end())
1213 while (itr != other.end())
1224 etl::ivector<T*>& lookup;
1225 etl::ipool& storage;
1235#if defined(ETL_POLYMORPHIC_INDIRECT_VECTOR) || defined(ETL_POLYMORPHIC_CONTAINERS)
1252 return iterator(
const_cast<indirect_iterator
>(itr.lookup_itr));
1263 template <
typename T>
1276 template <
typename T>
1279 return !(lhs == rhs);
1289 template <
typename T>
1292 return etl::lexicographical_compare(lhs.
begin(), lhs.
end(), rhs.
begin(), rhs.
end());
1302 template <
typename T>
1315 template <
typename T>
1318 return !(lhs > rhs);
1328 template <
typename T>
1331 return !(lhs < rhs);
1340 template <
typename T, const
size_t MAX_SIZE_>
1345 ETL_STATIC_ASSERT((MAX_SIZE_ > 0U),
"Zero capacity etl::indirect_vector is not valid");
1347 static ETL_CONSTANT
size_t MAX_SIZE = MAX_SIZE_;
1364 this->
resize(initial_size);
1372 indirect_vector(
size_t initial_size,
typename etl::iindirect_vector<T>::parameter_t value)
1375 this->
resize(initial_size, value);
1384 template <
typename TIterator>
1388 this->
assign(first, last);
1391#if ETL_HAS_INITIALIZER_LIST
1398 this->
assign(init.begin(), init.end());
1431 this->move_container(etl::move(other));
1439 this->move_container(etl::move(rhs));
1459 template <
typename T, const
size_t MAX_SIZE_>
1460 ETL_CONSTANT
size_t indirect_vector<T, MAX_SIZE_>::MAX_SIZE;
1465#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
1466 template <
typename T,
typename... Ts>
1467 indirect_vector(T, Ts...)
1468 ->indirect_vector<etl::enable_if_t<(etl::is_same_v<T, Ts> && ...), T>, 1U +
sizeof...(Ts)>;
1474#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
1475 template <
typename... T>
1476 constexpr auto make_indirect_vector(T&&... t) ->
etl::indirect_vector<
typename etl::common_type_t<T...>,
sizeof...(T)>
1478 return { etl::forward<T>(t)... };
1488 template <
typename T>
1510 this->
resize(initial_size);
1522 this->
resize(initial_size, value);
1531 template <
typename TIterator>
1536 this->
assign(first, last);
1539#if ETL_HAS_INITIALIZER_LIST
1547 this->
assign(init.begin(), init.end());
1587 this->move_container(etl::move(other));
1600 this->move_container(etl::move(rhs));
const_iterator.
Definition indirect_vector.h:309
iterator.
Definition indirect_vector.h:176
ETL_CONSTEXPR14 bool operator==(const etl::expected< TValue, TError > &lhs, const etl::expected< TValue2, TError2 > &rhs)
Equivalence operators.
Definition expected.h:962
#define ETL_ASSERT(b, e)
Definition error_handler.h:356
reference at(size_t i)
Definition indirect_vector.h:639
const_reverse_iterator crend() const
Definition indirect_vector.h:551
void resize(size_t new_size)
Definition indirect_vector.h:562
iterator to_iterator(const_iterator itr) const
Convert from const_iterator to iterator.
Definition indirect_vector.h:1250
void clear()
Clears the indirect_vector.
Definition indirect_vector.h:740
indirect_vector_ext & operator=(const indirect_vector_ext &rhs)
Assignment operator.
Definition indirect_vector.h:1569
indirect_vector_ext(size_t initial_size, typename etl::iindirect_vector< T >::parameter_t value, etl::ivector< T * > &lookup_, etl::ipool &pool_)
Definition indirect_vector.h:1518
~indirect_vector()
Destructor.
Definition indirect_vector.h:1448
void assign(TIterator first, TIterator last)
Definition indirect_vector.h:699
size_type available() const
Definition indirect_vector.h:1162
indirect_vector_ext(const indirect_vector_ext &other) ETL_DELETE
Copy constructor (Deleted).
reference back()
Definition indirect_vector.h:677
iindirect_vector & operator=(const iindirect_vector &rhs)
Assignment operator.
Definition indirect_vector.h:1080
iterator end()
Definition indirect_vector.h:470
const_iterator end() const
Definition indirect_vector.h:479
indirect_vector_ext(size_t initial_size, etl::ivector< T * > &lookup_, etl::ipool &pool_)
Definition indirect_vector.h:1506
bool empty() const
Definition indirect_vector.h:1135
indirect_vector(size_t initial_size, typename etl::iindirect_vector< T >::parameter_t value)
Definition indirect_vector.h:1372
reference emplace_back(const T1 &value1, const T2 &value2, const T3 &value3)
Definition indirect_vector.h:839
reverse_iterator rend()
Definition indirect_vector.h:524
indirect_vector_ext(const indirect_vector_ext &other, etl::ivector< T * > &lookup_, etl::ipool &pool_)
Construct a copy.
Definition indirect_vector.h:1554
reference emplace_back(const T1 &value1, const T2 &value2, const T3 &value3, const T4 &value4)
Definition indirect_vector.h:852
iterator erase(const_iterator i_element)
Definition indirect_vector.h:1047
void reserve(size_t n)
Definition indirect_vector.h:607
void pop_back()
Removes an element from the end of the indirect_vector.
Definition indirect_vector.h:863
bool full() const
Definition indirect_vector.h:1144
size_type size() const
Definition indirect_vector.h:1117
const_iterator cend() const
Definition indirect_vector.h:497
iterator emplace(iterator position)
Emplaces a value to the vector at the specified position.
Definition indirect_vector.h:921
void assign(size_t n, parameter_t value)
Definition indirect_vector.h:724
indirect_vector(const indirect_vector &other)
Copy constructor.
Definition indirect_vector.h:1405
const_iterator cbegin() const
Definition indirect_vector.h:488
const_reference back() const
Definition indirect_vector.h:686
const_reference front() const
Definition indirect_vector.h:668
indirect_vector_ext(etl::ivector< T * > &lookup_, etl::ipool &pool_)
Constructor.
Definition indirect_vector.h:1496
indirect_vector(size_t initial_size)
Definition indirect_vector.h:1361
~iindirect_vector()
Destructor.
Definition indirect_vector.h:1241
indirect_vector()
Constructor.
Definition indirect_vector.h:1352
size_type max_size() const
Definition indirect_vector.h:1153
const_iterator begin() const
Definition indirect_vector.h:461
void initialise()
Initialise the indirect_vector.
Definition indirect_vector.h:1181
~indirect_vector_ext()
Destructor.
Definition indirect_vector.h:1609
const_reference at(size_t i) const
Definition indirect_vector.h:650
reference emplace_back(const T1 &value1, const T2 &value2)
Definition indirect_vector.h:826
iterator begin()
Definition indirect_vector.h:452
void fill(const T &value)
Fills the buffer.
Definition indirect_vector.h:748
iterator insert(const_iterator position, TIterator first, TIterator last)
Definition indirect_vector.h:1010
const_reverse_iterator rend() const
Definition indirect_vector.h:533
const_reverse_iterator rbegin() const
Definition indirect_vector.h:515
void resize(size_t new_size, const_reference value)
Definition indirect_vector.h:574
iterator erase(iterator i_element)
Definition indirect_vector.h:1035
indirect_vector(TIterator first, TIterator last)
Definition indirect_vector.h:1385
reverse_iterator rbegin()
Definition indirect_vector.h:506
const_reverse_iterator crbegin() const
Definition indirect_vector.h:542
indirect_vector & operator=(const indirect_vector &rhs)
Assignment operator.
Definition indirect_vector.h:1414
iterator erase(const_iterator first, const_iterator last)
Definition indirect_vector.h:1062
reference emplace_back(const T1 &value1)
Definition indirect_vector.h:813
reference front()
Definition indirect_vector.h:659
indirect_vector_ext(TIterator first, TIterator last, etl::ivector< T * > &lookup_, etl::ipool &pool_)
Definition indirect_vector.h:1532
reference emplace_back()
Definition indirect_vector.h:800
size_type capacity() const
Definition indirect_vector.h:1126
iindirect_vector(etl::ivector< T * > &lookup_, etl::ipool &storage_)
Constructor.
Definition indirect_vector.h:1172
reference operator[](size_t i)
Definition indirect_vector.h:618
void push_back(const_reference value)
Definition indirect_vector.h:758
iterator insert(const_iterator position, const_reference value)
Definition indirect_vector.h:878
iterator insert(const_iterator position, size_t n, parameter_t value)
Definition indirect_vector.h:983
Definition indirect_vector.h:72
Definition indirect_vector.h:1342
Template deduction guides.
Definition indirect_vector.h:1490
ETL_CONSTEXPR17 etl::enable_if<!etl::is_same< T, etl::nullptr_t >::value, T >::type * addressof(T &t)
Definition addressof.h:52
size_t capacity() const
Returns the maximum number of items in the pool.
Definition ipool.h:488
T * create()
Definition ipool.h:333
is_same
Definition type_traits_generator.h:1104
remove_cv
Definition type_traits_generator.h:1031
void push_back(parameter_t value)
Definition ivectorpointer.h:347
size_type capacity() const
Definition vector_base.h:131
iterator insert(const_iterator position, parameter_t value)
Definition ivectorpointer.h:391
Definition indirect_vector.h:56
Definition vector_base.h:80
Definition vector_base.h:66
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
bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1139
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