31#ifndef ETL_REFERENCE_FLAT_MULTIMAP_INCLUDED
32#define ETL_REFERENCE_FLAT_MULTIMAP_INCLUDED
58 flat_multimap_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
59 :
exception(reason_, file_name_, line_number_)
68 class flat_multimap_full :
public flat_multimap_exception
72 flat_multimap_full(string_type file_name_, numeric_type line_number_)
73 : flat_multimap_exception(ETL_ERROR_TEXT(
"flat_multimap:full", ETL_REFERENCE_FLAT_MULTIMAP_FILE_ID
"A"), file_name_, line_number_)
83 template <
typename TKey,
typename TMapped,
typename TKeyCompare = etl::less<TKey> >
88 typedef ETL_OR_STD::pair<const TKey, TMapped> value_type;
96 typedef TKey key_type;
97 typedef TMapped mapped_type;
98 typedef TKeyCompare key_compare;
99 typedef value_type& reference;
100 typedef const value_type& const_reference;
101 typedef value_type* pointer;
102 typedef const value_type* const_pointer;
103 typedef size_t size_type;
106 class iterator :
public etl::iterator<ETL_OR_STD::bidirectional_iterator_tag, value_type>
110 friend class ireference_flat_multimap;
111 friend class const_iterator;
117 iterator(
typename lookup_t::iterator ilookup_)
122 iterator(
const iterator& other)
123 : ilookup(other.ilookup)
127 iterator& operator =(
const iterator& other)
129 ilookup = other.ilookup;
133 iterator& operator ++()
139 iterator operator ++(
int)
141 iterator temp(*
this);
146 iterator& operator --()
152 iterator operator --(
int)
154 iterator temp(*
this);
159 reference operator *()
const
164 pointer operator &()
const
169 pointer operator ->()
const
174 friend bool operator == (
const iterator& lhs,
const iterator& rhs)
176 return lhs.ilookup == rhs.ilookup;
179 friend bool operator != (
const iterator& lhs,
const iterator& rhs)
181 return !(lhs == rhs);
186 typename lookup_t::iterator ilookup;
190 class const_iterator :
public etl::iterator<ETL_OR_STD::bidirectional_iterator_tag, const value_type>
194 friend class ireference_flat_multimap;
200 const_iterator(
typename lookup_t::const_iterator ilookup_)
206 : ilookup(other.ilookup)
210 const_iterator(
const const_iterator& other)
211 : ilookup(other.ilookup)
215 const_iterator& operator =(
const iterator& other)
217 ilookup = other.ilookup;
221 const_iterator& operator =(
const const_iterator& other)
223 ilookup = other.ilookup;
227 const_iterator& operator ++()
233 const_iterator operator ++(
int)
235 const_iterator temp(*
this);
240 const_iterator& operator --()
246 const_iterator operator --(
int)
248 const_iterator temp(*
this);
253 const_reference operator *()
const
258 const_pointer operator &()
const
263 const_pointer operator ->()
const
268 friend bool operator == (
const const_iterator& lhs,
const const_iterator& rhs)
270 return lhs.ilookup == rhs.ilookup;
273 friend bool operator != (
const const_iterator& lhs,
const const_iterator& rhs)
275 return !(lhs == rhs);
280 typename lookup_t::const_iterator ilookup;
283 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
284 typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
285 typedef typename etl::iterator_traits<iterator>::difference_type difference_type;
289 typedef const TKey& key_parameter_t;
300 bool operator ()(
const value_type& element, key_type key)
const
302 return comp(element.first, key);
305 bool operator ()(key_type key,
const value_type& element)
const
307 return comp(key, element.first);
311 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
312 bool operator ()(
const value_type& element,
const K& key)
const
314 return comp(element.first, key);
317 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
318 bool operator ()(
const K& key,
const value_type& element)
const
320 return comp(key, element.first);
335 return iterator(lookup.begin());
344 return const_iterator(lookup.begin());
353 return iterator(lookup.end());
360 const_iterator
end()
const
362 return const_iterator(lookup.end());
371 return const_iterator(lookup.cbegin());
380 return const_iterator(lookup.cend());
389 return reverse_iterator(lookup.rbegin());
398 return const_reverse_iterator(lookup.rbegin());
407 return reverse_iterator(lookup.rend());
414 const_reverse_iterator
rend()
const
416 return const_reverse_iterator(lookup.rend());
425 return const_reverse_iterator(lookup.crbegin());
432 const_reverse_iterator
crend()
const
434 return const_reverse_iterator(lookup.crend());
444 template <
typename TIterator>
445 void assign(TIterator first, TIterator last)
447#if ETL_IS_DEBUG_BUILD
448 difference_type d = etl::distance(first, last);
454 while (first != last)
466 ETL_OR_STD::pair<iterator, bool>
insert(value_type& value)
470 ETL_OR_STD::pair<iterator, bool> result(
end(),
false);
483 iterator
insert(const_iterator ,
const value_type& value)
485 return insert(value).first;
495 template <
class TIterator>
496 void insert(TIterator first, TIterator last)
498 while (first != last)
512 ETL_OR_STD::pair<iterator, iterator> range =
equal_range(key);
514 if (range.first ==
end())
520 size_t d = etl::distance(range.first, range.second);
521 erase(range.first, range.second);
528 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
529 size_t erase(K&& key)
531 ETL_OR_STD::pair<iterator, iterator> range =
equal_range(key);
533 if (range.first ==
end())
539 size_t d = etl::distance(range.first, range.second);
540 erase(range.first, range.second);
552 return lookup.erase(i_element.ilookup);
559 iterator
erase(const_iterator i_element)
561 return lookup.erase(i_element.ilookup);
571 iterator
erase(const_iterator first, const_iterator last)
573 return lookup.erase(first.ilookup, last.ilookup);
589 iterator
find(key_parameter_t key)
595 if (!key_compare()(itr->first, key) && !key_compare()(key, itr->first))
610 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
617 if (!key_compare()(itr->first, key) && !key_compare()(key, itr->first))
636 const_iterator
find(key_parameter_t key)
const
642 if (!key_compare()(itr->first, key) && !key_compare()(key, itr->first))
657 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
664 if (!key_compare()(itr->first, key) && !key_compare()(key, itr->first))
683 size_t count(key_parameter_t key)
const
685 ETL_OR_STD::pair<const_iterator, const_iterator> range =
equal_range(key);
687 return etl::distance(range.first, range.second);
692 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
693 size_t count(
const K& key)
const
695 ETL_OR_STD::pair<const_iterator, const_iterator> range =
equal_range(key);
697 return etl::distance(range.first, range.second);
708 return etl::lower_bound(
begin(),
end(), key, compare);
713 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
727 return etl::lower_bound(
cbegin(),
cend(), key, compare);
732 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
746 return etl::upper_bound(
begin(),
end(), key, compare);
751 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
765 return etl::upper_bound(
begin(),
end(), key, compare);
770 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
782 ETL_OR_STD::pair<iterator, iterator>
equal_range(key_parameter_t key)
784 iterator i_lower = etl::lower_bound(
begin(),
end(), key, compare);
786 return ETL_OR_STD::make_pair(i_lower, etl::upper_bound(i_lower,
end(), key, compare));
791 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
792 ETL_OR_STD::pair<iterator, iterator>
equal_range(
const K& key)
796 return ETL_OR_STD::make_pair(i_lower, etl::upper_bound(i_lower,
end(), key,
compare));
805 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(key_parameter_t key)
const
807 const_iterator i_lower = etl::lower_bound(
cbegin(),
cend(), key, compare);
809 return ETL_OR_STD::make_pair(i_lower, etl::upper_bound(i_lower,
cend(), key, compare));
814 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
815 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(
const K& key)
const
819 return ETL_OR_STD::make_pair(i_lower, etl::upper_bound(i_lower,
cend(), key,
compare));
833 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
846 return lookup.size();
855 return lookup.empty();
864 return lookup.full();
873 return lookup.capacity();
882 return lookup.max_size();
891 return lookup.available();
909 ETL_OR_STD::pair<iterator, bool>
insert_at(iterator i_element, value_type& value)
911 ETL_OR_STD::pair<iterator, bool> result(
end(),
false);
913 if (i_element ==
end())
916 lookup.push_back(&value);
917 result.first = --
end();
918 result.second =
true;
923 lookup.insert(i_element.ilookup, &value);
924 result.first = i_element;
925 result.second =
true;
944#if defined(ETL_POLYMORPHIC_REFERENCE_FLAT_MULTIMAP) || defined(ETL_POLYMORPHIC_CONTAINERS)
964 template <
typename TKey,
typename TMapped,
typename TKeyCompare>
977 template <
typename TKey,
typename TMapped,
typename TKeyCompare>
980 return !(lhs == rhs);
991 template <
typename TKey,
typename TValue, const
size_t MAX_SIZE_,
typename TCompare = etl::less<TKey> >
996 static ETL_CONSTANT
size_t MAX_SIZE = MAX_SIZE_;
1021 template <
typename TIterator>
1038 typedef typename ireference_flat_multimap<TKey, TValue, TCompare>::value_type node_t;
1044 template <
typename TKey,
typename TValue, const
size_t MAX_SIZE_,
typename TCompare>
1045 ETL_CONSTANT
size_t reference_flat_multimap< TKey, TValue, MAX_SIZE_, TCompare>::MAX_SIZE;
1050#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
1051 template <
typename... TPairs>
1052 reference_flat_multimap(TPairs...) -> reference_flat_multimap<
typename etl::nth_type_t<0, TPairs...>::first_type,
1053 typename etl::nth_type_t<0, TPairs...>::second_type,
1060#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
1061 template <
typename TKey,
typename TMapped,
typename TKeyCompare = etl::less<TKey>,
typename... TPairs>
1062 constexpr auto make_reference_flat_multimap(TPairs&&... pairs) ->
etl::reference_flat_multimap<TKey, TMapped,
sizeof...(TPairs), TKeyCompare>
1064 return { etl::forward<TPairs>(pairs)... };
Definition reference_flat_multimap.h:69
Definition reference_flat_multimap.h:107
Definition reference_flat_multimap.h:85
const_reverse_iterator crbegin() const
Definition reference_flat_multimap.h:423
iterator erase(const_iterator i_element)
Definition reference_flat_multimap.h:559
size_t count(key_parameter_t key) const
Definition reference_flat_multimap.h:683
ETL_OR_STD::pair< iterator, iterator > equal_range(key_parameter_t key)
Definition reference_flat_multimap.h:782
iterator lower_bound(key_parameter_t key)
Definition reference_flat_multimap.h:706
const_iterator find(key_parameter_t key) const
Definition reference_flat_multimap.h:636
reverse_iterator rbegin()
Definition reference_flat_multimap.h:387
const_reverse_iterator crend() const
Definition reference_flat_multimap.h:432
iterator upper_bound(key_parameter_t key)
Definition reference_flat_multimap.h:744
bool empty() const
Definition reference_flat_multimap.h:853
const_reverse_iterator rbegin() const
Definition reference_flat_multimap.h:396
const_iterator cbegin() const
Definition reference_flat_multimap.h:369
size_type size() const
Definition reference_flat_multimap.h:844
ETL_OR_STD::pair< iterator, bool > insert_at(iterator i_element, value_type &value)
Definition reference_flat_multimap.h:909
size_t available() const
Definition reference_flat_multimap.h:889
iterator erase(const_iterator first, const_iterator last)
Definition reference_flat_multimap.h:571
iterator insert(const_iterator, const value_type &value)
Definition reference_flat_multimap.h:483
bool full() const
Definition reference_flat_multimap.h:862
size_t erase(key_parameter_t key)
Definition reference_flat_multimap.h:510
bool contains(const TKey &key) const
Check if the map contains the key.
Definition reference_flat_multimap.h:826
~ireference_flat_multimap()
Destructor.
Definition reference_flat_multimap.h:951
const_iterator end() const
Definition reference_flat_multimap.h:360
const_iterator upper_bound(key_parameter_t key) const
Definition reference_flat_multimap.h:763
const_reverse_iterator rend() const
Definition reference_flat_multimap.h:414
iterator begin()
Definition reference_flat_multimap.h:333
ETL_OR_STD::pair< iterator, bool > insert(value_type &value)
Definition reference_flat_multimap.h:466
iterator end()
Definition reference_flat_multimap.h:351
iterator find(key_parameter_t key)
Definition reference_flat_multimap.h:589
const_iterator cend() const
Definition reference_flat_multimap.h:378
size_type max_size() const
Definition reference_flat_multimap.h:880
void clear()
Clears the reference_flat_multimap.
Definition reference_flat_multimap.h:579
ETL_OR_STD::pair< const_iterator, const_iterator > equal_range(key_parameter_t key) const
Definition reference_flat_multimap.h:805
void insert(TIterator first, TIterator last)
Definition reference_flat_multimap.h:496
ireference_flat_multimap(lookup_t &lookup_)
Constructor.
Definition reference_flat_multimap.h:899
void assign(TIterator first, TIterator last)
Definition reference_flat_multimap.h:445
size_type capacity() const
Definition reference_flat_multimap.h:871
iterator erase(iterator i_element)
Definition reference_flat_multimap.h:550
reverse_iterator rend()
Definition reference_flat_multimap.h:405
const_iterator lower_bound(key_parameter_t key) const
Definition reference_flat_multimap.h:725
const_iterator begin() const
Definition reference_flat_multimap.h:342
Definition reference_flat_multimap.h:993
~reference_flat_multimap()
Destructor.
Definition reference_flat_multimap.h:1031
reference_flat_multimap()
Constructor.
Definition reference_flat_multimap.h:1001
reference_flat_multimap(const reference_flat_multimap &other)
Copy constructor.
Definition reference_flat_multimap.h:1009
reference_flat_multimap(TIterator first, TIterator last)
Definition reference_flat_multimap.h:1022
ETL_CONSTEXPR14 bool operator==(const etl::expected< TValue, TError > &lhs, const etl::expected< TValue2, TError2 > &rhs)
Equivalence operators.
Definition expected.h:962
#define ETL_ASSERT(b, e)
Definition error_handler.h:356
ETL_CONSTEXPR exception(string_type reason_, string_type, numeric_type line_)
Constructor.
Definition exception.h:69
ETL_CONSTEXPR17 etl::enable_if<!etl::is_same< T, etl::nullptr_t >::value, T >::type * addressof(T &t)
Definition addressof.h:52
bitset_ext
Definition absolute.h:39
bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1151
bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1139
ETL_CONSTEXPR TContainer::iterator end(TContainer &container)
Definition iterator.h:992
iterator
Definition iterator.h:399