31 #ifndef ETL_FLAT_MAP_INCLUDED
32 #define ETL_FLAT_MAP_INCLUDED
39 #if ETL_CPP11_SUPPORTED && ETL_NOT_USING_STLPORT && ETL_USING_STL
40 #include <initializer_list>
64 template <
typename TKey,
typename TMapped,
typename TKeyCompare = etl::less<TKey> >
75 typedef ETL_OR_STD::pair<const TKey, TMapped> value_type;
76 typedef TKey key_type;
77 typedef TMapped mapped_type;
78 typedef TKeyCompare key_compare;
79 typedef value_type& reference;
80 typedef const value_type& const_reference;
81 #if ETL_CPP11_SUPPORTED
82 typedef value_type&& rvalue_reference;
84 typedef value_type* pointer;
85 typedef const value_type* const_pointer;
86 typedef size_t size_type;
91 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
92 typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
93 typedef typename etl::iterator_traits<iterator>::difference_type difference_type;
97 typedef const key_type& key_parameter_t;
108 bool operator ()(
const value_type& element, key_type key)
const
110 return comp(element.first, key);
113 bool operator ()(key_type key,
const value_type& element)
const
115 return comp(key, element.first);
208 const_reverse_iterator
rend()
const
226 const_reverse_iterator
crend()
const
238 return insert(ETL_OR_STD::make_pair(key, mapped_type())).first->second;
247 mapped_type&
at(key_parameter_t key)
258 const mapped_type&
at(key_parameter_t key)
const
270 template <
typename TIterator>
271 void assign(TIterator first, TIterator last)
273 #if defined(ETL_DEBUG)
274 difference_type d = etl::distance(first, last);
280 while (first != last)
291 ETL_OR_STD::pair<iterator, bool>
insert(const_reference value)
295 ETL_OR_STD::pair<iterator, bool> result(i_element,
false);
298 if ((i_element ==
end()) || compare(value.first, i_element->first))
302 value_type* pvalue = storage.
allocate<value_type>();
303 ::new (pvalue) value_type(value);
304 ETL_INCREMENT_DEBUG_COUNT
311 #if ETL_CPP11_SUPPORTED
317 ETL_OR_STD::pair<iterator, bool>
insert(rvalue_reference value)
321 ETL_OR_STD::pair<iterator, bool> result(i_element,
false);
324 if ((i_element ==
end()) ||
compare(value.first, i_element->first))
328 value_type* pvalue = storage.
allocate<value_type>();
329 ::new (pvalue) value_type(etl::move(value));
330 ETL_INCREMENT_DEBUG_COUNT
346 return insert(value).first;
349 #if ETL_CPP11_SUPPORTED
358 return insert(etl::move(value)).first;
369 template <
class TIterator>
370 void insert(TIterator first, TIterator last)
372 while (first != last)
381 ETL_OR_STD::pair<iterator, bool>
emplace(
const value_type& value)
383 return emplace(value.first, value.second);
386 #if ETL_CPP11_SUPPORTED && ETL_NOT_USING_STLPORT
390 template <
typename ... Args>
391 ETL_OR_STD::pair<iterator, bool>
emplace(
const key_type& key, Args && ... args)
396 value_type* pvalue = storage.
allocate<value_type>();
398 ::new ((
void*)
etl::
addressof(pvalue->second)) mapped_type(
etl::forward<Args>(args)...);
402 ETL_OR_STD::
pair<
iterator,
bool> result(i_element, false);
405 if ((i_element ==
end()) ||
compare(key, i_element->first))
407 ETL_INCREMENT_DEBUG_COUNT
412 pvalue->~value_type();
424 template <
typename T1>
425 ETL_OR_STD::pair<iterator, bool>
emplace(
const key_type& key,
const T1& value1)
430 value_type* pvalue = storage.
allocate<value_type>();
432 ::new ((
void*)
etl::addressof(pvalue->second)) mapped_type(value1);
436 ETL_OR_STD::pair<iterator, bool> result(i_element,
false);
439 if ((i_element ==
end()) || compare(key, i_element->first))
441 ETL_INCREMENT_DEBUG_COUNT
446 pvalue->~value_type();
456 template <
typename T1,
typename T2>
457 ETL_OR_STD::pair<iterator, bool>
emplace(
const key_type& key,
const T1& value1,
const T2& value2)
462 value_type* pvalue = storage.
allocate<value_type>();
464 ::new ((
void*)
etl::addressof(pvalue->second)) mapped_type(value1, value2);
468 ETL_OR_STD::pair<iterator, bool> result(i_element,
false);
471 if ((i_element ==
end()) || compare(key, i_element->first))
473 ETL_INCREMENT_DEBUG_COUNT
478 pvalue->~value_type();
488 template <
typename T1,
typename T2,
typename T3>
489 ETL_OR_STD::pair<iterator, bool>
emplace(
const key_type& key,
const T1& value1,
const T2& value2,
const T3& value3)
494 value_type* pvalue = storage.
allocate<value_type>();
496 ::new ((
void*)
etl::addressof(pvalue->second)) mapped_type(value1, value2, value3);
500 ETL_OR_STD::pair<iterator, bool> result(i_element,
false);
503 if ((i_element ==
end()) || compare(key, i_element->first))
505 ETL_INCREMENT_DEBUG_COUNT
510 pvalue->~value_type();
520 template <
typename T1,
typename T2,
typename T3,
typename T4>
521 ETL_OR_STD::pair<iterator, bool>
emplace(
const key_type& key,
const T1& value1,
const T2& value2,
const T3& value3,
const T4& value4)
526 value_type* pvalue = storage.
allocate<value_type>();
528 ::new ((
void*)
etl::addressof(pvalue->second)) mapped_type(value1, value2, value3, value4);
532 ETL_OR_STD::pair<iterator, bool> result(i_element,
false);
535 if ((i_element ==
end()) || compare(key, i_element->first))
537 ETL_INCREMENT_DEBUG_COUNT
542 pvalue->~value_type();
560 if (i_element ==
end())
566 i_element->~value_type();
569 ETL_DECREMENT_DEBUG_COUNT
580 i_element->~value_type();
583 ETL_DECREMENT_DEBUG_COUNT
602 ETL_DECREMENT_DEBUG_COUNT
629 ETL_RESET_DEBUG_COUNT
658 size_t count(key_parameter_t key)
const
708 ETL_OR_STD::pair<iterator, iterator>
equal_range(key_parameter_t key)
718 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(key_parameter_t key)
const
736 #if ETL_CPP11_SUPPORTED
742 move_container(etl::move(rhs));
813 #if ETL_CPP11_SUPPORTED
828 while (first != last)
830 this->
insert(etl::move(*first++));
846 ETL_DECLARE_DEBUG_COUNT
851 #if defined(ETL_POLYMORPHIC_FLAT_MAP) || defined(ETL_POLYMORPHIC_CONTAINERS)
871 template <
typename TKey,
typename TMapped,
typename TKeyCompare>
884 template <
typename TKey,
typename TMapped,
typename TKeyCompare>
887 return !(lhs == rhs);
898 template <
typename TKey,
typename TValue, const
size_t MAX_SIZE_,
typename TCompare = etl::less<TKey> >
903 static const size_t MAX_SIZE = MAX_SIZE_;
909 :
etl::
iflat_map<TKey, TValue, TCompare>(lookup, storage)
917 :
etl::
iflat_map<TKey, TValue, TCompare>(lookup, storage)
922 #if ETL_CPP11_SUPPORTED
927 :
etl::
iflat_map<TKey, TValue, TCompare>(lookup, storage)
931 this->move_container(etl::move(other));
942 template <
typename TIterator>
944 :
etl::
iflat_map<TKey, TValue, TCompare>(lookup, storage)
946 this->
assign(first, last);
949 #if ETL_CPP11_SUPPORTED && ETL_NOT_USING_STLPORT && ETL_USING_STL
953 flat_map(std::initializer_list<
typename etl::iflat_map<TKey, TValue, TCompare>::value_type> init)
954 :
etl::
iflat_map<TKey, TValue, TCompare>(lookup, storage)
956 this->
assign(init.begin(), init.end());
981 #if ETL_CPP11_SUPPORTED
989 this->move_container(etl::move(rhs));
998 typedef typename etl::iflat_map<TKey, TValue, TCompare>::value_type node_t;
1010 #if ETL_CPP17_SUPPORTED && ETL_NOT_USING_STLPORT && ETL_USING_STL
1011 template <
typename T,
typename... Ts>
1013 ->flat_map<etl::enable_if_t<(etl::is_same_v<T, Ts> && ...),
typename T::first_type>,
1014 etl::enable_if_t<(etl::is_same_v<T, Ts> && ...),
typename T::second_type>,
1015 1U +
sizeof...(Ts)>;
Definition: reference_flat_map.h:229
Definition: reference_flat_map.h:130
#define ETL_ASSERT(b, e)
Definition: error_handler.h:290
iterator upper_bound(key_parameter_t key)
Definition: flat_map.h:688
ETL_OR_STD::pair< iterator, bool > emplace(const key_type &key, const T1 &value1, const T2 &value2, const T3 &value3)
Emplaces a value to the map.
Definition: flat_map.h:489
size_type max_size() const
Definition: flat_map.h:788
reverse_iterator rbegin()
Definition: flat_map.h:181
iterator begin()
Definition: flat_map.h:127
iflat_map & operator=(const iflat_map &rhs)
Assignment operator.
Definition: flat_map.h:726
const_iterator lower_bound(key_parameter_t key) const
Definition: flat_map.h:678
void erase(iterator first, iterator last)
Definition: flat_map.h:593
~flat_map()
Destructor.
Definition: flat_map.h:963
void clear()
Clears the flat_map.
Definition: flat_map.h:611
iflat_map(lookup_t &lookup_, storage_t &storage_)
Constructor.
Definition: flat_map.h:807
size_t available() const
Definition: flat_map.h:797
iterator find(key_parameter_t key)
Definition: flat_map.h:638
const_reverse_iterator rbegin() const
Definition: flat_map.h:190
void erase(iterator i_element)
Definition: flat_map.h:578
iterator insert(iterator position, const_reference value)
Definition: flat_map.h:344
const mapped_type & at(key_parameter_t key) const
Definition: flat_map.h:258
const_iterator find(key_parameter_t key) const
Definition: flat_map.h:648
~iflat_map()
Internal debugging.
Definition: flat_map.h:858
const_iterator cend() const
Definition: flat_map.h:172
size_t erase(key_parameter_t key)
Definition: flat_map.h:556
const_reverse_iterator crbegin() const
Definition: flat_map.h:217
reverse_iterator rend()
Definition: flat_map.h:199
ETL_OR_STD::pair< iterator, bool > emplace(const key_type &key, const T1 &value1, const T2 &value2, const T3 &value3, const T4 &value4)
Emplaces a value to the map.
Definition: flat_map.h:521
size_type capacity() const
Definition: flat_map.h:779
flat_map()
Constructor.
Definition: flat_map.h:908
ETL_OR_STD::pair< iterator, iterator > equal_range(key_parameter_t key)
Definition: flat_map.h:708
mapped_type & at(key_parameter_t key)
Definition: flat_map.h:247
const_iterator cbegin() const
Definition: flat_map.h:163
flat_map & operator=(const flat_map &rhs)
Assignment operator.
Definition: flat_map.h:971
const_iterator begin() const
Definition: flat_map.h:136
const_iterator end() const
Definition: flat_map.h:154
ETL_OR_STD::pair< iterator, bool > insert(const_reference value)
Definition: flat_map.h:291
bool full() const
Definition: flat_map.h:770
const_reverse_iterator rend() const
Definition: flat_map.h:208
ETL_OR_STD::pair< const_iterator, const_iterator > equal_range(key_parameter_t key) const
Definition: flat_map.h:718
iterator end()
Definition: flat_map.h:145
bool empty() const
Definition: flat_map.h:761
iterator lower_bound(key_parameter_t key)
Definition: flat_map.h:668
flat_map(const flat_map &other)
Copy constructor.
Definition: flat_map.h:916
ETL_OR_STD::pair< iterator, bool > emplace(const key_type &key, const T1 &value1)
Emplaces a value to the map.
Definition: flat_map.h:425
size_t count(key_parameter_t key) const
Definition: flat_map.h:658
void insert(TIterator first, TIterator last)
Definition: flat_map.h:370
ETL_OR_STD::pair< iterator, bool > emplace(const key_type &key, const T1 &value1, const T2 &value2)
Emplaces a value to the map.
Definition: flat_map.h:457
void assign(TIterator first, TIterator last)
Definition: flat_map.h:271
mapped_type & operator[](key_parameter_t key)
Definition: flat_map.h:236
const_reverse_iterator crend() const
Definition: flat_map.h:226
flat_map(TIterator first, TIterator last)
Definition: flat_map.h:943
const_iterator upper_bound(key_parameter_t key) const
Definition: flat_map.h:698
size_type size() const
Definition: flat_map.h:752
ETL_OR_STD::pair< iterator, bool > emplace(const value_type &value)
Emplaces a value to the map.
Definition: flat_map.h:381
Definition: flat_map.h:900
Definition: flat_map.h:66
T * addressof(T &t)
Definition: memory.h:61
void release_all()
Release all objects in the pool.
Definition: pool.h:264
void release(const void *const p_object)
Definition: pool.h:255
T * allocate()
Definition: pool.h:129
iterator begin()
Definition: reference_flat_map.h:357
void clear()
Clears the reference_flat_map.
Definition: reference_flat_map.h:627
const_reverse_iterator crbegin() const
Definition: reference_flat_map.h:447
reverse_iterator rend()
Definition: reference_flat_map.h:429
ETL_OR_STD::pair< iterator, iterator > equal_range(key_parameter_t key)
Definition: reference_flat_map.h:735
size_t count(key_parameter_t key) const
Definition: reference_flat_map.h:685
iterator end()
Definition: reference_flat_map.h:375
const_iterator cbegin() const
Definition: reference_flat_map.h:393
size_t available() const
Definition: reference_flat_map.h:803
const_reverse_iterator crend() const
Definition: reference_flat_map.h:456
size_type max_size() const
Definition: reference_flat_map.h:794
bool empty() const
Definition: reference_flat_map.h:767
iterator lower_bound(key_parameter_t key)
Definition: reference_flat_map.h:695
reverse_iterator rbegin()
Definition: reference_flat_map.h:411
iterator upper_bound(key_parameter_t key)
Definition: reference_flat_map.h:715
size_type size() const
Definition: reference_flat_map.h:758
iterator find(key_parameter_t key)
Definition: reference_flat_map.h:637
const_iterator cend() const
Definition: reference_flat_map.h:402
mapped_type & at(key_parameter_t key)
Definition: reference_flat_map.h:495
size_t erase(key_parameter_t key)
Definition: reference_flat_map.h:588
bool full() const
Definition: reference_flat_map.h:776
ETL_OR_STD::pair< iterator, bool > insert_at(iterator i_element, value_type &value)
Definition: reference_flat_map.h:823
size_type capacity() const
Definition: reference_flat_map.h:785
Definition: reference_flat_map.h:78
Definition: reference_flat_map.h:108
is_trivially_destructible
Definition: type_traits_generator.h:1171
Definition: absolute.h:37
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
iterator
Definition: iterator.h:422
Definition: utility.h:108