31#ifndef ETL_INDIRECT_VECTOR_INCLUDED
32#define ETL_INDIRECT_VECTOR_INCLUDED
39#include "static_assert.h"
56 class indirect_vector_buffer_missmatch :
public vector_exception
60 indirect_vector_buffer_missmatch(string_type file_name_, numeric_type line_number_)
61 : vector_exception(ETL_ERROR_TEXT(
"indirect_vector:buffer_missmatch", ETL_INDIRECT_VECTOR_FILE_ID
"A"), file_name_, line_number_)
79 typedef const T& const_reference;
81 typedef T&& rvalue_reference;
84 typedef const T* const_pointer;
86 typedef typename etl::ivector<T*>::iterator indirect_iterator;
87 typedef typename etl::ivector<T*>::const_iterator indirect_const_iterator;
89 typedef typename etl::ivector<T*>::size_type size_type;
90 typedef typename etl::ivector<T*>::difference_type difference_type;
95 template <
typename TUnaryFunction,
typename TReturnType =
void>
96 class unary_function_adaptor
100 unary_function_adaptor(TUnaryFunction unary_function_)
101 : unary_function(unary_function_)
105 TReturnType operator()(const_pointer indirect_itr)
107 return unary_function(*indirect_itr);
110 TUnaryFunction unary_function;
114 template <
typename TUnaryFunction>
115 class unary_function_adaptor<TUnaryFunction, void>
119 unary_function_adaptor(TUnaryFunction unary_function_)
120 : unary_function(unary_function_)
124 void operator()(const_pointer indirect_itr)
126 unary_function(*indirect_itr);
129 TUnaryFunction unary_function;
135 template <
typename TBinaryFunction,
typename TReturnType =
void>
136 class binary_function_adaptor
140 binary_function_adaptor(TBinaryFunction binary_function_)
141 : binary_function(binary_function_)
145 TReturnType operator()(const_pointer indirect_itr_lhs, const_pointer indirect_itr_rhs)
147 return binary_function(*indirect_itr_lhs, *indirect_itr_rhs);
150 TBinaryFunction binary_function;
154 template <
typename TBinaryFunction>
155 class binary_function_adaptor<TBinaryFunction, void>
159 binary_function_adaptor(TBinaryFunction binary_function_)
160 : binary_function(binary_function_)
164 void operator()(const_pointer indirect_itr_lhs, 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+=(difference_type n)
230 iterator operator-=(difference_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;
295 friend bool operator<=(
const iterator& lhs,
const iterator& rhs)
297 return lhs.lookup_itr <= rhs.lookup_itr;
302 iterator(indirect_iterator itr_)
307 indirect_iterator lookup_itr;
313 class const_iterator :
public etl::iterator<ETL_OR_STD::random_access_iterator_tag, const T>
317 friend class iindirect_vector;
324 const_iterator(
const const_iterator& other)
325 : lookup_itr(other.lookup_itr)
330 : lookup_itr(other.lookup_itr)
334 const_iterator& operator++()
340 const_iterator operator++(
int)
342 const_iterator temp(*
this);
347 const_iterator& operator--()
353 const_iterator operator--(
int)
355 const_iterator temp(*
this);
360 const_iterator operator+=(difference_type n)
366 const_iterator operator-=(difference_type n)
372 const_iterator& operator=(
const const_iterator& other)
374 lookup_itr = other.lookup_itr;
378 const_reference operator*()
const
383 const_pointer operator&()
const
385 return &(**lookup_itr);
388 const_pointer operator->()
const
390 return &(**lookup_itr);
393 indirect_const_iterator indirection()
const
398 friend const_iterator operator+(
const const_iterator& lhs, difference_type offset)
400 const_iterator result(lhs);
405 friend const_iterator operator-(
const const_iterator& lhs, difference_type offset)
407 const_iterator result(lhs);
412 friend difference_type 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.lookup_itr == rhs.lookup_itr;
422 friend bool operator!=(
const const_iterator& lhs,
const const_iterator& rhs)
424 return !(lhs == rhs);
427 friend bool operator<(
const const_iterator& lhs,
const const_iterator& rhs)
429 return lhs.lookup_itr < rhs.lookup_itr;
432 friend bool operator<=(
const const_iterator& lhs,
const const_iterator& rhs)
434 return lhs.lookup_itr <= rhs.lookup_itr;
439 typedef typename etl::ivector<T*>::const_iterator lookup_itr_t;
441 const_iterator(indirect_const_iterator itr_)
446 indirect_const_iterator lookup_itr;
449 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
450 typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
519 return reverse_iterator(
end());
529 return const_reverse_iterator(
end());
538 return reverse_iterator(
begin());
545 const_reverse_iterator
rend()
const
547 return const_reverse_iterator(
begin());
558 return const_reverse_iterator(
cend());
565 const_reverse_iterator
crend()
const
567 return const_reverse_iterator(
cbegin());
589 void resize(
size_t new_size, const_reference value)
595 if (new_size >
size())
597 size_type n = new_size -
size();
601 T* p = storage.create<T>(value);
607 size_type n =
size() - new_size;
656 reference
at(
size_t i)
658 return *lookup.at(i);
668 const_reference
at(
size_t i)
const
670 return *lookup.at(i);
681 return *(lookup.front());
692 return *(lookup.front());
703 return *(lookup.back());
714 return *(lookup.back());
726 template <
typename TIterator>
727 void assign(TIterator first, TIterator last)
729 ETL_STATIC_ASSERT((etl::is_same<
typename etl::remove_cv<T>::type,
731 "Iterator type does not match container type");
733#if ETL_IS_DEBUG_BUILD
734 difference_type d = etl::distance(first, last);
740 while (first != last)
742 T* p = storage.create<T>(*first);
763 T* p = storage.create<T>(value);
794 T* p = storage.create<T>(value);
809 T* p = storage.
create<T>(etl::move(value));
814#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_VECTOR_FORCE_CPP03_IMPLEMENTATION)
821 template <
typename... Args>
824 ETL_ASSERT_CHECK_PUSH_POP(!
full(), ETL_ERROR(vector_full));
826 T* p = storage.
create<T>(etl::forward<Args>(args)...);
841 T* p = storage.create<T>();
852 template <
typename T1>
857 T* p = storage.create<T>(value1);
868 template <
typename T1,
typename T2>
873 T* p = storage.create<T>(value1, value2);
884 template <
typename T1,
typename T2,
typename T3>
885 reference
emplace_back(
const T1& value1,
const T2& value2,
const T3& value3)
889 T* p = storage.create<T>(value1, value2, value3);
900 template <
typename T1,
typename T2,
typename T3,
typename T4>
901 reference
emplace_back(
const T1& value1,
const T2& value2,
const T3& value3,
const T4& value4)
905 T* p = storage.create<T>(value1, value2, value3, value4);
918 reference
object =
back();
935 T* p = storage.create<T>(value);
936 position =
iterator(lookup.insert(position.lookup_itr, p));
954 T* p = storage.
create<T>(etl::move(value));
964#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_VECTOR_FORCE_CPP03_IMPLEMENTATION)
965 template <
typename... Args>
966 iterator
emplace(const_iterator position, Args&&... args)
969 ETL_ASSERT_CHECK_EXTRA(
cbegin() <= position && position <=
cend(), ETL_ERROR(vector_out_of_bounds));
971 T* p = storage.
create<T>(etl::forward<Args>(args)...);
972 position = iterator(lookup.
insert(position.lookup_itr, p));
982 T* p = storage.create<T>();
983 position =
iterator(lookup.insert(position.lookup_itr, p));
988 template <
typename T1>
994 T* p = storage.
create<T>(value1);
1000 template <
typename T1,
typename T2>
1001 iterator
emplace(const_iterator position,
const T1& value1,
const T2& value2)
1004 ETL_ASSERT_CHECK_EXTRA(
cbegin() <= position && position <=
cend(), ETL_ERROR(vector_out_of_bounds));
1006 T* p = storage.
create<T>(value1, value2);
1007 position = iterator(lookup.
insert(position.lookup_itr, p));
1012 template <
typename T1,
typename T2,
typename T3>
1016 ETL_ASSERT_CHECK_EXTRA(
cbegin() <= position && position <=
cend(), ETL_ERROR(vector_out_of_bounds));
1018 T* p = storage.create<T>(value1, value2, value3);
1019 position =
iterator(lookup.insert(position.lookup_itr, p));
1024 template <
typename T1,
typename T2,
typename T3,
typename T4>
1028 ETL_ASSERT_CHECK_EXTRA(
cbegin() <= position && position <=
cend(), ETL_ERROR(vector_out_of_bounds));
1030 T* p = storage.create<T>(value1, value2, value3, value4);
1031 position =
iterator(lookup.insert(position.lookup_itr, p));
1053 typename etl::ivector<T*>::iterator lookup_itr = position_.lookup_itr;
1054 lookup.insert(lookup_itr, n, ETL_NULLPTR);
1058 T* p = storage.create<T>(value);
1073 template <
class TIterator>
1076 size_t count = size_t(etl::distance(first, last));
1082 typename etl::ivector<T*>::iterator lookup_itr =
to_iterator(position).lookup_itr;
1083 lookup.insert(lookup_itr, count, ETL_NULLPTR);
1085 while (first != last)
1087 T* p = storage.create<T>(*first);
1107 return iterator(lookup.erase(i_element.lookup_itr));
1122 return iterator(lookup.erase(i_element.lookup_itr));
1140 while (element != last)
1146 lookup.erase(first.lookup_itr, last.lookup_itr);
1174 while (itr != rhs.end())
1193 return lookup.size();
1202 return lookup.capacity();
1211 return lookup.empty();
1220 return lookup.full();
1229 return lookup.max_size();
1238 return lookup.available();
1257 if ETL_IF_CONSTEXPR (etl::is_trivially_destructible<T>::value)
1259 storage.release_all();
1265 while (itr !=
end())
1287 while (itr != other.end())
1298 etl::ivector<T*>& lookup;
1299 etl::ipool& storage;
1309#if defined(ETL_POLYMORPHIC_INDIRECT_VECTOR) || defined(ETL_POLYMORPHIC_CONTAINERS)
1329 return iterator(
const_cast<indirect_iterator
>(itr.lookup_itr));
1340 template <
typename T>
1353 template <
typename T>
1356 return !(lhs == rhs);
1366 template <
typename T>
1369 return etl::lexicographical_compare(lhs.
begin(), lhs.
end(), rhs.
begin(), rhs.
end());
1380 template <
typename T>
1394 template <
typename T>
1397 return !(lhs > rhs);
1408 template <
typename T>
1411 return !(lhs < rhs);
1420 template <
typename T, const
size_t MAX_SIZE_>
1425 ETL_STATIC_ASSERT((MAX_SIZE_ > 0U),
"Zero capacity etl::indirect_vector is not valid");
1427 static ETL_CONSTANT
size_t MAX_SIZE = MAX_SIZE_;
1444 this->
resize(initial_size);
1452 indirect_vector(
size_t initial_size,
typename etl::iindirect_vector<T>::parameter_t value)
1455 this->
resize(initial_size, value);
1464 template <
typename TIterator>
1468 this->
assign(first, last);
1471#if ETL_HAS_INITIALIZER_LIST
1478 this->
assign(init.begin(), init.end());
1511 this->move_container(etl::move(other));
1519 this->move_container(etl::move(rhs));
1539 template <
typename T, const
size_t MAX_SIZE_>
1540 ETL_CONSTANT
size_t indirect_vector<T, MAX_SIZE_>::MAX_SIZE;
1545#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
1546 template <
typename T,
typename... Ts>
1547 indirect_vector(T, Ts...) -> indirect_vector<etl::enable_if_t<(etl::is_same_v<T, Ts> && ...), T>, 1U +
sizeof...(Ts)>;
1553#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
1554 template <
typename... T>
1555 constexpr auto make_indirect_vector(T&&... t) ->
etl::indirect_vector<
typename etl::common_type_t<T...>,
sizeof...(T)>
1557 return {etl::forward<T>(t)...};
1567 template <
typename T>
1589 this->
resize(initial_size);
1601 this->
resize(initial_size, value);
1610 template <
typename TIterator>
1615 this->
assign(first, last);
1618#if ETL_HAS_INITIALIZER_LIST
1626 this->
assign(init.begin(), init.end());
1666 this->move_container(etl::move(other));
1679 this->move_container(etl::move(rhs));
const_iterator.
Definition indirect_vector.h:314
iterator.
Definition indirect_vector.h:176
ETL_CONSTEXPR14 bool operator!=(const etl::bitset< Active_Bits, TElement > &lhs, const etl::bitset< Active_Bits, TElement > &rhs) ETL_NOEXCEPT
Definition bitset_new.h:2529
#define ETL_ASSERT(b, e)
Definition error_handler.h:511
reference at(size_t i)
Definition indirect_vector.h:656
const_reverse_iterator crend() const
Definition indirect_vector.h:565
void resize(size_t new_size)
Definition indirect_vector.h:576
iterator to_iterator(const_iterator itr) const
Convert from const_iterator to iterator.
Definition indirect_vector.h:1327
void clear()
Clears the indirect_vector.
Definition indirect_vector.h:771
indirect_vector_ext & operator=(const indirect_vector_ext &rhs)
Assignment operator.
Definition indirect_vector.h:1648
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:1597
~indirect_vector()
Destructor.
Definition indirect_vector.h:1528
void assign(TIterator first, TIterator last)
Definition indirect_vector.h:727
size_type available() const
Definition indirect_vector.h:1236
const_reference operator[](size_t i) const
Definition indirect_vector.h:644
indirect_vector_ext(const indirect_vector_ext &other) ETL_DELETE
Copy constructor (Deleted).
reference back()
Definition indirect_vector.h:701
iindirect_vector & operator=(const iindirect_vector &rhs)
Assignment operator.
Definition indirect_vector.h:1154
iterator end()
Definition indirect_vector.h:480
const_iterator end() const
Definition indirect_vector.h:489
indirect_vector_ext(size_t initial_size, etl::ivector< T * > &lookup_, etl::ipool &pool_)
Definition indirect_vector.h:1585
bool empty() const
Definition indirect_vector.h:1209
indirect_vector(size_t initial_size, typename etl::iindirect_vector< T >::parameter_t value)
Definition indirect_vector.h:1452
reference emplace_back(const T1 &value1, const T2 &value2, const T3 &value3)
Definition indirect_vector.h:885
reverse_iterator rend()
Definition indirect_vector.h:536
indirect_vector_ext(const indirect_vector_ext &other, etl::ivector< T * > &lookup_, etl::ipool &pool_)
Construct a copy.
Definition indirect_vector.h:1633
reference emplace_back(const T1 &value1, const T2 &value2, const T3 &value3, const T4 &value4)
Definition indirect_vector.h:901
iterator erase(const_iterator i_element)
Definition indirect_vector.h:1116
void reserve(size_t n)
Definition indirect_vector.h:623
void pop_back()
Removes an element from the end of the indirect_vector.
Definition indirect_vector.h:914
bool full() const
Definition indirect_vector.h:1218
size_type size() const
Definition indirect_vector.h:1191
const_iterator cend() const
Definition indirect_vector.h:507
void assign(size_t n, parameter_t value)
Definition indirect_vector.h:755
indirect_vector(const indirect_vector &other)
Copy constructor.
Definition indirect_vector.h:1485
const_iterator cbegin() const
Definition indirect_vector.h:498
const_reference back() const
Definition indirect_vector.h:712
const_reference front() const
Definition indirect_vector.h:690
indirect_vector_ext(etl::ivector< T * > &lookup_, etl::ipool &pool_)
Constructor.
Definition indirect_vector.h:1575
indirect_vector(size_t initial_size)
Definition indirect_vector.h:1441
~iindirect_vector()
Destructor.
Definition indirect_vector.h:1318
indirect_vector()
Constructor.
Definition indirect_vector.h:1432
size_type max_size() const
Definition indirect_vector.h:1227
const_iterator begin() const
Definition indirect_vector.h:471
void initialise()
Initialise the indirect_vector.
Definition indirect_vector.h:1255
~indirect_vector_ext()
Destructor.
Definition indirect_vector.h:1688
const_reference at(size_t i) const
Definition indirect_vector.h:668
reference emplace_back(const T1 &value1, const T2 &value2)
Definition indirect_vector.h:869
iterator begin()
Definition indirect_vector.h:462
void fill(const T &value)
Fills the buffer.
Definition indirect_vector.h:779
iterator insert(const_iterator position, TIterator first, TIterator last)
Definition indirect_vector.h:1074
iterator emplace(const_iterator position)
Emplaces a value to the vector at the specified position.
Definition indirect_vector.h:977
const_reverse_iterator rend() const
Definition indirect_vector.h:545
const_reverse_iterator rbegin() const
Definition indirect_vector.h:527
void resize(size_t new_size, const_reference value)
Definition indirect_vector.h:589
iterator erase(iterator i_element)
Definition indirect_vector.h:1101
indirect_vector(TIterator first, TIterator last)
Definition indirect_vector.h:1465
reverse_iterator rbegin()
Definition indirect_vector.h:517
const_reverse_iterator crbegin() const
Definition indirect_vector.h:556
indirect_vector & operator=(const indirect_vector &rhs)
Assignment operator.
Definition indirect_vector.h:1494
iterator erase(const_iterator first, const_iterator last)
Definition indirect_vector.h:1134
reference emplace_back(const T1 &value1)
Definition indirect_vector.h:853
reference front()
Definition indirect_vector.h:679
indirect_vector_ext(TIterator first, TIterator last, etl::ivector< T * > &lookup_, etl::ipool &pool_)
Definition indirect_vector.h:1611
reference emplace_back()
Definition indirect_vector.h:837
size_type capacity() const
Definition indirect_vector.h:1200
iindirect_vector(etl::ivector< T * > &lookup_, etl::ipool &storage_)
Constructor.
Definition indirect_vector.h:1246
reference operator[](size_t i)
Definition indirect_vector.h:634
void push_back(const_reference value)
Definition indirect_vector.h:790
iterator insert(const_iterator position, const_reference value)
Definition indirect_vector.h:930
iterator insert(const_iterator position, size_t n, parameter_t value)
Definition indirect_vector.h:1045
Definition indirect_vector.h:74
Definition indirect_vector.h:1422
Template deduction guides.
Definition indirect_vector.h:1569
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:506
T * create()
Definition ipool.h:350
void push_back(parameter_t value)
Definition ivectorpointer.h:354
size_type capacity() const
Definition vector_base.h:131
iterator insert(const_iterator position, parameter_t value)
Definition ivectorpointer.h:401
Definition indirect_vector.h:57
Definition vector_base.h:80
Definition vector_base.h:66
Definition vector_base.h:94
bitset_ext
Definition absolute.h:40
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_CONSTEXPR14 bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1093
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
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