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 iterator
insert(const_iterator ,
const value_type& value)
497 return insert(value).first;
508 template <
class TIterator>
509 void insert(TIterator first, TIterator last)
511 while (first != last)
525 ETL_OR_STD::pair<iterator, iterator> range =
equal_range(key);
527 if (range.first ==
end())
533 size_t d =
static_cast<size_t>(etl::distance(range.first, range.second));
534 erase(range.first, range.second);
541 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
542 size_t erase(K&& key)
544 ETL_OR_STD::pair<iterator, iterator> range =
equal_range(key);
546 if (range.first ==
end())
552 size_t d =
static_cast<size_t>(etl::distance(range.first, range.second));
553 erase(range.first, range.second);
565 return lookup.erase(i_element.ilookup);
572 iterator
erase(const_iterator i_element)
574 return lookup.erase(i_element.ilookup);
584 iterator
erase(const_iterator first, const_iterator last)
586 return lookup.erase(first.ilookup, last.ilookup);
602 iterator
find(key_parameter_t key)
608 if (!key_compare()(itr->first, key) && !key_compare()(key, itr->first))
623 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
630 if (!key_compare()(itr->first, key) && !key_compare()(key, itr->first))
649 const_iterator
find(key_parameter_t key)
const
655 if (!key_compare()(itr->first, key) && !key_compare()(key, itr->first))
670 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
677 if (!key_compare()(itr->first, key) && !key_compare()(key, itr->first))
696 size_t count(key_parameter_t key)
const
698 ETL_OR_STD::pair<const_iterator, const_iterator> range =
equal_range(key);
700 return static_cast<size_t>(etl::distance(range.first, range.second));
705 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
706 size_t count(
const K& key)
const
708 ETL_OR_STD::pair<const_iterator, const_iterator> range =
equal_range(key);
710 return static_cast<size_t>(etl::distance(range.first, range.second));
721 return etl::lower_bound(
begin(),
end(), key, compare);
726 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
740 return etl::lower_bound(
cbegin(),
cend(), key, compare);
745 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
759 return etl::upper_bound(
begin(),
end(), key, compare);
764 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
778 return etl::upper_bound(
begin(),
end(), key, compare);
783 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
795 ETL_OR_STD::pair<iterator, iterator>
equal_range(key_parameter_t key)
797 iterator i_lower = etl::lower_bound(
begin(),
end(), key, compare);
799 return ETL_OR_STD::make_pair(i_lower, etl::upper_bound(i_lower,
end(), key, compare));
804 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
805 ETL_OR_STD::pair<iterator, iterator>
equal_range(
const K& key)
809 return ETL_OR_STD::make_pair(i_lower, etl::upper_bound(i_lower,
end(), key,
compare));
818 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(key_parameter_t key)
const
820 const_iterator i_lower = etl::lower_bound(
cbegin(),
cend(), key, compare);
822 return ETL_OR_STD::make_pair(i_lower, etl::upper_bound(i_lower,
cend(), key, compare));
827 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
828 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(
const K& key)
const
832 return ETL_OR_STD::make_pair(i_lower, etl::upper_bound(i_lower,
cend(), key,
compare));
846 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
859 return lookup.size();
868 return lookup.empty();
877 return lookup.full();
886 return lookup.capacity();
895 return lookup.max_size();
904 return lookup.available();
922 ETL_OR_STD::pair<iterator, bool>
insert_at(iterator i_element, value_type& value)
924 ETL_OR_STD::pair<iterator, bool> result(
end(),
false);
926 if (i_element ==
end())
929 lookup.push_back(&value);
930 result.first = --
end();
931 result.second =
true;
936 lookup.insert(i_element.ilookup, &value);
937 result.first = i_element;
938 result.second =
true;
957#if defined(ETL_POLYMORPHIC_REFERENCE_FLAT_MULTIMAP) || defined(ETL_POLYMORPHIC_CONTAINERS)
977 template <
typename TKey,
typename TMapped,
typename TKeyCompare>
991 template <
typename TKey,
typename TMapped,
typename TKeyCompare>
995 return !(lhs == rhs);
1006 template <
typename TKey,
typename TValue, const
size_t MAX_SIZE_,
typename TCompare = etl::less<TKey> >
1011 static ETL_CONSTANT
size_t MAX_SIZE = MAX_SIZE_;
1036 template <
typename TIterator>
1053 typedef typename ireference_flat_multimap<TKey, TValue, TCompare>::value_type node_t;
1059 template <
typename TKey,
typename TValue, const
size_t MAX_SIZE_,
typename TCompare>
1060 ETL_CONSTANT
size_t reference_flat_multimap< TKey, TValue, MAX_SIZE_, TCompare>::MAX_SIZE;
1065#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
1066 template <
typename... TPairs>
1067 reference_flat_multimap(TPairs...) -> reference_flat_multimap<
typename etl::nth_type_t<0, TPairs...>::first_type,
1068 typename etl::nth_type_t<0, TPairs...>::second_type,
sizeof...(TPairs)>;
1074#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
1075 template <
typename TKey,
typename TMapped,
typename TKeyCompare = etl::less<TKey>,
typename... TPairs>
1076 constexpr auto make_reference_flat_multimap(TPairs&&... pairs) ->
etl::reference_flat_multimap<TKey, TMapped,
sizeof...(TPairs), TKeyCompare>
1078 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:572
size_t count(key_parameter_t key) const
Definition reference_flat_multimap.h:696
ETL_OR_STD::pair< iterator, iterator > equal_range(key_parameter_t key)
Definition reference_flat_multimap.h:795
iterator lower_bound(key_parameter_t key)
Definition reference_flat_multimap.h:719
const_iterator find(key_parameter_t key) const
Definition reference_flat_multimap.h:649
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:757
bool empty() const
Definition reference_flat_multimap.h:866
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:857
ETL_OR_STD::pair< iterator, bool > insert_at(iterator i_element, value_type &value)
Definition reference_flat_multimap.h:922
size_t available() const
Definition reference_flat_multimap.h:902
iterator erase(const_iterator first, const_iterator last)
Definition reference_flat_multimap.h:584
iterator insert(const_iterator, const value_type &value)
Definition reference_flat_multimap.h:495
bool full() const
Definition reference_flat_multimap.h:875
size_t erase(key_parameter_t key)
Definition reference_flat_multimap.h:523
bool contains(const TKey &key) const
Check if the map contains the key.
Definition reference_flat_multimap.h:839
~ireference_flat_multimap()
Destructor.
Definition reference_flat_multimap.h:966
const_iterator end() const
Definition reference_flat_multimap.h:357
const_iterator upper_bound(key_parameter_t key) const
Definition reference_flat_multimap.h:776
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:602
const_iterator cend() const
Definition reference_flat_multimap.h:376
size_type max_size() const
Definition reference_flat_multimap.h:893
void clear()
Clears the reference_flat_multimap.
Definition reference_flat_multimap.h:592
ETL_OR_STD::pair< const_iterator, const_iterator > equal_range(key_parameter_t key) const
Definition reference_flat_multimap.h:818
void insert(TIterator first, TIterator last)
Definition reference_flat_multimap.h:509
ireference_flat_multimap(lookup_t &lookup_)
Constructor.
Definition reference_flat_multimap.h:912
void assign(TIterator first, TIterator last)
Definition reference_flat_multimap.h:455
size_type capacity() const
Definition reference_flat_multimap.h:884
iterator erase(iterator i_element)
Definition reference_flat_multimap.h:563
reverse_iterator rend()
Definition reference_flat_multimap.h:407
const_iterator lower_bound(key_parameter_t key) const
Definition reference_flat_multimap.h:738
const_iterator begin() const
Definition reference_flat_multimap.h:339
Definition reference_flat_multimap.h:1008
~reference_flat_multimap()
Destructor.
Definition reference_flat_multimap.h:1046
reference_flat_multimap()
Constructor.
Definition reference_flat_multimap.h:1016
reference_flat_multimap(const reference_flat_multimap &other)
Copy constructor.
Definition reference_flat_multimap.h:1024
reference_flat_multimap(TIterator first, TIterator last)
Definition reference_flat_multimap.h:1037
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
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: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
ETL_CONSTEXPR TContainer::iterator end(TContainer &container)
Definition iterator.h:997
iterator
Definition iterator.h:424