31#ifndef ETL_REFERENCE_FLAT_MULTIMAP_INCLUDED
32#define ETL_REFERENCE_FLAT_MULTIMAP_INCLUDED
57 flat_multimap_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
58 :
exception(reason_, file_name_, line_number_)
67 class flat_multimap_full :
public flat_multimap_exception
71 flat_multimap_full(string_type file_name_, numeric_type line_number_)
72 : 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;
115 iterator(
typename lookup_t::iterator ilookup_)
120 iterator(
const iterator& other)
121 : ilookup(other.ilookup)
125 iterator& operator=(
const iterator& other)
127 ilookup = other.ilookup;
131 iterator& operator++()
137 iterator operator++(
int)
139 iterator temp(*
this);
144 iterator& operator--()
150 iterator operator--(
int)
152 iterator temp(*
this);
157 reference operator*()
const
162 pointer operator&()
const
167 pointer operator->()
const
172 friend bool operator==(
const iterator& lhs,
const iterator& rhs)
174 return lhs.ilookup == rhs.ilookup;
177 friend bool operator!=(
const iterator& lhs,
const iterator& rhs)
179 return !(lhs == rhs);
184 typename lookup_t::iterator ilookup;
188 class const_iterator :
public etl::iterator<ETL_OR_STD::bidirectional_iterator_tag, const value_type>
192 friend class ireference_flat_multimap;
196 const_iterator(
typename lookup_t::const_iterator ilookup_)
202 : ilookup(other.ilookup)
206 const_iterator(
const const_iterator& other)
207 : ilookup(other.ilookup)
211 const_iterator& operator=(
const iterator& other)
213 ilookup = other.ilookup;
217 const_iterator& operator=(
const const_iterator& other)
219 ilookup = other.ilookup;
223 const_iterator& operator++()
229 const_iterator operator++(
int)
231 const_iterator temp(*
this);
236 const_iterator& operator--()
242 const_iterator operator--(
int)
244 const_iterator temp(*
this);
249 const_reference operator*()
const
254 const_pointer operator&()
const
259 const_pointer operator->()
const
264 friend bool operator==(
const const_iterator& lhs,
const const_iterator& rhs)
266 return lhs.ilookup == rhs.ilookup;
269 friend bool operator!=(
const const_iterator& lhs,
const const_iterator& rhs)
271 return !(lhs == rhs);
276 typename lookup_t::const_iterator ilookup;
279 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
280 typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
281 typedef typename etl::iterator_traits<iterator>::difference_type difference_type;
285 typedef const TKey& key_parameter_t;
296 bool operator()(
const value_type& element, key_type key)
const
298 return comp(element.first, key);
301 bool operator()(key_type key,
const value_type& element)
const
303 return comp(key, element.first);
307 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
308 bool operator()(
const value_type& element,
const K& key)
const
310 return comp(element.first, key);
313 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
314 bool operator()(
const K& key,
const value_type& element)
const
316 return comp(key, element.first);
331 return iterator(lookup.begin());
341 return const_iterator(lookup.begin());
350 return iterator(lookup.end());
357 const_iterator
end()
const
359 return const_iterator(lookup.end());
369 return const_iterator(lookup.cbegin());
378 return const_iterator(lookup.cend());
388 return reverse_iterator(lookup.rbegin());
399 return const_reverse_iterator(lookup.rbegin());
409 return reverse_iterator(lookup.rend());
418 const_reverse_iterator
rend()
const
420 return const_reverse_iterator(lookup.rend());
431 return const_reverse_iterator(lookup.crbegin());
440 const_reverse_iterator
crend()
const
442 return const_reverse_iterator(lookup.crend());
454 template <
typename TIterator>
455 void assign(TIterator first, TIterator last)
457#if ETL_IS_DEBUG_BUILD
458 difference_type d = etl::distance(first, last);
464 while (first != last)
477 ETL_OR_STD::pair<iterator, bool>
insert(value_type& value)
481 ETL_OR_STD::pair<iterator, bool> result(
end(),
false);
495 ETL_OR_STD::pair<iterator, bool>
emplace(value_type& value)
507 iterator
insert(const_iterator ,
const value_type& value)
509 return insert(value).first;
520 template <
class TIterator>
521 void insert(TIterator first, TIterator last)
523 while (first != last)
537 ETL_OR_STD::pair<iterator, iterator> range =
equal_range(key);
539 if (range.first ==
end())
545 size_t d =
static_cast<size_t>(etl::distance(range.first, range.second));
546 erase(range.first, range.second);
553 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
554 size_t erase(K&& key)
556 ETL_OR_STD::pair<iterator, iterator> range =
equal_range(key);
558 if (range.first ==
end())
564 size_t d =
static_cast<size_t>(etl::distance(range.first, range.second));
565 erase(range.first, range.second);
577 return lookup.erase(i_element.ilookup);
584 iterator
erase(const_iterator i_element)
586 return lookup.erase(i_element.ilookup);
596 iterator
erase(const_iterator first, const_iterator last)
598 return lookup.erase(first.ilookup, last.ilookup);
614 iterator
find(key_parameter_t key)
620 if (!key_compare()(itr->first, key) && !key_compare()(key, itr->first))
635 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
642 if (!key_compare()(itr->first, key) && !key_compare()(key, itr->first))
661 const_iterator
find(key_parameter_t key)
const
667 if (!key_compare()(itr->first, key) && !key_compare()(key, itr->first))
682 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
689 if (!key_compare()(itr->first, key) && !key_compare()(key, itr->first))
708 size_t count(key_parameter_t key)
const
710 ETL_OR_STD::pair<const_iterator, const_iterator> range =
equal_range(key);
712 return static_cast<size_t>(etl::distance(range.first, range.second));
717 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
718 size_t count(
const K& key)
const
720 ETL_OR_STD::pair<const_iterator, const_iterator> range =
equal_range(key);
722 return static_cast<size_t>(etl::distance(range.first, range.second));
733 return etl::lower_bound(
begin(),
end(), key, compare);
738 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
752 return etl::lower_bound(
cbegin(),
cend(), key, compare);
757 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
771 return etl::upper_bound(
begin(),
end(), key, compare);
776 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
790 return etl::upper_bound(
begin(),
end(), key, compare);
795 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
807 ETL_OR_STD::pair<iterator, iterator>
equal_range(key_parameter_t key)
809 iterator i_lower = etl::lower_bound(
begin(),
end(), key, compare);
811 return ETL_OR_STD::make_pair(i_lower, etl::upper_bound(i_lower,
end(), key, compare));
816 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
817 ETL_OR_STD::pair<iterator, iterator>
equal_range(
const K& key)
821 return ETL_OR_STD::make_pair(i_lower, etl::upper_bound(i_lower,
end(), key,
compare));
830 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(key_parameter_t key)
const
832 const_iterator i_lower = etl::lower_bound(
cbegin(),
cend(), key, compare);
834 return ETL_OR_STD::make_pair(i_lower, etl::upper_bound(i_lower,
cend(), key, compare));
839 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
840 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(
const K& key)
const
844 return ETL_OR_STD::make_pair(i_lower, etl::upper_bound(i_lower,
cend(), key,
compare));
858 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
871 return lookup.size();
880 return lookup.empty();
889 return lookup.full();
898 return lookup.capacity();
907 return lookup.max_size();
916 return lookup.available();
934 ETL_OR_STD::pair<iterator, bool>
insert_at(iterator i_element, value_type& value)
936 ETL_OR_STD::pair<iterator, bool> result(
end(),
false);
938 if (i_element ==
end())
941 lookup.push_back(&value);
942 result.first = --
end();
943 result.second =
true;
948 lookup.insert(i_element.ilookup, &value);
949 result.first = i_element;
950 result.second =
true;
969#if defined(ETL_POLYMORPHIC_REFERENCE_FLAT_MULTIMAP) || defined(ETL_POLYMORPHIC_CONTAINERS)
989 template <
typename TKey,
typename TMapped,
typename TKeyCompare>
1003 template <
typename TKey,
typename TMapped,
typename TKeyCompare>
1007 return !(lhs == rhs);
1018 template <
typename TKey,
typename TValue, const
size_t MAX_SIZE_,
typename TCompare = etl::less<TKey> >
1023 static ETL_CONSTANT
size_t MAX_SIZE = MAX_SIZE_;
1048 template <
typename TIterator>
1065 typedef typename ireference_flat_multimap<TKey, TValue, TCompare>::value_type node_t;
1071 template <
typename TKey,
typename TValue, const
size_t MAX_SIZE_,
typename TCompare>
1072 ETL_CONSTANT
size_t reference_flat_multimap< TKey, TValue, MAX_SIZE_, TCompare>::MAX_SIZE;
1077#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
1078 template <
typename... TPairs>
1079 reference_flat_multimap(TPairs...) -> reference_flat_multimap<
typename etl::nth_type_t<0, TPairs...>::first_type,
1080 typename etl::nth_type_t<0, TPairs...>::second_type,
sizeof...(TPairs)>;
1086#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
1087 template <
typename TKey,
typename TMapped,
typename TKeyCompare = etl::less<TKey>,
typename... TPairs>
1088 constexpr auto make_reference_flat_multimap(TPairs&&... pairs) ->
etl::reference_flat_multimap<TKey, TMapped,
sizeof...(TPairs), TKeyCompare>
1090 return {etl::forward<TPairs>(pairs)...};
Definition reference_flat_multimap.h:68
Definition reference_flat_multimap.h:107
Definition reference_flat_multimap.h:85
const_reverse_iterator crbegin() const
Definition reference_flat_multimap.h:429
iterator erase(const_iterator i_element)
Definition reference_flat_multimap.h:584
size_t count(key_parameter_t key) const
Definition reference_flat_multimap.h:708
ETL_OR_STD::pair< iterator, iterator > equal_range(key_parameter_t key)
Definition reference_flat_multimap.h:807
iterator lower_bound(key_parameter_t key)
Definition reference_flat_multimap.h:731
ETL_OR_STD::pair< iterator, bool > emplace(value_type &value)
Definition reference_flat_multimap.h:495
const_iterator find(key_parameter_t key) const
Definition reference_flat_multimap.h:661
reverse_iterator rbegin()
Definition reference_flat_multimap.h:386
const_reverse_iterator crend() const
Definition reference_flat_multimap.h:440
iterator upper_bound(key_parameter_t key)
Definition reference_flat_multimap.h:769
bool empty() const
Definition reference_flat_multimap.h:878
const_reverse_iterator rbegin() const
Definition reference_flat_multimap.h:397
const_iterator cbegin() const
Definition reference_flat_multimap.h:367
size_type size() const
Definition reference_flat_multimap.h:869
ETL_OR_STD::pair< iterator, bool > insert_at(iterator i_element, value_type &value)
Definition reference_flat_multimap.h:934
size_t available() const
Definition reference_flat_multimap.h:914
iterator erase(const_iterator first, const_iterator last)
Definition reference_flat_multimap.h:596
iterator insert(const_iterator, const value_type &value)
Definition reference_flat_multimap.h:507
bool full() const
Definition reference_flat_multimap.h:887
size_t erase(key_parameter_t key)
Definition reference_flat_multimap.h:535
bool contains(const TKey &key) const
Check if the map contains the key.
Definition reference_flat_multimap.h:851
~ireference_flat_multimap()
Destructor.
Definition reference_flat_multimap.h:978
const_iterator end() const
Definition reference_flat_multimap.h:357
const_iterator upper_bound(key_parameter_t key) const
Definition reference_flat_multimap.h:788
const_reverse_iterator rend() const
Definition reference_flat_multimap.h:418
iterator begin()
Definition reference_flat_multimap.h:329
ETL_OR_STD::pair< iterator, bool > insert(value_type &value)
Definition reference_flat_multimap.h:477
iterator end()
Definition reference_flat_multimap.h:348
iterator find(key_parameter_t key)
Definition reference_flat_multimap.h:614
const_iterator cend() const
Definition reference_flat_multimap.h:376
size_type max_size() const
Definition reference_flat_multimap.h:905
void clear()
Clears the reference_flat_multimap.
Definition reference_flat_multimap.h:604
ETL_OR_STD::pair< const_iterator, const_iterator > equal_range(key_parameter_t key) const
Definition reference_flat_multimap.h:830
void insert(TIterator first, TIterator last)
Definition reference_flat_multimap.h:521
ireference_flat_multimap(lookup_t &lookup_)
Constructor.
Definition reference_flat_multimap.h:924
void assign(TIterator first, TIterator last)
Definition reference_flat_multimap.h:455
size_type capacity() const
Definition reference_flat_multimap.h:896
iterator erase(iterator i_element)
Definition reference_flat_multimap.h:575
reverse_iterator rend()
Definition reference_flat_multimap.h:407
const_iterator lower_bound(key_parameter_t key) const
Definition reference_flat_multimap.h:750
const_iterator begin() const
Definition reference_flat_multimap.h:339
Definition reference_flat_multimap.h:1020
~reference_flat_multimap()
Destructor.
Definition reference_flat_multimap.h:1058
reference_flat_multimap()
Constructor.
Definition reference_flat_multimap.h:1028
reference_flat_multimap(const reference_flat_multimap &other)
Copy constructor.
Definition reference_flat_multimap.h:1036
reference_flat_multimap(TIterator first, TIterator last)
Definition reference_flat_multimap.h:1049
#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
ETL_CONSTEXPR17 etl::enable_if<!etl::is_same< T, etl::nullptr_t >::value, T >::type * addressof(T &t)
Definition addressof.h:52
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
TContainer::iterator end(TContainer &container)
Definition iterator.h:1166
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