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 iterator
insert(const_iterator , reference value)
575 return insert(value).first;
586 template <
class TIterator>
587 void insert(TIterator first, TIterator last)
589 while (first != last)
603 iterator i_element =
find(key);
605 if (i_element ==
end())
611 lookup.erase(i_element.ilookup);
618 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
619 size_t erase(K&& key)
623 if (i_element ==
end())
629 lookup.
erase(i_element.ilookup);
641 return lookup.erase(i_element.ilookup);
648 iterator
erase(const_iterator i_element)
650 return lookup.erase(i_element.ilookup);
660 iterator
erase(const_iterator first, const_iterator last)
662 return lookup.erase(first.ilookup, last.ilookup);
678 iterator
find(key_parameter_t key)
699 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
725 const_iterator
find(key_parameter_t key)
const
746 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
772 size_t count(key_parameter_t key)
const
774 return (
find(key) ==
end()) ? 0U : 1U;
779 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
780 size_t count(
const K& key)
const
782 return (
find(key) ==
end()) ? 0U : 1U;
793 return etl::lower_bound(
begin(),
end(), key, compare);
798 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
812 return etl::lower_bound(
cbegin(),
cend(), key, compare);
817 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
831 return etl::upper_bound(
begin(),
end(), key, compare);
836 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
850 return etl::upper_bound(
begin(),
end(), key, compare);
855 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(key_parameter_t key)
869 iterator i_lower = etl::lower_bound(
begin(),
end(), key, compare);
871 return ETL_OR_STD::make_pair(i_lower, etl::upper_bound(i_lower,
end(), key, compare));
876 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
877 ETL_OR_STD::pair<iterator, iterator>
equal_range(
const K& key)
881 return ETL_OR_STD::make_pair(i_lower, etl::upper_bound(i_lower,
end(), key,
compare));
890 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(key_parameter_t key)
const
892 const_iterator i_lower = etl::lower_bound(
cbegin(),
cend(), key, compare);
894 return ETL_OR_STD::make_pair(i_lower, etl::upper_bound(i_lower,
cend(), key, compare));
899 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
900 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(
const K& key)
const
904 return ETL_OR_STD::make_pair(i_lower, etl::upper_bound(i_lower,
cend(), key,
compare));
918 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
931 return lookup.size();
940 return lookup.empty();
949 return lookup.full();
958 return lookup.capacity();
967 return lookup.max_size();
976 return lookup.available();
994 ETL_OR_STD::pair<iterator, bool>
insert_at(iterator i_element, value_type& value)
996 ETL_OR_STD::pair<iterator, bool> result(
end(),
false);
998 if (i_element ==
end())
1003 lookup.push_back(&value);
1004 result.first = --
end();
1005 result.second =
true;
1010 result.first = i_element;
1017 lookup.insert(i_element.ilookup, &value);
1018 result.second =
true;
1030 return !key_compare()(key1, key2) && !key_compare()(key2, key1);
1035 template <typename K1, typename K2, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
1038 return !key_compare()(key1, key2) && !key_compare()(key2, key1);
1055#if defined(ETL_POLYMORPHIC_REFERENCE_FLAT_MAP) || defined(ETL_POLYMORPHIC_CONTAINERS)
1075 template <
typename TKey,
typename TMapped,
typename TKeyCompare>
1088 template <
typename TKey,
typename TMapped,
typename TKeyCompare>
1091 return !(lhs == rhs);
1102 template <
typename TKey,
typename TValue, const
size_t MAX_SIZE_,
typename TCompare = etl::less<TKey> >
1107 static ETL_CONSTANT
size_t MAX_SIZE = MAX_SIZE_;
1123 template <
typename TIterator>
1155 typedef typename ireference_flat_map<TKey, TValue, TCompare>::value_type node_t;
1161 template <
typename TKey,
typename TValue, const
size_t MAX_SIZE_,
typename TCompare>
1162 ETL_CONSTANT
size_t reference_flat_map< TKey, TValue, MAX_SIZE_, TCompare>::MAX_SIZE;
1167#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
1168 template <
typename... TPairs>
1169 reference_flat_map(TPairs...)
1170 -> reference_flat_map<
typename etl::nth_type_t<0, TPairs...>::first_type,
typename etl::nth_type_t<0, TPairs...>::second_type,
sizeof...(TPairs)>;
1176#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
1177 template <
typename TKey,
typename TMapped,
typename TKeyCompare = etl::less<TKey>,
typename... TPairs>
1178 constexpr auto make_reference_flat_map(TPairs&&... pairs) ->
etl::reference_flat_map<TKey, TMapped,
sizeof...(TPairs), TKeyCompare>
1180 return {etl::forward<TPairs>(pairs)...};
Definition reference_flat_map.h:216
Definition reference_flat_map.h:134
ETL_CONSTEXPR14 bool operator!=(const etl::bitset< Active_Bits, TElement > &lhs, const etl::bitset< Active_Bits, TElement > &rhs) ETL_NOEXCEPT
Definition bitset_new.h:2529
#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:668
ETL_OR_STD::pair< iterator, bool > insert_at(iterator i_element, value_type &value)
Definition reference_flat_map.h:994
const_reverse_iterator rbegin() const
Definition reference_flat_map.h:422
~ireference_flat_map()
Destructor.
Definition reference_flat_map.h:1064
const_iterator lower_bound(key_parameter_t key) const
Definition reference_flat_map.h:810
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:1112
size_t count(key_parameter_t key) const
Definition reference_flat_map.h:772
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:911
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
ireference_flat_map(lookup_t &lookup_)
Constructor.
Definition reference_flat_map.h:984
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:890
reference_flat_map & operator=(const reference_flat_map &rhs)
Assignment operator.
Definition reference_flat_map.h:1141
reference_flat_map(TIterator first, TIterator last)
Definition reference_flat_map.h:1124
size_type max_size() const
Definition reference_flat_map.h:965
~reference_flat_map()
Destructor.
Definition reference_flat_map.h:1133
iterator insert(const_iterator, reference value)
Definition reference_flat_map.h:573
bool empty() const
Definition reference_flat_map.h:938
const_iterator upper_bound(key_parameter_t key) const
Definition reference_flat_map.h:848
const_iterator begin() const
Definition reference_flat_map.h:365
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
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:929
iterator find(key_parameter_t key)
Definition reference_flat_map.h:678
const_iterator cend() const
Definition reference_flat_map.h:401
const_iterator find(key_parameter_t key) const
Definition reference_flat_map.h:725
iterator erase(const_iterator first, const_iterator last)
Definition reference_flat_map.h:660
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:1028
size_t erase(key_parameter_t key)
Definition reference_flat_map.h:601
iterator erase(iterator i_element)
Definition reference_flat_map.h:639
bool full() const
Definition reference_flat_map.h:947
iterator erase(const_iterator i_element)
Definition reference_flat_map.h:648
void assign(TIterator first, TIterator last)
Definition reference_flat_map.h:535
size_type capacity() const
Definition reference_flat_map.h:956
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:587
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:1104
iterator erase(iterator i_element)
Definition vector.h:911
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
iterator
Definition iterator.h:424