31#ifndef ETL_REFERENCE_FLAT_MAP_INCLUDED
32#define ETL_REFERENCE_FLAT_MAP_INCLUDED
42#include "static_assert.h"
68 flat_map_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
69 :
exception(reason_, file_name_, line_number_)
82 flat_map_full(string_type file_name_, numeric_type line_number_)
83 : flat_map_exception(ETL_ERROR_TEXT(
"flat_map: full", ETL_REFERENCE_FLAT_MAP_FILE_ID
"A"), file_name_, line_number_)
96 flat_map_out_of_bounds(string_type file_name_, numeric_type line_number_)
97 : 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;
133 class iterator :
public etl::iterator<ETL_OR_STD::bidirectional_iterator_tag, value_type>
137 friend class ireference_flat_map;
142 iterator(
typename lookup_t::iterator ilookup_)
147 iterator(
const iterator& other)
148 : ilookup(other.ilookup)
152 iterator& operator=(
const iterator& other)
154 ilookup = other.ilookup;
158 iterator& operator++()
164 iterator operator++(
int)
166 iterator temp(*
this);
171 iterator& operator--()
177 iterator operator--(
int)
179 iterator temp(*
this);
184 reference operator*()
const
189 pointer operator&()
const
194 pointer operator->()
const
199 friend bool operator==(
const iterator& lhs,
const iterator& rhs)
201 return lhs.ilookup == rhs.ilookup;
204 friend bool operator!=(
const iterator& lhs,
const iterator& rhs)
206 return !(lhs == rhs);
211 typename lookup_t::iterator ilookup;
215 class const_iterator :
public etl::iterator<ETL_OR_STD::bidirectional_iterator_tag, const value_type>
219 friend class ireference_flat_map;
223 const_iterator(
typename lookup_t::const_iterator ilookup_)
229 : ilookup(other.ilookup)
233 const_iterator(
const const_iterator& other)
234 : ilookup(other.ilookup)
240 ilookup = other.ilookup;
244 const_iterator& operator=(
const const_iterator& other)
246 ilookup = other.ilookup;
250 const_iterator& operator++()
256 const_iterator operator++(
int)
258 const_iterator temp(*
this);
263 const_iterator& operator--()
269 const_iterator operator--(
int)
271 const_iterator temp(*
this);
276 const_reference operator*()
const
281 const_pointer operator&()
const
286 const_pointer operator->()
const
291 friend bool operator==(
const const_iterator& lhs,
const const_iterator& rhs)
293 return lhs.ilookup == rhs.ilookup;
296 friend bool operator!=(
const const_iterator& lhs,
const const_iterator& rhs)
298 return !(lhs == rhs);
303 typename lookup_t::const_iterator ilookup;
306 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
307 typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
308 typedef typename etl::iterator_traits<iterator>::difference_type difference_type;
312 typedef const TKey& key_parameter_t;
323 bool operator()(
const value_type& element,
const key_type& key)
const
325 return comp(element.first, key);
328 bool operator()(
const key_type& key,
const value_type& element)
const
330 return comp(key, element.first);
334 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
335 bool operator()(
const value_type& element,
const K& key)
const
337 return comp(element.first, key);
340 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
341 bool operator()(
const K& key,
const value_type& element)
const
343 return comp(key, element.first);
358 return iterator(lookup.begin());
367 return const_iterator(lookup.begin());
376 return iterator(lookup.end());
383 const_iterator
end()
const
385 return const_iterator(lookup.end());
394 return const_iterator(lookup.cbegin());
403 return const_iterator(lookup.cend());
413 return reverse_iterator(lookup.rbegin());
424 return reverse_iterator(lookup.rbegin());
433 return reverse_iterator(lookup.rend());
441 const_reverse_iterator
rend()
const
443 return const_reverse_iterator(lookup.rend());
454 return const_reverse_iterator(lookup.crbegin());
462 const_reverse_iterator
crend()
const
464 return const_reverse_iterator(lookup.crend());
474 mapped_type&
at(key_parameter_t key)
480 return i_element->second;
485 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
486 mapped_type&
at(
const K& key)
492 return i_element->second;
503 const mapped_type&
at(key_parameter_t key)
const
509 return i_element->second;
514 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
515 const mapped_type&
at(
const K& key)
const
521 return i_element->second;
534 template <
typename TIterator>
535 void assign(TIterator first, TIterator last)
537 ETL_STATIC_ASSERT((etl::is_same<value_type,
typename etl::iterator_traits< TIterator>::value_type>::value),
"Incompatible data for assign");
539#if ETL_IS_DEBUG_BUILD
540 difference_type d = etl::distance(first, last);
546 while (first != last)
559 ETL_OR_STD::pair<iterator, bool>
insert(reference value)
573 ETL_OR_STD::pair<iterator, bool>
emplace(reference value)
585 iterator
insert(const_iterator , reference value)
587 return insert(value).first;
598 template <
class TIterator>
599 void insert(TIterator first, TIterator last)
601 while (first != last)
615 iterator i_element =
find(key);
617 if (i_element ==
end())
623 lookup.erase(i_element.ilookup);
630 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
631 size_t erase(K&& key)
635 if (i_element ==
end())
641 lookup.erase(i_element.ilookup);
653 return lookup.erase(i_element.ilookup);
660 iterator
erase(const_iterator i_element)
662 return lookup.erase(i_element.ilookup);
672 iterator
erase(const_iterator first, const_iterator last)
674 return lookup.erase(first.ilookup, last.ilookup);
690 iterator
find(key_parameter_t key)
711 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
737 const_iterator
find(key_parameter_t key)
const
758 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
784 size_t count(key_parameter_t key)
const
786 return (
find(key) ==
end()) ? 0U : 1U;
791 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
792 size_t count(
const K& key)
const
794 return (
find(key) ==
end()) ? 0U : 1U;
805 return etl::lower_bound(
begin(),
end(), key, compare);
810 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
824 return etl::lower_bound(
cbegin(),
cend(), key, compare);
829 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
843 return etl::upper_bound(
begin(),
end(), key, compare);
848 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
862 return etl::upper_bound(
begin(),
end(), key, compare);
867 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
879 ETL_OR_STD::pair<iterator, iterator>
equal_range(key_parameter_t key)
881 iterator i_lower = etl::lower_bound(
begin(),
end(), key, compare);
883 return ETL_OR_STD::make_pair(i_lower, etl::upper_bound(i_lower,
end(), key, compare));
888 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
889 ETL_OR_STD::pair<iterator, iterator>
equal_range(
const K& key)
893 return ETL_OR_STD::make_pair(i_lower, etl::upper_bound(i_lower,
end(), key,
compare));
902 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(key_parameter_t key)
const
904 const_iterator i_lower = etl::lower_bound(
cbegin(),
cend(), key, compare);
906 return ETL_OR_STD::make_pair(i_lower, etl::upper_bound(i_lower,
cend(), key, compare));
911 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
912 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(
const K& key)
const
916 return ETL_OR_STD::make_pair(i_lower, etl::upper_bound(i_lower,
cend(), key,
compare));
930 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
943 return lookup.size();
952 return lookup.empty();
961 return lookup.full();
970 return lookup.capacity();
979 return lookup.max_size();
988 return lookup.available();
1006 ETL_OR_STD::pair<iterator, bool>
insert_at(iterator i_element, value_type& value)
1008 ETL_OR_STD::pair<iterator, bool> result(
end(),
false);
1010 if (i_element ==
end())
1015 lookup.push_back(&value);
1016 result.first = --
end();
1017 result.second =
true;
1022 result.first = i_element;
1029 lookup.insert(i_element.ilookup, &value);
1030 result.second =
true;
1042 return !key_compare()(key1, key2) && !key_compare()(key2, key1);
1047 template <typename K1, typename K2, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
1050 return !key_compare()(key1, key2) && !key_compare()(key2, key1);
1067#if defined(ETL_POLYMORPHIC_REFERENCE_FLAT_MAP) || defined(ETL_POLYMORPHIC_CONTAINERS)
1087 template <
typename TKey,
typename TMapped,
typename TKeyCompare>
1100 template <
typename TKey,
typename TMapped,
typename TKeyCompare>
1103 return !(lhs == rhs);
1114 template <
typename TKey,
typename TValue, const
size_t MAX_SIZE_,
typename TCompare = etl::less<TKey> >
1119 static ETL_CONSTANT
size_t MAX_SIZE = MAX_SIZE_;
1135 template <
typename TIterator>
1167 typedef typename ireference_flat_map<TKey, TValue, TCompare>::value_type node_t;
1173 template <
typename TKey,
typename TValue, const
size_t MAX_SIZE_,
typename TCompare>
1174 ETL_CONSTANT
size_t reference_flat_map< TKey, TValue, MAX_SIZE_, TCompare>::MAX_SIZE;
1179#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
1180 template <
typename... TPairs>
1181 reference_flat_map(TPairs...)
1182 -> reference_flat_map<
typename etl::nth_type_t<0, TPairs...>::first_type,
typename etl::nth_type_t<0, TPairs...>::second_type,
sizeof...(TPairs)>;
1188#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
1189 template <
typename TKey,
typename TMapped,
typename TKeyCompare = etl::less<TKey>,
typename... TPairs>
1190 constexpr auto make_reference_flat_map(TPairs&&... pairs) ->
etl::reference_flat_map<TKey, TMapped,
sizeof...(TPairs), TKeyCompare>
1192 return {etl::forward<TPairs>(pairs)...};
Definition reference_flat_map.h:216
Definition reference_flat_map.h:134
#define ETL_ASSERT(b, e)
Definition error_handler.h:511
ETL_EXCEPTION_CONSTEXPR exception(string_type reason_, string_type, numeric_type)
Constructor.
Definition exception.h:81
Definition exception.h:59
ETL_CONSTEXPR17 etl::enable_if<!etl::is_same< T, etl::nullptr_t >::value, T >::type * addressof(T &t)
Definition addressof.h:52
mapped_type & at(key_parameter_t key)
Definition reference_flat_map.h:474
iterator begin()
Definition reference_flat_map.h:356
void clear()
Clears the reference_flat_map.
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 rbegin() const
Definition reference_flat_map.h:422
~ireference_flat_map()
Destructor.
Definition reference_flat_map.h:1076
const_iterator lower_bound(key_parameter_t key) const
Definition reference_flat_map.h:822
const_reverse_iterator crbegin() const
Definition reference_flat_map.h:452
reverse_iterator rend()
Definition reference_flat_map.h:431
reference_flat_map()
Constructor.
Definition reference_flat_map.h:1124
size_t count(key_parameter_t key) const
Definition reference_flat_map.h:784
iterator end()
Definition reference_flat_map.h:374
bool contains(const TKey &key) const
Check if the map contains the key.
Definition reference_flat_map.h:923
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
ireference_flat_map(lookup_t &lookup_)
Constructor.
Definition reference_flat_map.h:996
ETL_OR_STD::pair< iterator, bool > emplace(reference value)
Definition reference_flat_map.h:573
const_reverse_iterator crend() const
Definition reference_flat_map.h:462
ETL_OR_STD::pair< const_iterator, const_iterator > equal_range(key_parameter_t key) const
Definition reference_flat_map.h:902
reference_flat_map & operator=(const reference_flat_map &rhs)
Assignment operator.
Definition reference_flat_map.h:1153
reference_flat_map(TIterator first, TIterator last)
Definition reference_flat_map.h:1136
size_type max_size() const
Definition reference_flat_map.h:977
~reference_flat_map()
Destructor.
Definition reference_flat_map.h:1145
iterator insert(const_iterator, reference value)
Definition reference_flat_map.h:585
bool empty() const
Definition reference_flat_map.h:950
const_iterator upper_bound(key_parameter_t key) const
Definition reference_flat_map.h:860
const_iterator begin() const
Definition reference_flat_map.h:365
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
ETL_OR_STD::pair< iterator, bool > insert(reference value)
Definition reference_flat_map.h:559
const_reverse_iterator rend() const
Definition reference_flat_map.h:441
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
const_iterator find(key_parameter_t key) const
Definition reference_flat_map.h:737
iterator erase(const_iterator first, const_iterator last)
Definition reference_flat_map.h:672
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:1040
size_t erase(key_parameter_t key)
Definition reference_flat_map.h:613
iterator erase(iterator i_element)
Definition reference_flat_map.h:651
bool full() const
Definition reference_flat_map.h:959
iterator erase(const_iterator i_element)
Definition reference_flat_map.h:660
void assign(TIterator first, TIterator last)
Definition reference_flat_map.h:535
size_type capacity() const
Definition reference_flat_map.h:968
const mapped_type & at(key_parameter_t key) const
Definition reference_flat_map.h:503
const_iterator end() const
Definition reference_flat_map.h:383
void insert(TIterator first, TIterator last)
Definition reference_flat_map.h:599
Definition reference_flat_map.h:65
Definition reference_flat_map.h:79
Definition reference_flat_map.h:93
Definition reference_flat_map.h:110
Definition reference_flat_map.h:1116
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
iterator
Definition iterator.h:482
ETL_CONSTEXPR14 bool operator==(const etl::to_arithmetic_result< T > &lhs, const etl::to_arithmetic_result< T > &rhs)
Equality test for etl::to_arithmetic_result.
Definition to_arithmetic.h:903
ETL_CONSTEXPR14 bool operator!=(const etl::to_arithmetic_result< T > &lhs, const etl::to_arithmetic_result< T > &rhs)
Inequality test for etl::to_arithmetic_result.
Definition to_arithmetic.h:937