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;
110 bool operator()(
const value_type& element, key_type key)
const
112 return comp(element.first, key);
115 bool operator()(key_type key,
const value_type& element)
const
117 return comp(key, element.first);
156 const_iterator
end()
const
211 const_reverse_iterator
rend()
const
230 const_reverse_iterator
crend()
const
241 mapped_reference
operator[](rvalue_key_reference key)
246 if ((i_element ==
end()) ||
compare(key, i_element->first))
248 insert_default_value(i_element, etl::move(key));
251 return i_element->second;
265 if ((i_element ==
end()) || compare(key, i_element->first))
267 insert_default_value(i_element, key);
270 return i_element->second;
280 mapped_reference
at(const_key_reference key)
287 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
288 mapped_reference
at(
const K& key)
301 const_mapped_reference
at(const_key_reference key)
const
308 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
309 const_mapped_reference
at(
const K& key)
const
324 template <
typename TIterator>
325 void assign(TIterator first, TIterator last)
327#if ETL_IS_DEBUG_BUILD
328 difference_type d = etl::distance(first, last);
334 while (first != last)
347 ETL_OR_STD::pair<iterator, bool>
insert(const_reference value)
351 ETL_OR_STD::pair<iterator, bool> result(i_element,
false);
354 if ((i_element ==
end()) || compare(value.first, i_element->first))
356 result = insert_value(i_element, value);
369 ETL_OR_STD::pair<iterator, bool>
insert(rvalue_reference value)
373 ETL_OR_STD::pair<iterator, bool> result(i_element,
false);
376 if ((i_element ==
end()) ||
compare(value.first, i_element->first))
380 result = insert_value(i_element, etl::move(value));
394 iterator
insert(const_iterator , const_reference value)
396 return insert(value).first;
409 return insert(etl::move(value)).first;
421 template <
class TIterator>
422 void insert(TIterator first, TIterator last)
424 while (first != last)
434 ETL_OR_STD::pair<iterator, bool>
emplace(
const value_type& value)
436 return emplace(value.first, value.second);
439#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT
443 template <
typename... Args>
444 ETL_OR_STD::pair<iterator, bool>
emplace(const_key_reference key, Args&&... args)
451 ::new ((
void*)
etl::
addressof(pvalue->second)) mapped_type(
etl::forward<Args>(args)...);
453 iterator i_element = lower_bound(key);
455 ETL_OR_STD::
pair<
iterator,
bool> result(i_element, false);
458 if ((i_element ==
end()) ||
compare(key, i_element->first))
460 ETL_INCREMENT_DEBUG_COUNT;
465 pvalue->~value_type();
477 template <
typename T1>
478 ETL_OR_STD::pair<iterator, bool>
emplace(const_key_reference key,
const T1& value1)
483 value_type* pvalue = storage.allocate<value_type>();
485 ::new ((
void*)
etl::addressof(pvalue->second)) mapped_type(value1);
489 ETL_OR_STD::pair<iterator, bool> result(i_element,
false);
492 if ((i_element ==
end()) || compare(key, i_element->first))
494 ETL_INCREMENT_DEBUG_COUNT;
499 pvalue->~value_type();
500 storage.release(pvalue);
509 template <
typename T1,
typename T2>
510 ETL_OR_STD::pair<iterator, bool>
emplace(const_key_reference key,
const T1& value1,
const T2& value2)
515 value_type* pvalue = storage.allocate<value_type>();
517 ::new ((
void*)
etl::addressof(pvalue->second)) mapped_type(value1, value2);
521 ETL_OR_STD::pair<iterator, bool> result(i_element,
false);
524 if ((i_element ==
end()) || compare(key, i_element->first))
526 ETL_INCREMENT_DEBUG_COUNT;
531 pvalue->~value_type();
532 storage.release(pvalue);
541 template <
typename T1,
typename T2,
typename T3>
542 ETL_OR_STD::pair<iterator, bool>
emplace(const_key_reference key,
const T1& value1,
const T2& value2,
const T3& value3)
547 value_type* pvalue = storage.allocate<value_type>();
549 ::new ((
void*)
etl::addressof(pvalue->second)) mapped_type(value1, value2, value3);
553 ETL_OR_STD::pair<iterator, bool> result(i_element,
false);
556 if ((i_element ==
end()) || compare(key, i_element->first))
558 ETL_INCREMENT_DEBUG_COUNT;
563 pvalue->~value_type();
564 storage.release(pvalue);
573 template <
typename T1,
typename T2,
typename T3,
typename T4>
574 ETL_OR_STD::pair<iterator, bool>
emplace(const_key_reference key,
const T1& value1,
const T2& value2,
const T3& value3,
const T4& value4)
579 value_type* pvalue = storage.allocate<value_type>();
581 ::new ((
void*)
etl::addressof(pvalue->second)) mapped_type(value1, value2, value3, value4);
585 ETL_OR_STD::pair<iterator, bool> result(i_element,
false);
588 if ((i_element ==
end()) || compare(key, i_element->first))
590 ETL_INCREMENT_DEBUG_COUNT;
595 pvalue->~value_type();
596 storage.release(pvalue);
609 size_t erase(const_key_reference key)
611 iterator i_element =
find(key);
613 if (i_element ==
end())
619 i_element->~value_type();
622 ETL_DECREMENT_DEBUG_COUNT;
629 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
630 size_t erase(K&& key)
634 if (i_element ==
end())
640 i_element->~value_type();
643 ETL_DECREMENT_DEBUG_COUNT;
655 i_element->~value_type();
657 ETL_DECREMENT_DEBUG_COUNT;
665 iterator
erase(const_iterator i_element)
667 i_element->~value_type();
669 ETL_DECREMENT_DEBUG_COUNT;
680 iterator
erase(const_iterator first, const_iterator last)
682 const_iterator itr = first;
689 ETL_DECREMENT_DEBUG_COUNT;
700 if ETL_IF_CONSTEXPR (etl::is_trivially_destructible<value_type>::value)
702 storage.release_all();
706 iterator itr =
begin();
716 ETL_RESET_DEBUG_COUNT;
725 iterator
find(const_key_reference key)
732 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
744 const_iterator
find(const_key_reference key)
const
751 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
763 size_t count(const_key_reference key)
const
770 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
771 size_t count(
const K& key)
const
789 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
808 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
827 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
846 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
858 ETL_OR_STD::pair<iterator, iterator>
equal_range(const_key_reference key)
865 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
866 ETL_OR_STD::pair<iterator, iterator>
equal_range(
const K& key)
877 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(const_key_reference key)
const
884 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
885 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(
const K& key)
const
901 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
927 move_container(etl::move(rhs));
1009 etl::iflat_map<TKey, TMapped, TKeyCompare>::iterator first = rhs.begin();
1010 etl::iflat_map<TKey, TMapped, TKeyCompare>::iterator last = rhs.end();
1013 while (first != last)
1015 typename etl::iflat_map<TKey, TMapped, TKeyCompare>::iterator temp = first;
1018 this->
insert(etl::move(*first));
1032 TKeyCompare compare;
1035 ETL_DECLARE_DEBUG_COUNT;
1039 template <
typename TValueType>
1040 ETL_OR_STD::pair<iterator, bool> insert_value(iterator i_element, TValueType&& value)
1044 value_type* pvalue = storage.allocate<value_type>();
1045 ::new (pvalue) value_type(etl::forward<TValueType>(value));
1046 ETL_INCREMENT_DEBUG_COUNT;
1051 ETL_OR_STD::pair<iterator, bool> insert_value(iterator i_element, const_reference value)
1055 value_type* pvalue = storage.allocate<value_type>();
1056 ::new (pvalue) value_type(value_type(value));
1057 ETL_INCREMENT_DEBUG_COUNT;
1064 ETL_OR_STD::pair<iterator, bool> insert_default_value(iterator i_element, rvalue_key_reference key)
1068 value_type* pvalue = storage.allocate<value_type>();
1069 ::new ((
void*)
etl::addressof(pvalue->first)) key_type(etl::move(key));
1070 ::new ((
void*)etl::
addressof(pvalue->second)) mapped_type();
1071 ETL_INCREMENT_DEBUG_COUNT;
1073 return refmap_t::
insert_at(i_element, *pvalue);
1078 ETL_OR_STD::pair<iterator, bool> insert_default_value(iterator i_element, const_key_reference key)
1082 value_type* pvalue = storage.allocate<value_type>();
1084 ::new ((
void*)etl::
addressof(pvalue->second)) mapped_type();
1085 ETL_INCREMENT_DEBUG_COUNT;
1087 return refmap_t::
insert_at(i_element, *pvalue);
1093#if defined(ETL_POLYMORPHIC_FLAT_MAP) || defined(ETL_POLYMORPHIC_CONTAINERS)
1113 template <
typename TKey,
typename TMapped,
typename TKeyCompare>
1126 template <
typename TKey,
typename TMapped,
typename TKeyCompare>
1129 return !(lhs == rhs);
1140 template <
typename TKey,
typename TValue, const
size_t MAX_SIZE_,
typename TCompare = etl::less<TKey> >
1145 static ETL_CONSTANT
size_t MAX_SIZE = MAX_SIZE_;
1151 :
etl::
iflat_map<TKey, TValue, TCompare>(lookup, storage)
1159 :
etl::
iflat_map<TKey, TValue, TCompare>(lookup, storage)
1169 :
etl::
iflat_map<TKey, TValue, TCompare>(lookup, storage)
1173 this->move_container(etl::move(other));
1184 template <
typename TIterator>
1186 :
etl::
iflat_map<TKey, TValue, TCompare>(lookup, storage)
1188 this->
assign(first, last);
1191#if ETL_HAS_INITIALIZER_LIST
1195 flat_map(std::initializer_list<
typename etl::iflat_map<TKey, TValue, TCompare>::value_type> init)
1196 :
etl::
iflat_map<TKey, TValue, TCompare>(lookup, storage)
1198 this->assign(init.begin(), init.end());
1231 this->move_container(etl::move(rhs));
1240 typedef typename etl::iflat_map<TKey, TValue, TCompare>::value_type node_t;
1243 etl::pool<node_t, MAX_SIZE> storage;
1246 etl::vector<node_t*, MAX_SIZE> lookup;
1249 template <
typename TKey,
typename TValue, const
size_t MAX_SIZE_,
typename TCompare>
1250 ETL_CONSTANT
size_t flat_map<TKey, TValue, MAX_SIZE_, TCompare>::MAX_SIZE;
1255#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
1256 template <
typename... TPairs>
1258 -> flat_map<
typename etl::nth_type_t<0, TPairs...>::first_type,
typename etl::nth_type_t<0, TPairs...>::second_type,
sizeof...(TPairs)>;
1264#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
1265 template <
typename TKey,
typename TMapped,
typename TKeyCompare = etl::less<TKey>,
typename... TPairs>
1266 constexpr auto make_flat_map(TPairs&&... pairs) -> etl::flat_map<TKey, TMapped,
sizeof...(TPairs), TKeyCompare>
1268 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:510
const_iterator lower_bound(const_key_reference key) const
Definition flat_map.h:801
size_t count(const_key_reference key) const
Definition flat_map.h:763
size_type max_size() const
Definition flat_map.h:973
reverse_iterator rbegin()
Definition flat_map.h:183
iterator begin()
Definition flat_map.h:129
ETL_OR_STD::pair< iterator, iterator > equal_range(const_key_reference key)
Definition flat_map.h:858
~flat_map()
Destructor.
Definition flat_map.h:1205
void clear()
Clears the flat_map.
Definition flat_map.h:698
iflat_map(lookup_t &lookup_, storage_t &storage_)
Constructor.
Definition flat_map.h:992
size_t available() const
Definition flat_map.h:982
iterator find(const_key_reference key)
Definition flat_map.h:725
const_reverse_iterator rbegin() const
Definition flat_map.h:193
const_iterator upper_bound(const_key_reference key) const
Definition flat_map.h:839
mapped_reference at(const_key_reference key)
Definition flat_map.h:280
iterator erase(const_iterator i_element)
\ param i_element Iterator to the element.
Definition flat_map.h:665
~iflat_map()
Destructor.
Definition flat_map.h:1102
iterator upper_bound(const_key_reference key)
Definition flat_map.h:820
ETL_OR_STD::pair< iterator, bool > emplace(const value_type &value)
Emplaces a value to the map.
Definition flat_map.h:434
const_iterator cend() const
Definition flat_map.h:174
const_reverse_iterator crbegin() const
Definition flat_map.h:221
const_mapped_reference at(const_key_reference key) const
Definition flat_map.h:301
flat_map & operator=(const flat_map &rhs)
Assignment operator.
Definition flat_map.h:1213
reverse_iterator rend()
Definition flat_map.h:202
size_type capacity() const
Definition flat_map.h:964
flat_map()
Constructor.
Definition flat_map.h:1150
iterator erase(iterator i_element)
Definition flat_map.h:653
ETL_OR_STD::pair< iterator, bool > insert(const_reference value)
Definition flat_map.h:347
ETL_OR_STD::pair< iterator, bool > emplace(const_key_reference key, const T1 &value1)
Emplaces a value to the map.
Definition flat_map.h:478
const_iterator cbegin() const
Definition flat_map.h:165
size_t erase(const_key_reference key)
Definition flat_map.h:609
bool contains(const_key_reference key) const
Check if the map contains the key.
Definition flat_map.h:894
iflat_map & operator=(const iflat_map &rhs)
Assignment operator.
Definition flat_map.h:911
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:574
const_iterator begin() const
Definition flat_map.h:138
const_iterator end() const
Definition flat_map.h:156
bool full() const
Definition flat_map.h:955
const_reverse_iterator rend() const
Definition flat_map.h:211
iterator end()
Definition flat_map.h:147
bool empty() const
Definition flat_map.h:946
flat_map(const flat_map &other)
Copy constructor.
Definition flat_map.h:1158
iterator erase(const_iterator first, const_iterator last)
Definition flat_map.h:680
const_iterator find(const_key_reference key) const
Definition flat_map.h:744
void insert(TIterator first, TIterator last)
Definition flat_map.h:422
void assign(TIterator first, TIterator last)
Definition flat_map.h:325
iterator insert(const_iterator, const_reference value)
Definition flat_map.h:394
const_reverse_iterator crend() const
Definition flat_map.h:230
flat_map(TIterator first, TIterator last)
Definition flat_map.h:1185
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:542
iterator lower_bound(const_key_reference key)
Definition flat_map.h:782
size_type size() const
Definition flat_map.h:937
mapped_reference operator[](const_key_reference key)
Definition flat_map.h:260
ETL_OR_STD::pair< const_iterator, const_iterator > equal_range(const_key_reference key) const
Definition flat_map.h:877
Definition flat_map.h:1142
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:333
void release(const void *const p_object)
Definition ipool.h:460
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:668
ETL_OR_STD::pair< iterator, bool > insert_at(iterator i_element, value_type &value)
Definition reference_flat_map.h:994
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:772
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:867
size_t available() const
Definition reference_flat_map.h:974
const_reverse_iterator crend() const
Definition reference_flat_map.h:462
size_type max_size() const
Definition reference_flat_map.h:965
bool empty() const
Definition reference_flat_map.h:938
iterator lower_bound(key_parameter_t key)
Definition reference_flat_map.h:791
reverse_iterator rbegin()
Definition reference_flat_map.h:411
iterator upper_bound(key_parameter_t key)
Definition reference_flat_map.h:829
size_type size() const
Definition reference_flat_map.h:929
iterator find(key_parameter_t key)
Definition reference_flat_map.h:678
const_iterator cend() const
Definition reference_flat_map.h:401
size_t erase(key_parameter_t key)
Definition reference_flat_map.h:601
bool full() const
Definition reference_flat_map.h:947
size_type capacity() const
Definition reference_flat_map.h:956
Definition reference_flat_map.h:79
Definition reference_flat_map.h:110
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
ETL_CONSTEXPR14 bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1093
ETL_CONSTEXPR TContainer::iterator end(TContainer &container)
Definition iterator.h:997
iterator
Definition iterator.h:424
pair holds two objects of arbitrary type
Definition utility.h:176