31#ifndef ETL_INDIRECT_VECTOR_INCLUDED
32#define ETL_INDIRECT_VECTOR_INCLUDED
40#include "static_assert.h"
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;
93 template <
typename TUnaryFunction,
typename TReturnType =
void>
103 TReturnType operator()(const_pointer indirect_itr)
112 template <
typename TUnaryFunction>
122 void operator()(const_pointer indirect_itr)
133 template <
typename TBinaryFunction,
typename TReturnType =
void>
143 TReturnType operator()(const_pointer indirect_itr_lhs,
144 const_pointer indirect_itr_rhs)
153 template <
typename TBinaryFunction>
163 void operator()(const_pointer indirect_itr_lhs,
164 const_pointer indirect_itr_rhs)
187 : lookup_itr(other.lookup_itr)
219 lookup_itr = other.lookup_itr;
235 reference operator *()
const
242 return &(**lookup_itr);
245 pointer operator ->()
const
247 return &(**lookup_itr);
264 indirect_iterator indirection()
269 indirect_const_iterator indirection()
const
276 return lhs.lookup_itr - rhs.lookup_itr;
281 return lhs.lookup_itr == rhs.lookup_itr;
286 return !(lhs == rhs);
291 return lhs.lookup_itr < rhs.lookup_itr;
301 indirect_iterator lookup_itr;
318 : lookup_itr(other.lookup_itr)
323 : lookup_itr(other.lookup_itr)
367 lookup_itr = other.lookup_itr;
371 const_reference operator *()
const
378 return &(**lookup_itr);
381 const_pointer operator ->()
const
383 return &(**lookup_itr);
386 indirect_const_iterator indirection()
const
407 return lhs.lookup_itr - rhs.lookup_itr;
412 return lhs.lookup_itr == rhs.lookup_itr;
417 return !(lhs == rhs);
422 return lhs.lookup_itr < rhs.lookup_itr;
434 indirect_const_iterator lookup_itr;
437 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
438 typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
506 return reverse_iterator(
end());
515 return const_reverse_iterator(
end());
524 return reverse_iterator(
begin());
531 const_reverse_iterator
rend()
const
533 return const_reverse_iterator(
begin());
542 return const_reverse_iterator(
cend());
549 const_reverse_iterator
crend()
const
551 return const_reverse_iterator(
cbegin());
572 void resize(
size_t new_size, const_reference value)
578 if (new_size >
size())
580 size_type n = new_size -
size();
584 T* p = storage.
create<T>(value);
590 size_type n =
size() - new_size;
634 reference
at(
size_t i)
636 return *lookup.
at(i);
645 const_reference
at(
size_t i)
const
647 return *lookup.
at(i);
656 return *(lookup.
front());
665 return *(lookup.
front());
674 return *(lookup.
back());
683 return *(lookup.
back());
693 template <
typename TIterator>
694 void assign(TIterator first, TIterator last)
696 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");
698#if ETL_IS_DEBUG_BUILD
699 difference_type d = etl::distance(first, last);
705 while (first != last)
707 T* p = storage.
create<T>(*first);
727 T* p = storage.
create<T>(value);
755#if defined(ETL_CHECK_PUSH_POP)
758 T* p = storage.
create<T>(value);
770#if defined(ETL_CHECK_PUSH_POP)
773 T* p = storage.
create<T>(etl::move(value));
778#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_VECTOR_FORCE_CPP03_IMPLEMENTATION)
784 template <
typename ... Args>
787 T* p = storage.
create<T>(etl::forward<Args>(args)...);
797 template <
typename T1>
800 T* p = storage.
create<T>(T(value1));
810 template <
typename T1,
typename T2>
813 T* p = storage.
create<T>(T(value1, value2));
823 template <
typename T1,
typename T2,
typename T3>
824 reference
emplace_back(
const T1& value1,
const T2& value2,
const T3& value3)
826 T* p = storage.
create<T>(T(value1, value2, value3));
836 template <
typename T1,
typename T2,
typename T3,
typename T4>
837 reference
emplace_back(
const T1& value1,
const T2& value2,
const T3& value3,
const T4& value4)
839 T* p = storage.
create<T>(T(value1, value2, value3, value4));
852 reference
object =
back();
867 T* p = storage.
create<T>(T(value));
884 T* p = storage.
create<T>(T(etl::move(value)));
894#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT
895 template <
typename ... Args>
896 iterator
emplace(iterator position, Args && ... args)
900 T* p = storage.
create<T>(T(etl::forward<Args>(args)...));
901 position = iterator(lookup.
insert(position.lookup_itr, p));
906 template <
typename T1>
911 T* p = storage.
create<T>(T(value1));
917 template <
typename T1,
typename T2>
922 T* p = storage.
create<T>(T(value1, value2));
928 template <
typename T1,
typename T2,
typename T3>
929 iterator
emplace(iterator position,
const T1& value1,
const T2& value2,
const T3& value3)
933 T* p = storage.
create<T>(T(value1, value2, value3));
934 position = iterator(lookup.
insert(position.lookup_itr, p));
939 template <
typename T1,
typename T2,
typename T3,
typename T4>
940 iterator
emplace(iterator position,
const T1& value1,
const T2& value2,
const T3& value3,
const T4& value4)
944 T* p = storage.
create<T>(T(value1, value2, value3, value4));
945 position = iterator(lookup.
insert(position.lookup_itr, p));
966 lookup.
insert(lookup_itr, n, ETL_NULLPTR);
970 T* p = storage.
create<T>(value);
984 template <
class TIterator>
987 size_t count = size_t(etl::distance(first, last));
993 lookup.
insert(lookup_itr, count, ETL_NULLPTR);
995 while (first != last)
997 T* p = storage.
create<T>(*first);
1041 while (element != last)
1047 lookup.
erase(first.lookup_itr, last.lookup_itr);
1075 while (itr != rhs.end())
1094 return lookup.
size();
1112 return lookup.
empty();
1121 return lookup.
full();
1160 while (itr !=
end())
1181 while (itr != other.end())
1203#if defined(ETL_POLYMORPHIC_INDIRECT_VECTOR) || defined(ETL_POLYMORPHIC_CONTAINERS)
1220 return iterator(
const_cast<indirect_iterator
>(itr.lookup_itr));
1231 template <
typename T>
1244 template <
typename T>
1247 return !(lhs == rhs);
1257 template <
typename T>
1260 return etl::lexicographical_compare(lhs.
begin(), lhs.
end(), rhs.
begin(), rhs.
end());
1270 template <
typename T>
1283 template <
typename T>
1286 return !(lhs > rhs);
1296 template <
typename T>
1299 return !(lhs < rhs);
1308 template <
typename T, const
size_t MAX_SIZE_>
1313 ETL_STATIC_ASSERT((MAX_SIZE_ > 0U),
"Zero capacity etl::indirect_vector is not valid");
1315 static ETL_CONSTANT
size_t MAX_SIZE = MAX_SIZE_;
1332 this->
resize(initial_size);
1340 indirect_vector(
size_t initial_size,
typename etl::iindirect_vector<T>::parameter_t value)
1343 this->
resize(initial_size, value);
1352 template <
typename TIterator>
1356 this->
assign(first, last);
1359#if ETL_HAS_INITIALIZER_LIST
1366 this->
assign(init.begin(), init.end());
1399 this->move_container(etl::move(other));
1407 this->move_container(etl::move(rhs));
1427 template <
typename T, const
size_t MAX_SIZE_>
1428 ETL_CONSTANT
size_t indirect_vector<T, MAX_SIZE_>::MAX_SIZE;
1433#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
1434 template <
typename T,
typename... Ts>
1435 indirect_vector(T, Ts...)
1436 ->indirect_vector<etl::enable_if_t<(etl::is_same_v<T, Ts> && ...), T>, 1U +
sizeof...(Ts)>;
1442#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
1443 template <
typename... T>
1444 constexpr auto make_indirect_vector(T&&... t) ->
etl::indirect_vector<
typename etl::common_type_t<T...>,
sizeof...(T)>
1446 return { { etl::forward<T>(t)... } };
1456 template <
typename T>
1478 this->
resize(initial_size);
1490 this->
resize(initial_size, value);
1499 template <
typename TIterator>
1504 this->
assign(first, last);
1507#if ETL_HAS_INITIALIZER_LIST
1515 this->
assign(init.begin(), init.end());
1555 this->move_container(etl::move(other));
1568 this->move_container(etl::move(rhs));
Binary function adaptor.
Definition: indirect_vector.h:135
const_iterator.
Definition: indirect_vector.h:308
iterator.
Definition: indirect_vector.h:176
Unary function adaptor.
Definition: indirect_vector.h:95
#define ETL_ASSERT(b, e)
Definition: error_handler.h:316
reference at(size_t i)
Definition: indirect_vector.h:634
const_reverse_iterator crend() const
Definition: indirect_vector.h:549
void resize(size_t new_size)
Definition: indirect_vector.h:560
iterator to_iterator(const_iterator itr) const
Convert from const_iterator to iterator.
Definition: indirect_vector.h:1218
void clear()
Clears the indirect_vector.
Definition: indirect_vector.h:735
indirect_vector_ext & operator=(const indirect_vector_ext &rhs)
Assignment operator.
Definition: indirect_vector.h:1537
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:1486
~indirect_vector()
Destructor.
Definition: indirect_vector.h:1416
void assign(TIterator first, TIterator last)
Definition: indirect_vector.h:694
size_type available() const
Definition: indirect_vector.h:1137
indirect_vector_ext(const indirect_vector_ext &other) ETL_DELETE
Copy constructor (Deleted)
reference back()
Definition: indirect_vector.h:672
iindirect_vector & operator=(const iindirect_vector &rhs)
Assignment operator.
Definition: indirect_vector.h:1055
iterator end()
Definition: indirect_vector.h:468
const_iterator end() const
Definition: indirect_vector.h:477
iterator emplace(iterator position, const T1 &value1)
Emplaces a value to the vector at the specified position.
Definition: indirect_vector.h:907
indirect_vector_ext(size_t initial_size, etl::ivector< T * > &lookup_, etl::ipool &pool_)
Definition: indirect_vector.h:1474
bool empty() const
Definition: indirect_vector.h:1110
indirect_vector(size_t initial_size, typename etl::iindirect_vector< T >::parameter_t value)
Definition: indirect_vector.h:1340
reference emplace_back(const T1 &value1, const T2 &value2, const T3 &value3)
Definition: indirect_vector.h:824
reverse_iterator rend()
Definition: indirect_vector.h:522
indirect_vector_ext(const indirect_vector_ext &other, etl::ivector< T * > &lookup_, etl::ipool &pool_)
Construct a copy.
Definition: indirect_vector.h:1522
reference emplace_back(const T1 &value1, const T2 &value2, const T3 &value3, const T4 &value4)
Definition: indirect_vector.h:837
iterator erase(const_iterator i_element)
Definition: indirect_vector.h:1022
void pop_back()
Removes an element from the end of the indirect_vector.
Definition: indirect_vector.h:848
bool full() const
Definition: indirect_vector.h:1119
size_type size() const
Definition: indirect_vector.h:1092
void reserve(size_t)
Definition: indirect_vector.h:604
const_iterator cend() const
Definition: indirect_vector.h:495
void assign(size_t n, parameter_t value)
Definition: indirect_vector.h:719
indirect_vector(const indirect_vector &other)
Copy constructor.
Definition: indirect_vector.h:1373
const_iterator cbegin() const
Definition: indirect_vector.h:486
const_reference back() const
Definition: indirect_vector.h:681
const_reference front() const
Definition: indirect_vector.h:663
indirect_vector_ext(etl::ivector< T * > &lookup_, etl::ipool &pool_)
Constructor.
Definition: indirect_vector.h:1464
indirect_vector(size_t initial_size)
Definition: indirect_vector.h:1329
~iindirect_vector()
Destructor.
Definition: indirect_vector.h:1209
indirect_vector()
Constructor.
Definition: indirect_vector.h:1320
size_type max_size() const
Definition: indirect_vector.h:1128
const_iterator begin() const
Definition: indirect_vector.h:459
void initialise()
Initialise the indirect_vector.
Definition: indirect_vector.h:1156
~indirect_vector_ext()
Destructor.
Definition: indirect_vector.h:1577
const_reference at(size_t i) const
Definition: indirect_vector.h:645
reference emplace_back(const T1 &value1, const T2 &value2)
Definition: indirect_vector.h:811
iterator begin()
Definition: indirect_vector.h:450
void fill(const T &value)
Fills the buffer.
Definition: indirect_vector.h:743
iterator insert(const_iterator position, TIterator first, TIterator last)
Definition: indirect_vector.h:985
const_reverse_iterator rend() const
Definition: indirect_vector.h:531
const_reverse_iterator rbegin() const
Definition: indirect_vector.h:513
void resize(size_t new_size, const_reference value)
Definition: indirect_vector.h:572
iterator erase(iterator i_element)
Definition: indirect_vector.h:1010
indirect_vector(TIterator first, TIterator last)
Definition: indirect_vector.h:1353
reverse_iterator rbegin()
Definition: indirect_vector.h:504
const_reverse_iterator crbegin() const
Definition: indirect_vector.h:540
indirect_vector & operator=(const indirect_vector &rhs)
Assignment operator.
Definition: indirect_vector.h:1382
iterator erase(const_iterator first, const_iterator last)
Definition: indirect_vector.h:1037
reference emplace_back(const T1 &value1)
Definition: indirect_vector.h:798
reference front()
Definition: indirect_vector.h:654
indirect_vector_ext(TIterator first, TIterator last, etl::ivector< T * > &lookup_, etl::ipool &pool_)
Definition: indirect_vector.h:1500
size_type capacity() const
Definition: indirect_vector.h:1101
iindirect_vector(etl::ivector< T * > &lookup_, etl::ipool &storage_)
Constructor.
Definition: indirect_vector.h:1147
reference operator[](size_t i)
Definition: indirect_vector.h:613
void push_back(const_reference value)
Definition: indirect_vector.h:753
iterator insert(const_iterator position, const_reference value)
Definition: indirect_vector.h:863
iterator insert(const_iterator position, size_t n, parameter_t value)
Definition: indirect_vector.h:958
Definition: indirect_vector.h:72
Definition: indirect_vector.h:1310
Template deduction guides.
Definition: indirect_vector.h:1458
bool operator==(const etl::iindirect_vector< T > &lhs, const etl::iindirect_vector< T > &rhs)
Definition: indirect_vector.h:1232
bool operator<(const etl::iindirect_vector< T > &lhs, const etl::iindirect_vector< T > &rhs)
Definition: indirect_vector.h:1258
bool operator!=(const etl::iindirect_vector< T > &lhs, const etl::iindirect_vector< T > &rhs)
Definition: indirect_vector.h:1245
ETL_CONSTEXPR17 T * addressof(T &t)
Definition: addressof.h:51
size_t capacity() const
Returns the maximum number of items in the pool.
Definition: ipool.h:277
T * create()
Definition: ipool.h:130
void destroy(const T *const p_object)
Definition: ipool.h:222
is_same
Definition: type_traits_generator.h:1041
remove_cv
Definition: type_traits_generator.h:968
bool full() const
Definition: pvoidvector.h:636
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:368
bool empty() const
Definition: pvoidvector.h:627
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:422
iterator end()
Definition: ivectorpointer.h:96
iterator begin()
Definition: ivectorpointer.h:78
iterator insert(const_iterator position, parameter_t value)
Definition: ivectorpointer.h:379
size_t available() const
Definition: pvoidvector.h:645
size_type size() const
Definition: pvoidvector.h:618
void clear()
Clears the vector.
Definition: ivectorpointer.h:337
Definition: indirect_vector.h:56
Definition: ivectorpointer.h:49
Definition: vector_base.h:80
Definition: vector_base.h:52
Definition: vector_base.h:66
bitset_ext
Definition: absolute.h:38
ETL_CONSTEXPR14 etl::circular_iterator< TIterator > operator-(etl::circular_iterator< TIterator > &lhs, typename etl::iterator_traits< TIterator >::difference_type offset)
Definition: circular_iterator.h:672
bool operator>(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:684
etl::byte operator&(etl::byte lhs, etl::byte rhs)
And.
Definition: byte.h:273
bool operator>=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:696
bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:645
bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:633
ETL_CONSTEXPR14 etl::circular_iterator< TIterator > operator+(etl::circular_iterator< TIterator > &lhs, typename etl::iterator_traits< TIterator >::difference_type offset)
Definition: circular_iterator.h:659
bool operator<(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:657
bool operator<=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:672
Definition: functional.h:125
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
Definition: functional.h:117