31#ifndef ETL_INDIRECT_VECTOR_INCLUDED
32#define ETL_INDIRECT_VECTOR_INCLUDED
40#include "static_assert.h"
77 typedef const T& const_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>
112 template <
typename TUnaryFunction>
133 template <
typename TBinaryFunction,
typename TReturnType =
void>
153 template <
typename TBinaryFunction>
188 : lookup_itr(
other.lookup_itr)
220 lookup_itr =
other.lookup_itr;
236 reference operator *()
const
241 pointer operator &()
const
243 return &(**lookup_itr);
246 pointer operator ->()
const
248 return &(**lookup_itr);
265 indirect_iterator indirection()
270 indirect_const_iterator indirection()
const
277 return lhs.lookup_itr -
rhs.lookup_itr;
282 return lhs.lookup_itr ==
rhs.lookup_itr;
292 return lhs.lookup_itr <
rhs.lookup_itr;
302 indirect_iterator lookup_itr;
320 : lookup_itr(
other.lookup_itr)
325 : lookup_itr(
other.lookup_itr)
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
409 return lhs.lookup_itr -
rhs.lookup_itr;
414 return lhs.lookup_itr ==
rhs.lookup_itr;
424 return lhs.lookup_itr <
rhs.lookup_itr;
429 typedef typename etl::ivector<T*>::const_iterator lookup_itr_t;
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());
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>
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)
760#if defined(ETL_CHECK_PUSH_POP)
775#if defined(ETL_CHECK_PUSH_POP)
778 T* p = storage.
create<
T>(etl::move(value));
783#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_VECTOR_FORCE_CPP03_IMPLEMENTATION)
789 template <
typename ...
Args>
814 template <
typename T1>
827 template <
typename T1,
typename T2>
830 T* p = storage.
create<
T>(
T(value1, value2));
840 template <
typename T1,
typename T2,
typename T3>
843 T* p = storage.
create<
T>(
T(value1, value2, value3));
853 template <
typename T1,
typename T2,
typename T3,
typename T4>
856 T* p = storage.
create<
T>(
T(value1, value2, value3, value4));
869 reference
object =
back();
901 T* p = storage.
create<
T>(
T(etl::move(value)));
911#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_VECTOR_FORCE_CPP03_IMPLEMENTATION)
912 template <
typename ...
Args>
918 position = iterator(lookup.
insert(position.lookup_itr, p));
933 template <
typename T1>
944 template <
typename T1,
typename T2>
945 iterator
emplace(iterator position,
const T1& value1,
const T2& value2)
949 T* p = storage.
create<
T>(
T(value1, value2));
950 position = iterator(lookup.
insert(position.lookup_itr, p));
955 template <
typename T1,
typename T2,
typename T3>
956 iterator
emplace(iterator position,
const T1& value1,
const T2& value2,
const T3& value3)
960 T* p = storage.
create<
T>(
T(value1, value2, value3));
961 position = iterator(lookup.
insert(position.lookup_itr, p));
966 template <
typename T1,
typename T2,
typename T3,
typename T4>
967 iterator
emplace(iterator position,
const T1& value1,
const T2& value2,
const T3& value3,
const T4& value4)
971 T* p = storage.
create<
T>(
T(value1, value2, value3, value4));
972 position = iterator(lookup.
insert(position.lookup_itr, p));
992 typename etl::ivector<T*>::iterator lookup_itr =
position_.lookup_itr;
993 lookup.
insert(lookup_itr,
n, ETL_NULLPTR);
1011 template <
class TIterator>
1014 size_t count =
size_t(etl::distance(first, last));
1019 typename etl::ivector<T*>::iterator lookup_itr =
to_iterator(position).lookup_itr;
1020 lookup.
insert(lookup_itr, count, ETL_NULLPTR);
1022 while (first != last)
1068 while (element != last)
1074 lookup.
erase(first.lookup_itr, last.lookup_itr);
1102 while (itr !=
rhs.end())
1121 return lookup.
size();
1139 return lookup.
empty();
1148 return lookup.
full();
1193 while (itr !=
end())
1215 while (itr !=
other.end())
1237#if defined(ETL_POLYMORPHIC_INDIRECT_VECTOR) || defined(ETL_POLYMORPHIC_CONTAINERS)
1254 return iterator(
const_cast<indirect_iterator
>(itr.lookup_itr));
1265 template <
typename T>
1268 return (
lhs.size() ==
rhs.size()) && etl::equal(
lhs.begin(),
lhs.end(),
rhs.begin());
1278 template <
typename T>
1291 template <
typename T>
1294 return etl::lexicographical_compare(
lhs.begin(),
lhs.end(),
rhs.begin(),
rhs.end());
1304 template <
typename T>
1317 template <
typename T>
1330 template <
typename T>
1342 template <
typename T, const
size_t MAX_SIZE_>
1347 ETL_STATIC_ASSERT((
MAX_SIZE_ > 0
U),
"Zero capacity etl::indirect_vector is not valid");
1349 static ETL_CONSTANT
size_t MAX_SIZE =
MAX_SIZE_;
1366 this->
resize(initial_size);
1377 this->
resize(initial_size, value);
1386 template <
typename TIterator>
1390 this->
assign(first, last);
1393#if ETL_HAS_INITIALIZER_LIST
1457 etl::vector<T*, MAX_SIZE> lookup_vector;
1461 template <
typename T, const
size_t MAX_SIZE_>
1462 ETL_CONSTANT
size_t indirect_vector<T, MAX_SIZE_>::MAX_SIZE;
1467#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
1468 template <
typename T,
typename...
Ts>
1469 indirect_vector(
T,
Ts...)
1476#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
1477 template <
typename...
T>
1490 template <
typename T>
1512 this->
resize(initial_size);
1524 this->
resize(initial_size, value);
1533 template <
typename TIterator>
1538 this->
assign(first, last);
1541#if ETL_HAS_INITIALIZER_LIST
1595 indirect_vector_ext(indirect_vector_ext&&
other) ETL_DELETE;
Binary function adaptor.
Definition indirect_vector.h:135
const_iterator.
Definition indirect_vector.h:309
iterator.
Definition indirect_vector.h:176
Unary function adaptor.
Definition indirect_vector.h:95
ETL_CONSTEXPR14 bool operator==(const etl::expected< TValue, TError > &lhs, const etl::expected< TValue2, TError2 > &rhs)
Equivalence operators.
Definition expected.h:974
#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:1252
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:1571
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:1520
~indirect_vector()
Destructor.
Definition indirect_vector.h:1450
void assign(TIterator first, TIterator last)
Definition indirect_vector.h:699
size_type available() const
Definition indirect_vector.h:1164
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:1082
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:1508
bool empty() const
Definition indirect_vector.h:1137
indirect_vector(size_t initial_size, typename etl::iindirect_vector< T >::parameter_t value)
Definition indirect_vector.h:1374
reference emplace_back(const T1 &value1, const T2 &value2, const T3 &value3)
Definition indirect_vector.h:841
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:1556
reference emplace_back(const T1 &value1, const T2 &value2, const T3 &value3, const T4 &value4)
Definition indirect_vector.h:854
iterator erase(const_iterator i_element)
Definition indirect_vector.h:1049
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:865
bool full() const
Definition indirect_vector.h:1146
size_type size() const
Definition indirect_vector.h:1119
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:923
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:1407
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:1498
indirect_vector(size_t initial_size)
Definition indirect_vector.h:1363
~iindirect_vector()
Destructor.
Definition indirect_vector.h:1243
indirect_vector()
Constructor.
Definition indirect_vector.h:1354
size_type max_size() const
Definition indirect_vector.h:1155
const_iterator begin() const
Definition indirect_vector.h:461
void initialise()
Initialise the indirect_vector.
Definition indirect_vector.h:1183
~indirect_vector_ext()
Destructor.
Definition indirect_vector.h:1611
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:828
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:1012
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:1037
indirect_vector(TIterator first, TIterator last)
Definition indirect_vector.h:1387
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:1416
iterator erase(const_iterator first, const_iterator last)
Definition indirect_vector.h:1064
reference emplace_back(const T1 &value1)
Definition indirect_vector.h:815
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:1534
reference emplace_back()
Definition indirect_vector.h:802
size_type capacity() const
Definition indirect_vector.h:1128
iindirect_vector(etl::ivector< T * > &lookup_, etl::ipool &storage_)
Constructor.
Definition indirect_vector.h:1174
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:880
iterator insert(const_iterator position, size_t n, parameter_t value)
Definition indirect_vector.h:985
Definition indirect_vector.h:72
Definition indirect_vector.h:1344
Template deduction guides.
Definition indirect_vector.h:1492
ETL_CONSTEXPR17 etl::enable_if<!etl::is_same< T, etl::nullptr_t >::value, T >::type * addressof(T &t)
Definition addressof.h:52
void release_all()
Release all objects in the pool.
Definition ipool.h:451
T * create()
Definition ipool.h:333
void destroy(const T *const p_object)
Definition ipool.h:425
is_same
Definition type_traits_generator.h:1080
remove_cv
Definition type_traits_generator.h:1007
bool full() const
Definition pvoidvector.h:705
reference front()
Definition ivectorpointer.h:260
void push_back(parameter_t value)
Definition ivectorpointer.h:347
size_type max_size() const
Definition vector_base.h:140
size_type capacity() const
Definition vector_base.h:131
void pop_back()
Definition ivectorpointer.h:380
bool empty() const
Definition pvoidvector.h:696
reference back()
Definition ivectorpointer.h:278
const_iterator cend() const
Definition ivectorpointer.h:123
reference at(size_t i)
Definition ivectorpointer.h:240
iterator erase(iterator i_element)
Definition ivectorpointer.h:442
iterator end()
Definition ivectorpointer.h:96
iterator begin()
Definition ivectorpointer.h:78
iterator insert(const_iterator position, parameter_t value)
Definition ivectorpointer.h:391
size_t available() const
Definition pvoidvector.h:714
size_type size() const
Definition pvoidvector.h:687
void clear()
Clears the vector.
Definition ivectorpointer.h:337
Definition indirect_vector.h:56
Definition vector_base.h:80
Definition vector_base.h:52
Definition vector_base.h:66
Definition vector_base.h:94
bitset_ext
Definition absolute.h:38
bool operator>(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1148
bool operator>=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1160
bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1109
bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1097
ETL_NODISCARD ETL_CONSTEXPR14 T round_half_even_unscaled(T value) ETL_NOEXCEPT
Definition scaled_rounding.h:314
bool operator<(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1121
bool operator<=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1136
binary_function
Definition functional.h:161
Definition type_traits_generator.h:2190
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
unary_function
Definition functional.h:151