31#ifndef ETL_REFERENCE_FLAT_MULTISET_INCLUDED
32#define ETL_REFERENCE_FLAT_MULTISET_INCLUDED
60 flat_multiset_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
61 :
exception(reason_, file_name_, line_number_)
70 class flat_multiset_full :
public flat_multiset_exception
74 flat_multiset_full(string_type file_name_, numeric_type line_number_)
75 : flat_multiset_exception(ETL_ERROR_TEXT(
"flat_multiset:full", ETL_REFERENCE_FLAT_MULTISET_FILE_ID
"A"), file_name_, line_number_)
84 class flat_multiset_iterator :
public flat_multiset_exception
88 flat_multiset_iterator(string_type file_name_, numeric_type line_number_)
89 : flat_multiset_exception(ETL_ERROR_TEXT(
"flat_multiset:iterator", ETL_REFERENCE_FLAT_MULTISET_FILE_ID
"B"), file_name_, line_number_)
100 template <
typename T,
typename TKeyCompare = etl::less<T> >
106 typedef T value_type;
107 typedef TKeyCompare key_compare;
108 typedef value_type& reference;
109 typedef const value_type& const_reference;
110 typedef value_type* pointer;
111 typedef const value_type* const_pointer;
112 typedef size_t size_type;
121 class iterator :
public etl::iterator<ETL_OR_STD::bidirectional_iterator_tag, value_type>
125 friend class ireference_flat_multiset;
129 iterator(
typename lookup_t::iterator ilookup_)
134 iterator(
const iterator& other)
135 : ilookup(other.ilookup)
139 iterator& operator=(
const iterator& other)
141 ilookup = other.ilookup;
145 iterator& operator++()
151 iterator operator++(
int)
153 iterator temp(*
this);
158 iterator& operator--()
164 iterator operator--(
int)
166 iterator temp(*
this);
171 reference operator*()
const
176 pointer operator&()
const
181 pointer operator->()
const
186 friend bool operator==(
const iterator& lhs,
const iterator& rhs)
188 return lhs.ilookup == rhs.ilookup;
191 friend bool operator!=(
const iterator& lhs,
const iterator& rhs)
193 return !(lhs == rhs);
198 typename lookup_t::iterator ilookup;
202 class const_iterator :
public etl::iterator<ETL_OR_STD::bidirectional_iterator_tag, const value_type>
206 friend class ireference_flat_multiset;
210 const_iterator(
typename lookup_t::const_iterator ilookup_)
216 : ilookup(other.ilookup)
220 const_iterator(
const const_iterator& other)
221 : ilookup(other.ilookup)
225 const_iterator& operator=(
const iterator& other)
227 ilookup = other.ilookup;
231 const_iterator& operator=(
const const_iterator& other)
233 ilookup = other.ilookup;
237 const_iterator& operator++()
243 const_iterator operator++(
int)
245 const_iterator temp(*
this);
250 const_iterator& operator--()
256 const_iterator operator--(
int)
258 const_iterator temp(*
this);
263 const_reference operator*()
const
268 const_pointer operator&()
const
273 const_pointer operator->()
const
278 friend bool operator==(
const const_iterator& lhs,
const const_iterator& rhs)
280 return lhs.ilookup == rhs.ilookup;
283 friend bool operator!=(
const const_iterator& lhs,
const const_iterator& rhs)
285 return !(lhs == rhs);
290 typename lookup_t::const_iterator ilookup;
299 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
300 typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
301 typedef typename etl::iterator_traits<iterator>::difference_type difference_type;
309 return iterator(lookup.begin());
319 return const_iterator(lookup.begin());
328 return iterator(lookup.end());
335 const_iterator
end()
const
337 return const_iterator(lookup.end());
347 return const_iterator(lookup.cbegin());
356 return const_iterator(lookup.cend());
366 return reverse_iterator(lookup.rbegin());
377 return const_reverse_iterator(lookup.rbegin());
387 return reverse_iterator(lookup.rend());
396 const_reverse_iterator
rend()
const
398 return const_reverse_iterator(lookup.rend());
409 return const_reverse_iterator(lookup.crbegin());
418 const_reverse_iterator
crend()
const
420 return const_reverse_iterator(lookup.crend());
432 template <
typename TIterator>
433 void assign(TIterator first, TIterator last)
435#if ETL_IS_DEBUG_BUILD
436 difference_type d = etl::distance(first, last);
442 while (first != last)
455 ETL_OR_STD::pair<iterator, bool>
insert(value_type& value)
457 ETL_OR_STD::pair<iterator, bool> result(
end(),
false);
461 iterator i_element = etl::upper_bound(
begin(),
end(), value, compare);
463 if (i_element ==
end())
466 lookup.push_back(&value);
467 result.first = --
end();
468 result.second =
true;
473 lookup.insert(i_element.ilookup, &value);
474 result.first = i_element;
475 result.second =
true;
488 ETL_OR_STD::pair<iterator, bool>
emplace(value_type& value)
500 iterator
insert(const_iterator , value_type& value)
502 return insert(value).first;
513 template <
class TIterator>
514 void insert(TIterator first, TIterator last)
516 while (first != last)
530 ETL_OR_STD::pair<iterator, iterator> range =
equal_range(key);
532 if (range.first ==
end())
538 size_t d =
static_cast<size_t>(etl::distance(range.first, range.second));
539 erase(range.first, range.second);
546 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
547 size_t erase(K&& key)
549 ETL_OR_STD::pair<iterator, iterator> range =
equal_range(etl::forward<K>(key));
551 if (range.first ==
end())
557 size_t d =
static_cast<size_t>(etl::distance(range.first, range.second));
558 erase(range.first, range.second);
570 return lookup.erase(i_element.ilookup);
577 iterator
erase(const_iterator i_element)
579 return lookup.erase(i_element.ilookup);
589 iterator
erase(const_iterator first, const_iterator last)
591 return lookup.erase(first.ilookup, last.ilookup);
609 iterator itr = etl::lower_bound(
begin(),
end(), key, compare);
613 if (!key_compare()(*itr, key) && !key_compare()(key, *itr))
628 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
635 if (!key_compare()(*itr, key) && !key_compare()(key, *itr))
654 const_iterator
find(parameter_t key)
const
656 const_iterator itr = etl::lower_bound(
begin(),
end(), key, compare);
660 if (!key_compare()(*itr, key) && !key_compare()(key, *itr))
675 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
682 if (!key_compare()(*itr, key) && !key_compare()(key, *itr))
703 ETL_OR_STD::pair<const_iterator, const_iterator> range =
equal_range(key);
705 return static_cast<size_t>(etl::distance(range.first, range.second));
710 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
711 size_t count(
const K& key)
const
713 ETL_OR_STD::pair<const_iterator, const_iterator> range =
equal_range(key);
715 return static_cast<size_t>(etl::distance(range.first, range.second));
726 return etl::lower_bound(
begin(),
end(), key, compare);
731 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
745 return etl::lower_bound(
cbegin(),
cend(), key, compare);
750 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
764 return etl::upper_bound(
begin(),
end(), key, compare);
769 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
783 return etl::upper_bound(
cbegin(),
cend(), key, compare);
788 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
802 return etl::equal_range(
begin(),
end(), key, compare);
807 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
808 ETL_OR_STD::pair<iterator, iterator>
equal_range(
const K& key)
824 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
836 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(parameter_t key)
const
838 return etl::equal_range(
begin(),
end(), key, compare);
847 return lookup.size();
856 return lookup.empty();
865 return lookup.full();
874 return lookup.capacity();
883 return lookup.max_size();
892 return lookup.available();
910 ETL_OR_STD::pair<iterator, bool>
insert_at(iterator i_element, reference value)
912 ETL_OR_STD::pair<iterator, bool> result(
end(),
false);
914 if (i_element ==
end())
919 lookup.push_back(&value);
920 result.first = --
end();
921 result.second =
true;
926 result.first = i_element;
930 lookup.insert(i_element.ilookup, &value);
931 result.second =
true;
950#if defined(ETL_POLYMORPHIC_REFERENCE_FLAT_MULTISET) || defined(ETL_POLYMORPHIC_CONTAINERS)
967 template <
typename TKey, const
size_t MAX_SIZE_,
typename TKeyCompare = etl::less<TKey> >
972 static ETL_CONSTANT
size_t MAX_SIZE = MAX_SIZE_;
974 using typename ireference_flat_multiset<TKey, TKeyCompare>::value_type;
999 template <
typename TIterator>
1020 template <
typename TKey, const
size_t MAX_SIZE_,
typename TCompare>
1021 ETL_CONSTANT
size_t reference_flat_multiset<TKey, MAX_SIZE_, TCompare>::MAX_SIZE;
1026#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
1027 template <
typename... T>
1028 reference_flat_multiset(T...) -> reference_flat_multiset<etl::nth_type_t<0, T...>,
sizeof...(T)>;
1034#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
1035 template <
typename TKey,
typename TKeyCompare = etl::less<TKey>,
typename... T>
1038 return {etl::forward<T>(keys)...};
1049 template <
typename T,
typename TKeyCompare>
1062 template <
typename T,
typename TKeyCompare>
1065 return !(lhs == rhs);
Definition reference_flat_multiset.h:71
Definition reference_flat_multiset.h:122
Definition reference_flat_multiset.h:102
iterator upper_bound(parameter_t key)
Definition reference_flat_multiset.h:762
iterator erase(const_iterator first, const_iterator last)
Definition reference_flat_multiset.h:589
iterator erase(iterator i_element)
Definition reference_flat_multiset.h:568
iterator erase(const_iterator i_element)
Definition reference_flat_multiset.h:577
size_t count(parameter_t key) const
Definition reference_flat_multiset.h:701
const_iterator begin() const
Definition reference_flat_multiset.h:317
ETL_OR_STD::pair< iterator, bool > insert_at(iterator i_element, reference value)
Definition reference_flat_multiset.h:910
iterator begin()
Definition reference_flat_multiset.h:307
const_iterator find(parameter_t key) const
Definition reference_flat_multiset.h:654
~ireference_flat_multiset()
Destructor.
Definition reference_flat_multiset.h:959
const_iterator upper_bound(parameter_t key) const
Definition reference_flat_multiset.h:781
ireference_flat_multiset(lookup_t &lookup_)
Constructor.
Definition reference_flat_multiset.h:900
ETL_OR_STD::pair< const_iterator, const_iterator > equal_range(parameter_t key) const
Definition reference_flat_multiset.h:836
reverse_iterator rbegin()
Definition reference_flat_multiset.h:364
size_t erase(parameter_t key)
Definition reference_flat_multiset.h:528
bool empty() const
Definition reference_flat_multiset.h:854
const_iterator end() const
Definition reference_flat_multiset.h:335
reverse_iterator rend()
Definition reference_flat_multiset.h:385
iterator insert(const_iterator, value_type &value)
Definition reference_flat_multiset.h:500
ETL_OR_STD::pair< iterator, bool > insert(value_type &value)
Definition reference_flat_multiset.h:455
size_t available() const
Definition reference_flat_multiset.h:890
void insert(TIterator first, TIterator last)
Definition reference_flat_multiset.h:514
iterator find(parameter_t key)
Definition reference_flat_multiset.h:607
size_type size() const
Definition reference_flat_multiset.h:845
const_iterator lower_bound(parameter_t key) const
Definition reference_flat_multiset.h:743
ETL_OR_STD::pair< iterator, bool > emplace(value_type &value)
Definition reference_flat_multiset.h:488
bool contains(parameter_t key) const
Check if the map contains the key.
Definition reference_flat_multiset.h:817
bool full() const
Definition reference_flat_multiset.h:863
void clear()
Clears the reference_flat_multiset.
Definition reference_flat_multiset.h:597
iterator end()
Definition reference_flat_multiset.h:326
const_reverse_iterator rbegin() const
Definition reference_flat_multiset.h:375
iterator lower_bound(parameter_t key)
Definition reference_flat_multiset.h:724
ETL_OR_STD::pair< iterator, iterator > equal_range(parameter_t key)
Definition reference_flat_multiset.h:800
size_type capacity() const
Definition reference_flat_multiset.h:872
const_reverse_iterator crbegin() const
Definition reference_flat_multiset.h:407
const_reverse_iterator crend() const
Definition reference_flat_multiset.h:418
const_iterator cend() const
Definition reference_flat_multiset.h:354
const_reverse_iterator rend() const
Definition reference_flat_multiset.h:396
size_type max_size() const
Definition reference_flat_multiset.h:881
void assign(TIterator first, TIterator last)
Definition reference_flat_multiset.h:433
const_iterator cbegin() const
Definition reference_flat_multiset.h:345
Definition reference_flat_multiset.h:969
reference_flat_multiset(const reference_flat_multiset &other)
Copy constructor.
Definition reference_flat_multiset.h:987
~reference_flat_multiset()
Destructor.
Definition reference_flat_multiset.h:1009
reference_flat_multiset()
Constructor.
Definition reference_flat_multiset.h:979
reference_flat_multiset(TIterator first, TIterator last)
Definition reference_flat_multiset.h:1000
#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::conditional< etl::is_fundamental< T >::value||etl::is_pointer< T >::value, T, constT & >::type type
By default fundamental and pointer types are passed by value.
Definition parameter_type.h:46
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