31 #ifndef ETL_INDIRECT_VECTOR_INCLUDED
32 #define ETL_INDIRECT_VECTOR_INCLUDED
40 #include "static_assert.h"
42 #if ETL_CPP11_SUPPORTED && ETL_NOT_USING_STLPORT && ETL_USING_STL
43 #include <initializer_list>
46 #ifdef ETL_COMPILER_GCC
47 #pragma GCC diagnostic push
48 #pragma GCC diagnostic ignored "-Wunused-variable"
71 :
vector_exception(ETL_ERROR_TEXT(
"indirect_vector:buffer_missmatch", ETL_FILE
"A"), file_name_, line_number_)
88 typedef const T& const_reference;
89 #if ETL_CPP11_SUPPORTED
90 typedef T&& rvalue_reference;
93 typedef const T* const_pointer;
104 template <
typename TUnaryFunction,
typename TReturnType =
void>
114 TReturnType operator()(const_pointer indirect_itr)
123 template <
typename TUnaryFunction>
133 void operator()(const_pointer indirect_itr)
144 template <
typename TBinaryFunction,
typename TReturnType =
void>
154 TReturnType operator()(const_pointer indirect_itr_lhs,
155 const_pointer indirect_itr_rhs)
164 template <
typename TBinaryFunction>
174 void operator()(const_pointer indirect_itr_lhs,
175 const_pointer indirect_itr_rhs)
198 : lookup_itr(other.lookup_itr)
230 lookup_itr = other.lookup_itr;
246 reference operator *()
251 const_reference operator *()
const
258 return &(**lookup_itr);
263 return &(**lookup_itr);
266 pointer operator ->()
268 return &(**lookup_itr);
271 const_pointer operator ->()
const
273 return &(**lookup_itr);
290 indirect_iterator indirection()
295 indirect_const_iterator indirection()
const
302 return lhs.lookup_itr - rhs.lookup_itr;
307 return lhs.lookup_itr == rhs.lookup_itr;
312 return !(lhs == rhs);
317 return lhs.lookup_itr < rhs.lookup_itr;
327 indirect_iterator lookup_itr;
344 : lookup_itr(other.lookup_itr)
349 : lookup_itr(other.lookup_itr)
393 lookup_itr = other.lookup_itr;
397 const_reference operator *()
const
404 return &(**lookup_itr);
407 const_pointer operator ->()
const
409 return &(**lookup_itr);
412 indirect_const_iterator indirection()
const
433 return lhs.lookup_itr - rhs.lookup_itr;
438 return lhs.lookup_itr == rhs.lookup_itr;
443 return !(lhs == rhs);
448 return lhs.lookup_itr < rhs.lookup_itr;
460 indirect_const_iterator lookup_itr;
463 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
464 typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
532 return reverse_iterator(
end());
541 return const_reverse_iterator(
end());
550 return reverse_iterator(
begin());
557 const_reverse_iterator
rend()
const
559 return const_reverse_iterator(
begin());
568 return const_reverse_iterator(
cend());
575 const_reverse_iterator
crend()
const
577 return const_reverse_iterator(
cbegin());
604 if (new_size >
size())
606 size_type n = new_size -
size();
610 T* p = storage.
create<T>(value);
616 size_type n =
size() - new_size;
659 reference
at(
size_t i)
661 return *lookup.
at(i);
670 const_reference
at(
size_t i)
const
672 return *lookup.
at(i);
681 return *(lookup.
front());
690 return *(lookup.
front());
699 return *(lookup.
back());
708 return *(lookup.
back());
718 template <
typename TIterator>
719 void assign(TIterator first, TIterator last)
721 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");
723 #if defined(ETL_DEBUG)
724 difference_type d = etl::distance(first, last);
730 while (first != last)
732 T* p = storage.
create<T>(*first);
752 T* p = storage.
create<T>(value);
772 #if defined(ETL_CHECK_PUSH_POP)
775 T* p = storage.
create<T>(value);
779 #if ETL_CPP11_SUPPORTED
787 #if defined(ETL_CHECK_PUSH_POP)
790 T* p = storage.
create<T>(etl::move(value));
795 #if ETL_CPP11_SUPPORTED && ETL_NOT_USING_STLPORT && !defined(ETL_VECTOR_FORCE_CPP03)
801 template <
typename ... Args>
804 T* p = storage.
create<T>(etl::forward<Args>(args)...);
813 template <
typename T1>
816 T* p = storage.
create<T>(T(value1));
825 template <
typename T1,
typename T2>
828 T* p = storage.
create<T>(T(value1, value2));
837 template <
typename T1,
typename T2,
typename T3>
838 void emplace_back(
const T1& value1,
const T2& value2,
const T3& value3)
840 T* p = storage.
create<T>(T(value1, value2, value3));
849 template <
typename T1,
typename T2,
typename T3,
typename T4>
850 void emplace_back(
const T1& value1,
const T2& value2,
const T3& value3,
const T4& value4)
852 T* p = storage.
create<T>(T(value1, value2, value3, value4));
864 reference
object =
back();
879 T* p = storage.
create<T>(T(value));
885 #if ETL_CPP11_SUPPORTED
896 T* p = storage.
create<T>(T(etl::move(value)));
906 #if ETL_CPP11_SUPPORTED && ETL_NOT_USING_STLPORT
907 template <
typename ... Args>
908 iterator
emplace(iterator position, Args && ... args)
912 T* p = storage.
create<T>(T(etl::forward<Args>(args)...));
913 position = iterator(lookup.
insert(position.lookup_itr, p));
918 template <
typename T1>
923 T* p = storage.
create<T>(T(value1));
929 template <
typename T1,
typename T2>
934 T* p = storage.
create<T>(T(value1, value2));
940 template <
typename T1,
typename T2,
typename T3>
941 iterator
emplace(iterator position,
const T1& value1,
const T2& value2,
const T3& value3)
945 T* p = storage.
create<T>(T(value1, value2, value3));
946 position = iterator(lookup.
insert(position.lookup_itr, p));
951 template <
typename T1,
typename T2,
typename T3,
typename T4>
952 iterator
emplace(iterator position,
const T1& value1,
const T2& value2,
const T3& value3,
const T4& value4)
956 T* p = storage.
create<T>(T(value1, value2, value3, value4));
957 position = iterator(lookup.
insert(position.lookup_itr, p));
976 lookup.
insert(lookup_itr, n, ETL_NULLPTR);
980 T* p = storage.
create<T>(value);
992 template <
class TIterator>
995 size_t count = size_t(etl::distance(first, last));
1001 lookup.
insert(lookup_itr, count, ETL_NULLPTR);
1003 while (first != last)
1005 T* p = storage.
create<T>(*first);
1035 while (element != last)
1041 lookup.
erase(first.lookup_itr, last.lookup_itr);
1059 #if ETL_CPP11_SUPPORTED
1069 while (itr != rhs.end())
1088 return lookup.
size();
1106 return lookup.
empty();
1115 return lookup.
full();
1154 while (itr !=
end())
1174 while (itr != other.end())
1195 #if defined(ETL_POLYMORPHIC_INDIRECT_VECTOR) || defined(ETL_POLYMORPHIC_CONTAINERS)
1214 template <
typename T>
1227 template <
typename T>
1230 return !(lhs == rhs);
1240 template <
typename T>
1243 return etl::lexicographical_compare(lhs.
begin(), lhs.
end(), rhs.
begin(), rhs.
end());
1253 template <
typename T>
1266 template <
typename T>
1269 return !(lhs > rhs);
1279 template <
typename T>
1282 return !(lhs < rhs);
1291 template <
typename T, const
size_t MAX_SIZE_>
1296 ETL_STATIC_ASSERT((MAX_SIZE_ > 0U),
"Zero capacity etl::indirect_vector is not valid");
1298 static const size_t MAX_SIZE = MAX_SIZE_;
1315 this->
resize(initial_size);
1323 indirect_vector(
size_t initial_size,
typename etl::iindirect_vector<T>::parameter_t value)
1326 this->
resize(initial_size, value);
1335 template <
typename TIterator>
1339 this->
assign(first, last);
1342 #if ETL_CPP11_SUPPORTED && ETL_NOT_USING_STLPORT && ETL_USING_STL
1349 this->
assign(init.begin(), init.end());
1375 #if ETL_CPP11_SUPPORTED
1413 #if ETL_CPP17_SUPPORTED && ETL_NOT_USING_STLPORT && ETL_USING_STL
1414 template <
typename T,
typename... Ts>
1415 indirect_vector(T, Ts...)
1416 ->indirect_vector<etl::enable_if_t<(etl::is_same_v<T, Ts> && ...), T>, 1U +
sizeof...(Ts)>;
1425 template <
typename T>
1447 this->
resize(initial_size);
1459 this->
resize(initial_size, value);
1468 template <
typename TIterator>
1473 this->
assign(first, last);
1476 #if ETL_CPP11_SUPPORTED && ETL_NOT_USING_STLPORT && ETL_USING_STL
1484 this->
assign(init.begin(), init.end());
1511 #if ETL_CPP11_SUPPORTED
1543 #ifdef ETL_COMPILER_GCC
1544 #pragma GCC diagnostic pop
Binary function adaptor.
Definition: indirect_vector.h:146
const_iterator.
Definition: indirect_vector.h:334
iterator.
Definition: indirect_vector.h:187
Unary function adaptor.
Definition: indirect_vector.h:106
bitset< MAXN > operator&(const bitset< MAXN > &lhs, const bitset< MAXN > &rhs)
Definition: bitset.h:1157
#define ETL_ASSERT(b, e)
Definition: error_handler.h:290
reference at(size_t i)
Definition: indirect_vector.h:659
const_reverse_iterator crend() const
Definition: indirect_vector.h:575
void resize(size_t new_size)
Definition: indirect_vector.h:586
void clear()
Clears the indirect_vector.
Definition: indirect_vector.h:760
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:1455
~indirect_vector()
Destructor.
Definition: indirect_vector.h:1399
void assign(TIterator first, TIterator last)
Definition: indirect_vector.h:719
size_type available() const
Definition: indirect_vector.h:1131
indirect_vector & operator=(const indirect_vector &rhs)
Assignment operator.
Definition: indirect_vector.h:1365
reference back()
Definition: indirect_vector.h:697
iterator end()
Definition: indirect_vector.h:494
void insert(iterator position, TIterator first, TIterator last)
Definition: indirect_vector.h:993
const_iterator end() const
Definition: indirect_vector.h:503
iterator emplace(iterator position, const T1 &value1)
Emplaces a value to the vector at the specified position.
Definition: indirect_vector.h:919
indirect_vector_ext(size_t initial_size, etl::ivector< T * > &lookup_, etl::ipool &pool_)
Definition: indirect_vector.h:1443
bool empty() const
Definition: indirect_vector.h:1104
indirect_vector(size_t initial_size, typename etl::iindirect_vector< T >::parameter_t value)
Definition: indirect_vector.h:1323
void emplace_back(const T1 &value1, const T2 &value2)
Definition: indirect_vector.h:826
reverse_iterator rend()
Definition: indirect_vector.h:548
void emplace_back(const T1 &value1, const T2 &value2, const T3 &value3)
Definition: indirect_vector.h:838
indirect_vector_ext(const indirect_vector_ext &other, etl::ivector< T * > &lookup_, etl::ipool &pool_)
Copy constructor.
Definition: indirect_vector.h:1491
void resize(size_t new_size, T value)
Definition: indirect_vector.h:598
void emplace_back(const T1 &value1, const T2 &value2, const T3 &value3, const T4 &value4)
Definition: indirect_vector.h:850
void pop_back()
Removes an element from the end of the indirect_vector.
Definition: indirect_vector.h:860
bool full() const
Definition: indirect_vector.h:1113
size_type size() const
Definition: indirect_vector.h:1086
void reserve(size_t)
Does nothing.
Definition: indirect_vector.h:629
const_iterator cend() const
Definition: indirect_vector.h:521
void assign(size_t n, parameter_t value)
Definition: indirect_vector.h:744
indirect_vector(const indirect_vector &other)
Copy constructor.
Definition: indirect_vector.h:1356
const_iterator cbegin() const
Definition: indirect_vector.h:512
const_reference back() const
Definition: indirect_vector.h:706
const_reference front() const
Definition: indirect_vector.h:688
indirect_vector_ext(etl::ivector< T * > &lookup_, etl::ipool &pool_)
Constructor.
Definition: indirect_vector.h:1433
indirect_vector(size_t initial_size)
Definition: indirect_vector.h:1312
~iindirect_vector()
Destructor.
Definition: indirect_vector.h:1201
indirect_vector()
Constructor.
Definition: indirect_vector.h:1303
size_type max_size() const
Definition: indirect_vector.h:1122
const_iterator begin() const
Definition: indirect_vector.h:485
void emplace_back(const T1 &value1)
Definition: indirect_vector.h:814
void initialise()
Initialise the indirect_vector.
Definition: indirect_vector.h:1150
~indirect_vector_ext()
Destructor.
Definition: indirect_vector.h:1536
const_reference at(size_t i) const
Definition: indirect_vector.h:670
iterator begin()
Definition: indirect_vector.h:476
iterator insert(iterator position, const_reference value)
Definition: indirect_vector.h:875
void insert(iterator position, size_t n, parameter_t value)
Definition: indirect_vector.h:970
iindirect_vector & operator=(const iindirect_vector &rhs)
Assignment operator.
Definition: indirect_vector.h:1049
indirect_vector_ext & operator=(const indirect_vector_ext &rhs)
Assignment operator.
Definition: indirect_vector.h:1501
const_reverse_iterator rend() const
Definition: indirect_vector.h:557
const_reverse_iterator rbegin() const
Definition: indirect_vector.h:539
iterator erase(iterator i_element)
Definition: indirect_vector.h:1016
indirect_vector(TIterator first, TIterator last)
Definition: indirect_vector.h:1336
reverse_iterator rbegin()
Definition: indirect_vector.h:530
const_reverse_iterator crbegin() const
Definition: indirect_vector.h:566
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:1469
size_type capacity() const
Definition: indirect_vector.h:1095
iindirect_vector(etl::ivector< T * > &lookup_, etl::ipool &storage_)
Constructor.
Definition: indirect_vector.h:1141
reference operator[](size_t i)
Definition: indirect_vector.h:638
void push_back(const_reference value)
Definition: indirect_vector.h:770
void move_container(iindirect_vector &&other)
Move from a container.
Definition: indirect_vector.h:1166
iterator erase(iterator first, iterator last)
Definition: indirect_vector.h:1031
Definition: indirect_vector.h:83
Definition: indirect_vector.h:1293
Template deduction guides.
Definition: indirect_vector.h:1427
bool operator==(const etl::iindirect_vector< T > &lhs, const etl::iindirect_vector< T > &rhs)
Definition: indirect_vector.h:1215
bool operator<(const etl::iindirect_vector< T > &lhs, const etl::iindirect_vector< T > &rhs)
Definition: indirect_vector.h:1241
bool operator!=(const etl::iindirect_vector< T > &lhs, const etl::iindirect_vector< T > &rhs)
Definition: indirect_vector.h:1228
T * addressof(T &t)
Definition: memory.h:61
size_t capacity() const
Returns the maximum number of items in the pool.
Definition: pool.h:293
T * create()
Definition: pool.h:146
void destroy(const T *const p_object)
Definition: pool.h:238
is_same
Definition: type_traits_generator.h:981
remove_cv
Definition: type_traits_generator.h:921
bool full() const
Definition: pvoidvector.h:598
reference front()
Definition: ivectorpointer.h:251
void push_back(parameter_t value)
Definition: ivectorpointer.h:338
size_type max_size() const
Definition: vector_base.h:143
size_type capacity() const
Definition: vector_base.h:134
void pop_back()
Definition: ivectorpointer.h:357
bool empty() const
Definition: pvoidvector.h:589
reference back()
Definition: ivectorpointer.h:269
iterator insert(iterator position, parameter_t value)
Definition: ivectorpointer.h:368
const_iterator cend() const
Definition: ivectorpointer.h:123
reference at(size_t i)
Definition: ivectorpointer.h:231
iterator erase(iterator i_element)
Definition: ivectorpointer.h:411
iterator end()
Definition: ivectorpointer.h:96
iterator begin()
Definition: ivectorpointer.h:78
size_t available() const
Definition: pvoidvector.h:607
size_type size() const
Definition: pvoidvector.h:580
void clear()
Clears the vector.
Definition: ivectorpointer.h:328
Definition: indirect_vector.h:67
Definition: ivectorpointer.h:49
Definition: vector_base.h:83
Definition: vector_base.h:55
Definition: vector_base.h:69
Definition: absolute.h:37
bool operator>(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:633
etl::fixed_iterator< TIterator > & operator-(etl::fixed_iterator< TIterator > &lhs, typename etl::iterator_traits< TIterator >::difference_type)
Definition: fixed_iterator.h:193
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:594
bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:582
etl::fixed_iterator< TIterator > & operator+(etl::fixed_iterator< TIterator > &lhs, typename etl::iterator_traits< TIterator >::difference_type)
Definition: fixed_iterator.h:183
bool operator<(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:606
bool operator<=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:621
Definition: functional.h:170
iterator
Definition: iterator.h:422
etl::conditional< etl::is_fundamental< T >::value||etl::is_pointer< T >::value, T, const T & >::type type
By default fundamental and pointer types are passed by value.
Definition: parameter_type.h:48
Definition: functional.h:161