31#ifndef ETL_FLAT_MAP_INCLUDED
32#define ETL_FLAT_MAP_INCLUDED
63 template <
typename TKey,
typename TMapped,
typename TKeyCompare = etl::less<TKey> >
69 typedef typename refmap_t::lookup_t lookup_t;
74 typedef ETL_OR_STD::pair<const TKey, TMapped> value_type;
75 typedef TKey key_type;
76 typedef TMapped mapped_type;
77 typedef TKeyCompare key_compare;
78 typedef value_type& reference;
79 typedef const value_type& const_reference;
81 typedef value_type&& rvalue_reference;
83 typedef value_type* pointer;
84 typedef const value_type* const_pointer;
85 typedef size_t size_type;
87 typedef const key_type& const_key_reference;
89 typedef key_type&& rvalue_key_reference;
91 typedef mapped_type& mapped_reference;
92 typedef const mapped_type& const_mapped_reference;
94 typedef typename refmap_t::iterator iterator;
95 typedef typename refmap_t::const_iterator const_iterator;
97 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
98 typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
99 typedef typename etl::iterator_traits<iterator>::difference_type difference_type;
136 const_iterator
end()
const
191 const_reverse_iterator
rend()
const
210 const_reverse_iterator
crend()
const
221 mapped_reference
operator[](rvalue_key_reference key)
226 if ((i_element ==
end()) ||
compare(key, i_element->first))
228 insert_default_value(i_element, etl::move(key));
231 return i_element->second;
245 if ((i_element ==
end()) || compare(key, i_element->first))
247 insert_default_value(i_element, key);
250 return i_element->second;
260 mapped_reference
at(const_key_reference key)
267 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
268 mapped_reference
at(
const K& key)
281 const_mapped_reference
at(const_key_reference key)
const
288 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
289 const_mapped_reference
at(
const K& key)
const
304 template <
typename TIterator>
305 void assign(TIterator first, TIterator last)
307#if ETL_IS_DEBUG_BUILD
308 difference_type d = etl::distance(first, last);
314 while (first != last)
327 ETL_OR_STD::pair<iterator, bool>
insert(const_reference value)
331 ETL_OR_STD::pair<iterator, bool> result(i_element,
false);
334 if ((i_element ==
end()) || compare(value.first, i_element->first))
336 result = insert_value(i_element, value);
349 ETL_OR_STD::pair<iterator, bool>
insert(rvalue_reference value)
353 ETL_OR_STD::pair<iterator, bool> result(i_element,
false);
356 if ((i_element ==
end()) ||
compare(value.first, i_element->first))
360 result = insert_value(i_element, etl::move(value));
374 iterator
insert(const_iterator , const_reference value)
376 return insert(value).first;
389 return insert(etl::move(value)).first;
401 template <
class TIterator>
402 void insert(TIterator first, TIterator last)
404 while (first != last)
414 ETL_OR_STD::pair<iterator, bool>
emplace(
const value_type& value)
416 return emplace(value.first, value.second);
419#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT
423 template <
typename... Args>
424 ETL_OR_STD::pair<iterator, bool>
emplace(const_key_reference key, Args&&... args)
431 ::new ((
void*)
etl::
addressof(pvalue->second)) mapped_type(
etl::forward<Args>(args)...);
433 iterator i_element = lower_bound(key);
435 ETL_OR_STD::
pair<
iterator,
bool> result(i_element, false);
438 if ((i_element ==
end()) ||
compare(key, i_element->first))
440 ETL_INCREMENT_DEBUG_COUNT;
445 pvalue->~value_type();
457 template <
typename T1>
458 ETL_OR_STD::pair<iterator, bool>
emplace(const_key_reference key,
const T1& value1)
463 value_type* pvalue = storage.allocate<value_type>();
465 ::new ((
void*)
etl::addressof(pvalue->second)) mapped_type(value1);
469 ETL_OR_STD::pair<iterator, bool> result(i_element,
false);
472 if ((i_element ==
end()) || compare(key, i_element->first))
474 ETL_INCREMENT_DEBUG_COUNT;
479 pvalue->~value_type();
480 storage.release(pvalue);
489 template <
typename T1,
typename T2>
490 ETL_OR_STD::pair<iterator, bool>
emplace(const_key_reference key,
const T1& value1,
const T2& value2)
495 value_type* pvalue = storage.allocate<value_type>();
497 ::new ((
void*)
etl::addressof(pvalue->second)) mapped_type(value1, value2);
501 ETL_OR_STD::pair<iterator, bool> result(i_element,
false);
504 if ((i_element ==
end()) || compare(key, i_element->first))
506 ETL_INCREMENT_DEBUG_COUNT;
511 pvalue->~value_type();
512 storage.release(pvalue);
521 template <
typename T1,
typename T2,
typename T3>
522 ETL_OR_STD::pair<iterator, bool>
emplace(const_key_reference key,
const T1& value1,
const T2& value2,
const T3& value3)
527 value_type* pvalue = storage.allocate<value_type>();
529 ::new ((
void*)
etl::addressof(pvalue->second)) mapped_type(value1, value2, value3);
533 ETL_OR_STD::pair<iterator, bool> result(i_element,
false);
536 if ((i_element ==
end()) || compare(key, i_element->first))
538 ETL_INCREMENT_DEBUG_COUNT;
543 pvalue->~value_type();
544 storage.release(pvalue);
553 template <
typename T1,
typename T2,
typename T3,
typename T4>
554 ETL_OR_STD::pair<iterator, bool>
emplace(const_key_reference key,
const T1& value1,
const T2& value2,
const T3& value3,
const T4& value4)
559 value_type* pvalue = storage.allocate<value_type>();
561 ::new ((
void*)
etl::addressof(pvalue->second)) mapped_type(value1, value2, value3, value4);
565 ETL_OR_STD::pair<iterator, bool> result(i_element,
false);
568 if ((i_element ==
end()) || compare(key, i_element->first))
570 ETL_INCREMENT_DEBUG_COUNT;
575 pvalue->~value_type();
576 storage.release(pvalue);
584#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT
589 template <
typename... Args>
590 ETL_OR_STD::pair<iterator, bool>
try_emplace(const_key_reference key, Args&&... args)
595 if ((i_element !=
end()) && !
compare(key, i_element->first))
597 return ETL_OR_STD::pair<iterator, bool>(i_element,
false);
603 value_type* pvalue = storage.
allocate<value_type>();
605 ::new ((
void*)
etl::
addressof(pvalue->second)) mapped_type(
etl::forward<Args>(args)...);
606 ETL_INCREMENT_DEBUG_COUNT;
608 return refmap_t::
insert_at(i_element, *pvalue);
615 template <typename... Args>
616 ETL_OR_STD::pair<iterator,
bool>
try_emplace(rvalue_key_reference key, Args&&... args)
621 if ((i_element !=
end()) && !compare(key, i_element->first))
623 return ETL_OR_STD::pair<iterator, bool>(i_element,
false);
629 value_type* pvalue = storage.allocate<value_type>();
630 ::new ((
void*)
etl::addressof(pvalue->first)) key_type(etl::move(key));
631 ::new ((
void*)etl::
addressof(pvalue->second)) mapped_type(etl::forward<Args>(args)...);
632 ETL_INCREMENT_DEBUG_COUNT;
634 return refmap_t::
insert_at(i_element, *pvalue);
642 template <
typename T1>
643 ETL_OR_STD::pair<iterator, bool>
try_emplace(const_key_reference key,
const T1& value1)
648 if ((i_element !=
end()) && !compare(key, i_element->first))
650 return ETL_OR_STD::pair<iterator, bool>(i_element,
false);
656 value_type* pvalue = storage.allocate<value_type>();
658 ::new ((
void*)
etl::addressof(pvalue->second)) mapped_type(value1);
659 ETL_INCREMENT_DEBUG_COUNT;
667 template <
typename T1,
typename T2>
668 ETL_OR_STD::pair<iterator, bool>
try_emplace(const_key_reference key,
const T1& value1,
const T2& value2)
673 if ((i_element !=
end()) && !compare(key, i_element->first))
675 return ETL_OR_STD::pair<iterator, bool>(i_element,
false);
681 value_type* pvalue = storage.allocate<value_type>();
683 ::new ((
void*)
etl::addressof(pvalue->second)) mapped_type(value1, value2);
684 ETL_INCREMENT_DEBUG_COUNT;
692 template <
typename T1,
typename T2,
typename T3>
693 ETL_OR_STD::pair<iterator, bool>
try_emplace(const_key_reference key,
const T1& value1,
const T2& value2,
const T3& value3)
698 if ((i_element !=
end()) && !compare(key, i_element->first))
700 return ETL_OR_STD::pair<iterator, bool>(i_element,
false);
706 value_type* pvalue = storage.allocate<value_type>();
708 ::new ((
void*)
etl::addressof(pvalue->second)) mapped_type(value1, value2, value3);
709 ETL_INCREMENT_DEBUG_COUNT;
717 template <
typename T1,
typename T2,
typename T3,
typename T4>
718 ETL_OR_STD::pair<iterator, bool>
try_emplace(const_key_reference key,
const T1& value1,
const T2& value2,
const T3& value3,
const T4& value4)
723 if ((i_element !=
end()) && !compare(key, i_element->first))
725 return ETL_OR_STD::pair<iterator, bool>(i_element,
false);
731 value_type* pvalue = storage.allocate<value_type>();
733 ::new ((
void*)
etl::addressof(pvalue->second)) mapped_type(value1, value2, value3, value4);
734 ETL_INCREMENT_DEBUG_COUNT;
746 size_t erase(const_key_reference key)
748 iterator i_element =
find(key);
750 if (i_element ==
end())
756 i_element->~value_type();
759 ETL_DECREMENT_DEBUG_COUNT;
766 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
767 size_t erase(K&& key)
771 if (i_element ==
end())
777 i_element->~value_type();
780 ETL_DECREMENT_DEBUG_COUNT;
792 i_element->~value_type();
794 ETL_DECREMENT_DEBUG_COUNT;
802 iterator
erase(const_iterator i_element)
804 i_element->~value_type();
806 ETL_DECREMENT_DEBUG_COUNT;
817 iterator
erase(const_iterator first, const_iterator last)
819 const_iterator itr = first;
826 ETL_DECREMENT_DEBUG_COUNT;
837 if ETL_IF_CONSTEXPR (etl::is_trivially_destructible<value_type>::value)
839 storage.release_all();
843 iterator itr =
begin();
853 ETL_RESET_DEBUG_COUNT;
862 iterator
find(const_key_reference key)
869 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
881 const_iterator
find(const_key_reference key)
const
888 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
900 size_t count(const_key_reference key)
const
907 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
908 size_t count(
const K& key)
const
926 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
945 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
964 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
983 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
995 ETL_OR_STD::pair<iterator, iterator>
equal_range(const_key_reference key)
1002 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
1003 ETL_OR_STD::pair<iterator, iterator>
equal_range(
const K& key)
1014 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(const_key_reference key)
const
1021 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
1022 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(
const K& key)
const
1038 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
1064 move_container(etl::move(rhs));
1146 etl::iflat_map<TKey, TMapped, TKeyCompare>::iterator first = rhs.begin();
1147 etl::iflat_map<TKey, TMapped, TKeyCompare>::iterator last = rhs.end();
1150 while (first != last)
1152 typename etl::iflat_map<TKey, TMapped, TKeyCompare>::iterator temp = first;
1155 this->
insert(etl::move(*first));
1169 TKeyCompare compare;
1172 ETL_DECLARE_DEBUG_COUNT;
1176 template <
typename TValueType>
1177 ETL_OR_STD::pair<iterator, bool> insert_value(iterator i_element, TValueType&& value)
1181 value_type* pvalue = storage.allocate<value_type>();
1182 ::new (pvalue) value_type(etl::forward<TValueType>(value));
1183 ETL_INCREMENT_DEBUG_COUNT;
1188 ETL_OR_STD::pair<iterator, bool> insert_value(iterator i_element, const_reference value)
1192 value_type* pvalue = storage.allocate<value_type>();
1193 ::new (pvalue) value_type(value_type(value));
1194 ETL_INCREMENT_DEBUG_COUNT;
1201 ETL_OR_STD::pair<iterator, bool> insert_default_value(iterator i_element, rvalue_key_reference key)
1205 value_type* pvalue = storage.allocate<value_type>();
1206 ::new ((
void*)
etl::addressof(pvalue->first)) key_type(etl::move(key));
1207 ::new ((
void*)etl::
addressof(pvalue->second)) mapped_type();
1208 ETL_INCREMENT_DEBUG_COUNT;
1210 return refmap_t::
insert_at(i_element, *pvalue);
1215 ETL_OR_STD::pair<iterator, bool> insert_default_value(iterator i_element, const_key_reference key)
1219 value_type* pvalue = storage.allocate<value_type>();
1221 ::new ((
void*)etl::
addressof(pvalue->second)) mapped_type();
1222 ETL_INCREMENT_DEBUG_COUNT;
1224 return refmap_t::
insert_at(i_element, *pvalue);
1230#if defined(ETL_POLYMORPHIC_FLAT_MAP) || defined(ETL_POLYMORPHIC_CONTAINERS)
1250 template <
typename TKey,
typename TMapped,
typename TKeyCompare>
1263 template <
typename TKey,
typename TMapped,
typename TKeyCompare>
1266 return !(lhs == rhs);
1277 template <
typename TKey,
typename TValue, const
size_t MAX_SIZE_,
typename TCompare = etl::less<TKey> >
1282 static ETL_CONSTANT
size_t MAX_SIZE = MAX_SIZE_;
1288 :
etl::
iflat_map<TKey, TValue, TCompare>(lookup, storage)
1296 :
etl::
iflat_map<TKey, TValue, TCompare>(lookup, storage)
1306 :
etl::
iflat_map<TKey, TValue, TCompare>(lookup, storage)
1310 this->move_container(etl::move(other));
1321 template <
typename TIterator>
1323 :
etl::
iflat_map<TKey, TValue, TCompare>(lookup, storage)
1325 this->
assign(first, last);
1328#if ETL_HAS_INITIALIZER_LIST
1332 flat_map(std::initializer_list<
typename etl::iflat_map<TKey, TValue, TCompare>::value_type> init)
1333 :
etl::
iflat_map<TKey, TValue, TCompare>(lookup, storage)
1335 this->assign(init.begin(), init.end());
1368 this->move_container(etl::move(rhs));
1377 typedef typename etl::iflat_map<TKey, TValue, TCompare>::value_type node_t;
1380 etl::pool<node_t, MAX_SIZE> storage;
1383 etl::vector<node_t*, MAX_SIZE> lookup;
1386 template <
typename TKey,
typename TValue, const
size_t MAX_SIZE_,
typename TCompare>
1387 ETL_CONSTANT
size_t flat_map<TKey, TValue, MAX_SIZE_, TCompare>::MAX_SIZE;
1392#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
1393 template <
typename... TPairs>
1395 -> flat_map<
typename etl::nth_type_t<0, TPairs...>::first_type,
typename etl::nth_type_t<0, TPairs...>::second_type,
sizeof...(TPairs)>;
1401#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
1402 template <
typename TKey,
typename TMapped,
typename TKeyCompare = etl::less<TKey>,
typename... TPairs>
1403 constexpr auto make_flat_map(TPairs&&... pairs) -> etl::flat_map<TKey, TMapped,
sizeof...(TPairs), TKeyCompare>
1405 return {etl::forward<TPairs>(pairs)...};
#define ETL_ASSERT(b, e)
Definition error_handler.h:511
ETL_OR_STD::pair< iterator, bool > emplace(const_key_reference key, const T1 &value1, const T2 &value2)
Emplaces a value to the map.
Definition flat_map.h:490
const_iterator lower_bound(const_key_reference key) const
Definition flat_map.h:938
size_t count(const_key_reference key) const
Definition flat_map.h:900
size_type max_size() const
Definition flat_map.h:1110
reverse_iterator rbegin()
Definition flat_map.h:163
iterator begin()
Definition flat_map.h:109
ETL_OR_STD::pair< iterator, iterator > equal_range(const_key_reference key)
Definition flat_map.h:995
~flat_map()
Destructor.
Definition flat_map.h:1342
void clear()
Clears the flat_map.
Definition flat_map.h:835
iflat_map(lookup_t &lookup_, storage_t &storage_)
Constructor.
Definition flat_map.h:1129
size_t available() const
Definition flat_map.h:1119
iterator find(const_key_reference key)
Definition flat_map.h:862
const_reverse_iterator rbegin() const
Definition flat_map.h:173
const_iterator upper_bound(const_key_reference key) const
Definition flat_map.h:976
mapped_reference at(const_key_reference key)
Definition flat_map.h:260
iterator erase(const_iterator i_element)
\ param i_element Iterator to the element.
Definition flat_map.h:802
~iflat_map()
Destructor.
Definition flat_map.h:1239
iterator upper_bound(const_key_reference key)
Definition flat_map.h:957
ETL_OR_STD::pair< iterator, bool > emplace(const value_type &value)
Emplaces a value to the map.
Definition flat_map.h:414
const_iterator cend() const
Definition flat_map.h:154
const_reverse_iterator crbegin() const
Definition flat_map.h:201
const_mapped_reference at(const_key_reference key) const
Definition flat_map.h:281
flat_map & operator=(const flat_map &rhs)
Assignment operator.
Definition flat_map.h:1350
reverse_iterator rend()
Definition flat_map.h:182
size_type capacity() const
Definition flat_map.h:1101
flat_map()
Constructor.
Definition flat_map.h:1287
iterator erase(iterator i_element)
Definition flat_map.h:790
ETL_OR_STD::pair< iterator, bool > insert(const_reference value)
Definition flat_map.h:327
ETL_OR_STD::pair< iterator, bool > emplace(const_key_reference key, const T1 &value1)
Emplaces a value to the map.
Definition flat_map.h:458
const_iterator cbegin() const
Definition flat_map.h:145
size_t erase(const_key_reference key)
Definition flat_map.h:746
bool contains(const_key_reference key) const
Check if the map contains the key.
Definition flat_map.h:1031
iflat_map & operator=(const iflat_map &rhs)
Assignment operator.
Definition flat_map.h:1048
ETL_OR_STD::pair< iterator, bool > emplace(const_key_reference key, const T1 &value1, const T2 &value2, const T3 &value3, const T4 &value4)
Emplaces a value to the map.
Definition flat_map.h:554
const_iterator begin() const
Definition flat_map.h:118
const_iterator end() const
Definition flat_map.h:136
bool full() const
Definition flat_map.h:1092
const_reverse_iterator rend() const
Definition flat_map.h:191
ETL_OR_STD::pair< iterator, bool > try_emplace(const_key_reference key, const T1 &value1, const T2 &value2)
Inserts an element into the flat_map if the key does not exist.
Definition flat_map.h:668
ETL_OR_STD::pair< iterator, bool > try_emplace(const_key_reference key, const T1 &value1)
Inserts an element into the flat_map if the key does not exist.
Definition flat_map.h:643
iterator end()
Definition flat_map.h:127
bool empty() const
Definition flat_map.h:1083
flat_map(const flat_map &other)
Copy constructor.
Definition flat_map.h:1295
ETL_OR_STD::pair< iterator, bool > try_emplace(const_key_reference key, const T1 &value1, const T2 &value2, const T3 &value3, const T4 &value4)
Inserts an element into the flat_map if the key does not exist.
Definition flat_map.h:718
iterator erase(const_iterator first, const_iterator last)
Definition flat_map.h:817
const_iterator find(const_key_reference key) const
Definition flat_map.h:881
void insert(TIterator first, TIterator last)
Definition flat_map.h:402
ETL_OR_STD::pair< iterator, bool > try_emplace(const_key_reference key, const T1 &value1, const T2 &value2, const T3 &value3)
Inserts an element into the flat_map if the key does not exist.
Definition flat_map.h:693
void assign(TIterator first, TIterator last)
Definition flat_map.h:305
iterator insert(const_iterator, const_reference value)
Definition flat_map.h:374
const_reverse_iterator crend() const
Definition flat_map.h:210
flat_map(TIterator first, TIterator last)
Definition flat_map.h:1322
ETL_OR_STD::pair< iterator, bool > emplace(const_key_reference key, const T1 &value1, const T2 &value2, const T3 &value3)
Emplaces a value to the map.
Definition flat_map.h:522
iterator lower_bound(const_key_reference key)
Definition flat_map.h:919
size_type size() const
Definition flat_map.h:1074
mapped_reference operator[](const_key_reference key)
Definition flat_map.h:240
ETL_OR_STD::pair< const_iterator, const_iterator > equal_range(const_key_reference key) const
Definition flat_map.h:1014
Definition flat_map.h:1279
ETL_CONSTEXPR17 etl::enable_if<!etl::is_same< T, etl::nullptr_t >::value, T >::type * addressof(T &t)
Definition addressof.h:52
T * allocate()
Definition ipool.h:334
void release(const void *const p_object)
Definition ipool.h:461
mapped_type & at(key_parameter_t key)
Definition reference_flat_map.h:474
iterator begin()
Definition reference_flat_map.h:356
void clear()
Definition reference_flat_map.h:680
ETL_OR_STD::pair< iterator, bool > insert_at(iterator i_element, value_type &value)
Definition reference_flat_map.h:1006
const_reverse_iterator crbegin() const
Definition reference_flat_map.h:452
reverse_iterator rend()
Definition reference_flat_map.h:431
size_t count(key_parameter_t key) const
Definition reference_flat_map.h:784
iterator end()
Definition reference_flat_map.h:374
const_iterator cbegin() const
Definition reference_flat_map.h:392
ETL_OR_STD::pair< iterator, iterator > equal_range(key_parameter_t key)
Definition reference_flat_map.h:879
size_t available() const
Definition reference_flat_map.h:986
const_reverse_iterator crend() const
Definition reference_flat_map.h:462
size_type max_size() const
Definition reference_flat_map.h:977
bool empty() const
Definition reference_flat_map.h:950
iterator lower_bound(key_parameter_t key)
Definition reference_flat_map.h:803
reverse_iterator rbegin()
Definition reference_flat_map.h:411
iterator upper_bound(key_parameter_t key)
Definition reference_flat_map.h:841
size_type size() const
Definition reference_flat_map.h:941
iterator find(key_parameter_t key)
Definition reference_flat_map.h:690
const_iterator cend() const
Definition reference_flat_map.h:401
size_t erase(key_parameter_t key)
Definition reference_flat_map.h:613
bool full() const
Definition reference_flat_map.h:959
size_type capacity() const
Definition reference_flat_map.h:968
Definition reference_flat_map.h:79
Definition reference_flat_map.h:110
ETL_CONSTEXPR14 bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1078
ETL_CONSTEXPR14 bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1090
TContainer::iterator end(TContainer &container)
Definition iterator.h:1166
iterator
Definition iterator.h:482
pair holds two objects of arbitrary type
Definition utility.h:176