31#ifndef ETL_REFERENCE_FLAT_MAP_INCLUDED
32#define ETL_REFERENCE_FLAT_MAP_INCLUDED
42#include "static_assert.h"
69 flat_map_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
70 :
exception(reason_, file_name_, line_number_)
83 flat_map_full(string_type file_name_, numeric_type line_number_)
84 :
flat_map_exception(ETL_ERROR_TEXT(
"flat_map: full", ETL_REFERENCE_FLAT_MAP_FILE_ID
"A"), file_name_, line_number_)
98 :
flat_map_exception(ETL_ERROR_TEXT(
"flat_map:bounds", ETL_REFERENCE_FLAT_MAP_FILE_ID
"B"), file_name_, line_number_)
108 template <
typename TKey,
typename TMapped,
typename TKeyCompare = etl::less<TKey> >
113 typedef ETL_OR_STD::pair<const TKey, TMapped> value_type;
121 typedef TKey key_type;
122 typedef TMapped mapped_type;
123 typedef TKeyCompare key_compare;
124 typedef value_type& reference;
125 typedef const value_type& const_reference;
126 typedef value_type* pointer;
127 typedef const value_type* const_pointer;
128 typedef size_t size_type;
144 iterator(
typename lookup_t::iterator ilookup_)
150 : ilookup(other.ilookup)
156 ilookup = other.ilookup;
186 reference operator *()
const
196 pointer operator ->()
const
203 return lhs.ilookup == rhs.ilookup;
208 return !(lhs == rhs);
213 typename lookup_t::iterator ilookup;
233 : ilookup(other.ilookup)
238 : ilookup(other.ilookup)
244 ilookup = other.ilookup;
250 ilookup = other.ilookup;
280 const_reference operator *()
const
290 const_pointer operator ->()
const
297 return lhs.ilookup == rhs.ilookup;
302 return !(lhs == rhs);
307 typename lookup_t::const_iterator ilookup;
310 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
311 typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
312 typedef typename etl::iterator_traits<iterator>::difference_type difference_type;
316 typedef const TKey& key_parameter_t;
327 bool operator ()(
const value_type& element,
const key_type& key)
const
329 return comp(element.first, key);
332 bool operator ()(
const key_type& key,
const value_type& element)
const
334 return comp(key, element.first);
338 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
339 bool operator ()(
const value_type& element,
const K& key)
const
341 return comp(element.first, key);
344 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
345 bool operator ()(
const K& key,
const value_type& element)
const
347 return comp(key, element.first);
416 return reverse_iterator(lookup.
rbegin());
425 return reverse_iterator(lookup.
rbegin());
434 return reverse_iterator(lookup.
rend());
441 const_reverse_iterator
rend()
const
443 return const_reverse_iterator(lookup.
rend());
452 return const_reverse_iterator(lookup.
crbegin());
459 const_reverse_iterator
crend()
const
461 return const_reverse_iterator(lookup.
crend());
470 mapped_type&
at(key_parameter_t key)
476 return i_element->second;
481 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
482 mapped_type&
at(
const K& key)
488 return i_element->second;
498 const mapped_type&
at(key_parameter_t key)
const
504 return i_element->second;
509 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
510 const mapped_type&
at(
const K& key)
const
516 return i_element->second;
527 template <
typename TIterator>
528 void assign(TIterator first, TIterator last)
530 ETL_STATIC_ASSERT((
etl::is_same<value_type,
typename etl::iterator_traits<TIterator>::value_type>::value),
"Incompatible data for assign");
532#if ETL_IS_DEBUG_BUILD
533 difference_type d = etl::distance(first, last);
539 while (first != last)
551 ETL_OR_STD::pair<iterator, bool>
insert(reference value)
566 return insert(value).first;
576 template <
class TIterator>
577 void insert(TIterator first, TIterator last)
579 while (first != last)
595 if (i_element ==
end())
601 lookup.
erase(i_element.ilookup);
608 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
609 size_t erase(K&& key)
613 if (i_element ==
end())
619 lookup.
erase(i_element.ilookup);
631 return lookup.
erase(i_element.ilookup);
640 return lookup.
erase(i_element.ilookup);
652 return lookup.
erase(first.ilookup, last.ilookup);
689 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
736 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
737 const_iterator
find(
const K& key)
const
762 size_t count(key_parameter_t key)
const
764 return (
find(key) ==
end()) ? 0U : 1U;
769 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
770 size_t count(
const K& key)
const
772 return (
find(key) ==
end()) ? 0U : 1U;
788 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
807 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
826 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
845 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
857 ETL_OR_STD::pair<iterator, iterator>
equal_range(key_parameter_t key)
866 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
867 ETL_OR_STD::pair<iterator, iterator>
equal_range(
const K& key)
880 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(key_parameter_t key)
const
889 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
890 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(
const K& key)
const
908 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
921 return lookup.
size();
930 return lookup.
empty();
939 return lookup.
full();
986 ETL_OR_STD::pair<iterator, bool> result(
end(),
false);
988 if (i_element ==
end())
994 result.first = --
end();
995 result.second =
true;
1000 result.first = i_element;
1007 lookup.
insert(i_element.ilookup, &value);
1008 result.second =
true;
1020 return !key_compare()(key1, key2) && !key_compare()(key2, key1);
1025 template <typename K1, typename K2, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
1028 return !key_compare()(key1, key2) && !key_compare()(key2, key1);
1045#if defined(ETL_POLYMORPHIC_REFERENCE_FLAT_MAP) || defined(ETL_POLYMORPHIC_CONTAINERS)
1065 template <
typename TKey,
typename TMapped,
typename TKeyCompare>
1078 template <
typename TKey,
typename TMapped,
typename TKeyCompare>
1081 return !(lhs == rhs);
1092 template <
typename TKey,
typename TValue, const
size_t MAX_SIZE_,
typename TCompare = etl::less<TKey> >
1097 static ETL_CONSTANT
size_t MAX_SIZE = MAX_SIZE_;
1113 template <
typename TIterator>
1145 typedef typename ireference_flat_map<TKey, TValue, TCompare>::value_type node_t;
1151 template <
typename TKey,
typename TValue, const
size_t MAX_SIZE_,
typename TCompare>
1152 ETL_CONSTANT
size_t reference_flat_map< TKey, TValue, MAX_SIZE_, TCompare>::MAX_SIZE;
1157#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
1158 template <
typename... TPairs>
1159 reference_flat_map(TPairs...) -> reference_flat_map<
typename etl::nth_type_t<0, TPairs...>::first_type,
1160 typename etl::nth_type_t<0, TPairs...>::second_type,
1167#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
1168 template <
typename TKey,
typename TMapped,
typename TKeyCompare = etl::less<TKey>,
typename... TPairs>
1169 constexpr auto make_reference_flat_map(TPairs&&... pairs) ->
etl::reference_flat_map<TKey, TMapped,
sizeof...(TPairs), TKeyCompare>
1171 return { {etl::forward<TPairs>(pairs)...} };
Definition: reference_flat_map.h:218
Definition: reference_flat_map.h:134
#define ETL_ASSERT(b, e)
Definition: error_handler.h:316
ETL_CONSTEXPR exception(string_type reason_, string_type, numeric_type line_)
Constructor.
Definition: exception.h:69
Definition: exception.h:47
ETL_CONSTEXPR17 T * addressof(T &t)
Definition: addressof.h:51
mapped_type & at(key_parameter_t key)
Definition: reference_flat_map.h:470
iterator begin()
Definition: reference_flat_map.h:360
void clear()
Clears the reference_flat_map.
Definition: reference_flat_map.h:658
ETL_OR_STD::pair< iterator, bool > insert_at(iterator i_element, value_type &value)
Definition: reference_flat_map.h:984
const_reverse_iterator rbegin() const
Definition: reference_flat_map.h:423
~ireference_flat_map()
Destructor.
Definition: reference_flat_map.h:1052
const_iterator lower_bound(key_parameter_t key) const
Definition: reference_flat_map.h:800
const_reverse_iterator crbegin() const
Definition: reference_flat_map.h:450
reverse_iterator rend()
Definition: reference_flat_map.h:432
reference_flat_map()
Constructor.
Definition: reference_flat_map.h:1102
size_t count(key_parameter_t key) const
Definition: reference_flat_map.h:762
iterator end()
Definition: reference_flat_map.h:378
bool contains(const TKey &key) const
Check if the map contains the key.
Definition: reference_flat_map.h:901
const_iterator cbegin() const
Definition: reference_flat_map.h:396
ETL_OR_STD::pair< iterator, iterator > equal_range(key_parameter_t key)
Definition: reference_flat_map.h:857
size_t available() const
Definition: reference_flat_map.h:964
ireference_flat_map(lookup_t &lookup_)
Constructor.
Definition: reference_flat_map.h:974
const_reverse_iterator crend() const
Definition: reference_flat_map.h:459
ETL_OR_STD::pair< const_iterator, const_iterator > equal_range(key_parameter_t key) const
Definition: reference_flat_map.h:880
reference_flat_map & operator=(const reference_flat_map &rhs)
Assignment operator.
Definition: reference_flat_map.h:1131
reference_flat_map(TIterator first, TIterator last)
Definition: reference_flat_map.h:1114
size_type max_size() const
Definition: reference_flat_map.h:955
~reference_flat_map()
Destructor.
Definition: reference_flat_map.h:1123
iterator insert(const_iterator, reference value)
Definition: reference_flat_map.h:564
bool empty() const
Definition: reference_flat_map.h:928
const_iterator upper_bound(key_parameter_t key) const
Definition: reference_flat_map.h:838
const_iterator begin() const
Definition: reference_flat_map.h:369
iterator lower_bound(key_parameter_t key)
Definition: reference_flat_map.h:781
reverse_iterator rbegin()
Definition: reference_flat_map.h:414
iterator upper_bound(key_parameter_t key)
Definition: reference_flat_map.h:819
ETL_OR_STD::pair< iterator, bool > insert(reference value)
Definition: reference_flat_map.h:551
const_reverse_iterator rend() const
Definition: reference_flat_map.h:441
size_type size() const
Definition: reference_flat_map.h:919
iterator find(key_parameter_t key)
Definition: reference_flat_map.h:668
const_iterator cend() const
Definition: reference_flat_map.h:405
const_iterator find(key_parameter_t key) const
Definition: reference_flat_map.h:715
iterator erase(const_iterator first, const_iterator last)
Definition: reference_flat_map.h:650
bool keys_are_equal(key_parameter_t key1, key_parameter_t key2) const
Check to see if the keys are equal.
Definition: reference_flat_map.h:1018
size_t erase(key_parameter_t key)
Definition: reference_flat_map.h:591
iterator erase(iterator i_element)
Definition: reference_flat_map.h:629
bool full() const
Definition: reference_flat_map.h:937
iterator erase(const_iterator i_element)
Definition: reference_flat_map.h:638
void assign(TIterator first, TIterator last)
Definition: reference_flat_map.h:528
size_type capacity() const
Definition: reference_flat_map.h:946
const mapped_type & at(key_parameter_t key) const
Definition: reference_flat_map.h:498
const_iterator end() const
Definition: reference_flat_map.h:387
void insert(TIterator first, TIterator last)
Definition: reference_flat_map.h:577
Definition: reference_flat_map.h:66
Definition: reference_flat_map.h:80
Definition: reference_flat_map.h:94
Definition: reference_flat_map.h:110
Definition: reference_flat_map.h:1094
bool operator==(const etl::ireference_flat_map< TKey, TMapped, TKeyCompare > &lhs, const etl::ireference_flat_map< TKey, TMapped, TKeyCompare > &rhs)
Definition: reference_flat_map.h:1066
bool operator!=(const etl::ireference_flat_map< TKey, TMapped, TKeyCompare > &lhs, const etl::ireference_flat_map< TKey, TMapped, TKeyCompare > &rhs)
Definition: reference_flat_map.h:1079
is_same
Definition: type_traits_generator.h:1041
iterator begin()
Definition: vector.h:100
size_type max_size() const
Definition: vector_base.h:140
void push_back(const_reference value)
Definition: vector.h:432
const_reverse_iterator crbegin() const
Definition: vector.h:190
reverse_iterator rend()
Definition: vector.h:172
size_type capacity() const
Definition: vector_base.h:131
const_iterator cend() const
Definition: vector.h:145
void clear()
Clears the vector.
Definition: vector.h:414
iterator end()
Definition: vector.h:118
const_reverse_iterator crend() const
Definition: vector.h:199
const_iterator cbegin() const
Definition: vector.h:136
bool full() const
Definition: vector.h:977
size_type size() const
Definition: vector.h:959
iterator erase(iterator i_element)
Definition: vector.h:865
bool empty() const
Definition: vector.h:968
size_t available() const
Definition: vector.h:986
reverse_iterator rbegin()
Definition: vector.h:154
iterator insert(const_iterator position, const_reference value)
Definition: vector.h:560
bitset_ext
Definition: absolute.h:38
pair< T1, T2 > make_pair(T1 a, T2 b)
A convenience wrapper for creating a pair from two objects.
Definition: utility.h:322
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:645
bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:633
iterator
Definition: iterator.h:399