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_)
99 template <
typename T,
typename TKeyCompare = etl::less<T> >
105 typedef T value_type;
106 typedef TKeyCompare key_compare;
107 typedef value_type& reference;
108 typedef const value_type& const_reference;
109 typedef value_type* pointer;
110 typedef const value_type* const_pointer;
111 typedef size_t size_type;
120 class iterator :
public etl::iterator<ETL_OR_STD::bidirectional_iterator_tag, value_type>
124 friend class ireference_flat_multiset;
130 iterator(
typename lookup_t::iterator ilookup_)
135 iterator(
const iterator& other)
136 : ilookup(other.ilookup)
140 iterator& operator =(
const iterator& other)
142 ilookup = other.ilookup;
146 iterator& operator ++()
152 iterator operator ++(
int)
154 iterator temp(*
this);
159 iterator& operator --()
165 iterator operator --(
int)
167 iterator temp(*
this);
172 reference operator *()
const
177 pointer operator &()
const
182 pointer operator ->()
const
187 friend bool operator == (
const iterator& lhs,
const iterator& rhs)
189 return lhs.ilookup == rhs.ilookup;
192 friend bool operator != (
const iterator& lhs,
const iterator& rhs)
194 return !(lhs == rhs);
199 typename lookup_t::iterator ilookup;
203 class const_iterator :
public etl::iterator<ETL_OR_STD::bidirectional_iterator_tag, const value_type>
207 friend class ireference_flat_multiset;
213 const_iterator(
typename lookup_t::const_iterator ilookup_)
219 : ilookup(other.ilookup)
223 const_iterator(
const const_iterator& other)
224 : ilookup(other.ilookup)
228 const_iterator& operator =(
const iterator& other)
230 ilookup = other.ilookup;
234 const_iterator& operator =(
const const_iterator& other)
236 ilookup = other.ilookup;
240 const_iterator& operator ++()
246 const_iterator operator ++(
int)
248 const_iterator temp(*
this);
253 const_iterator& operator --()
259 const_iterator operator --(
int)
261 const_iterator temp(*
this);
266 const_reference operator *()
const
271 const_pointer operator &()
const
276 const_pointer operator ->()
const
281 friend bool operator == (
const const_iterator& lhs,
const const_iterator& rhs)
283 return lhs.ilookup == rhs.ilookup;
286 friend bool operator != (
const const_iterator& lhs,
const const_iterator& rhs)
288 return !(lhs == rhs);
293 typename lookup_t::const_iterator ilookup;
302 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
303 typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
304 typedef typename etl::iterator_traits<iterator>::difference_type difference_type;
312 return iterator(lookup.begin());
321 return const_iterator(lookup.begin());
330 return iterator(lookup.end());
337 const_iterator
end()
const
339 return const_iterator(lookup.end());
348 return const_iterator(lookup.cbegin());
357 return const_iterator(lookup.cend());
366 return reverse_iterator(lookup.rbegin());
375 return const_reverse_iterator(lookup.rbegin());
384 return reverse_iterator(lookup.rend());
391 const_reverse_iterator
rend()
const
393 return const_reverse_iterator(lookup.rend());
402 return const_reverse_iterator(lookup.crbegin());
409 const_reverse_iterator
crend()
const
411 return const_reverse_iterator(lookup.crend());
421 template <
typename TIterator>
422 void assign(TIterator first, TIterator last)
424#if ETL_IS_DEBUG_BUILD
425 difference_type d = etl::distance(first, last);
431 while (first != last)
443 ETL_OR_STD::pair<iterator, bool>
insert(value_type& value)
445 ETL_OR_STD::pair<iterator, bool> result(
end(),
false);
449 iterator i_element = etl::upper_bound(
begin(),
end(), value, compare);
451 if (i_element ==
end())
454 lookup.push_back(&value);
455 result.first = --
end();
456 result.second =
true;
461 lookup.insert(i_element.ilookup, &value);
462 result.first = i_element;
463 result.second =
true;
475 iterator
insert(const_iterator , value_type& value)
477 return insert(value).first;
487 template <
class TIterator>
488 void insert(TIterator first, TIterator last)
490 while (first != last)
504 ETL_OR_STD::pair<iterator, iterator> range =
equal_range(key);
506 if (range.first ==
end())
512 size_t d = etl::distance(range.first, range.second);
513 erase(range.first, range.second);
520 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
521 size_t erase(K&& key)
523 ETL_OR_STD::pair<iterator, iterator> range =
equal_range(etl::forward<K>(key));
525 if (range.first ==
end())
531 size_t d = etl::distance(range.first, range.second);
532 erase(range.first, range.second);
544 return lookup.erase(i_element.ilookup);
551 iterator
erase(const_iterator i_element)
553 return lookup.erase(i_element.ilookup);
563 iterator
erase(const_iterator first, const_iterator last)
565 return lookup.erase(first.ilookup, last.ilookup);
583 iterator itr = etl::lower_bound(
begin(),
end(), key, compare);
587 if (!key_compare()(*itr, key) && !key_compare()(key, *itr))
602 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
609 if (!key_compare()(*itr, key) && !key_compare()(key, *itr))
628 const_iterator
find(parameter_t key)
const
630 const_iterator itr = etl::lower_bound(
begin(),
end(), key, compare);
634 if (!key_compare()(*itr, key) && !key_compare()(key, *itr))
649 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
656 if (!key_compare()(*itr, key) && !key_compare()(key, *itr))
677 ETL_OR_STD::pair<const_iterator, const_iterator> range =
equal_range(key);
679 return etl::distance(range.first, range.second);
684 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
685 size_t count(
const K& key)
const
687 ETL_OR_STD::pair<const_iterator, const_iterator> range =
equal_range(key);
689 return etl::distance(range.first, range.second);
700 return etl::lower_bound(
begin(),
end(), key, compare);
705 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
719 return etl::lower_bound(
cbegin(),
cend(), key, compare);
724 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
738 return etl::upper_bound(
begin(),
end(), key, compare);
743 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
757 return etl::upper_bound(
cbegin(),
cend(), key, compare);
762 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
776 return etl::equal_range(
begin(),
end(), key, compare);
781 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(
const K& key)
798 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
810 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(parameter_t key)
const
812 return etl::equal_range(
begin(),
end(), key, compare);
821 return lookup.size();
830 return lookup.empty();
839 return lookup.full();
848 return lookup.capacity();
857 return lookup.max_size();
866 return lookup.available();
884 ETL_OR_STD::pair<iterator, bool>
insert_at(iterator i_element, reference value)
886 ETL_OR_STD::pair<iterator, bool> result(
end(),
false);
888 if (i_element ==
end())
893 lookup.push_back(&value);
894 result.first = --
end();
895 result.second =
true;
900 result.first = i_element;
904 lookup.insert(i_element.ilookup, &value);
905 result.second =
true;
924#if defined(ETL_POLYMORPHIC_REFERENCE_FLAT_MULTISET) || defined(ETL_POLYMORPHIC_CONTAINERS)
941 template <
typename TKey, const
size_t MAX_SIZE_,
typename TKeyCompare = etl::less<TKey> >
946 static ETL_CONSTANT
size_t MAX_SIZE = MAX_SIZE_;
948 using typename ireference_flat_multiset<TKey, TKeyCompare>::value_type;
973 template <
typename TIterator>
994 template <
typename TKey, const
size_t MAX_SIZE_,
typename TCompare>
995 ETL_CONSTANT
size_t reference_flat_multiset<TKey, MAX_SIZE_, TCompare>::MAX_SIZE;
1000#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
1001 template <
typename... T>
1002 reference_flat_multiset(T...)->reference_flat_multiset<etl::nth_type_t<0, T...>,
sizeof...(T)>;
1008#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
1009 template <
typename TKey,
typename TKeyCompare = etl::less<TKey>,
typename... T>
1012 return { etl::forward<T>(keys)... };
1023 template <
typename T,
typename TKeyCompare>
1036 template <
typename T,
typename TKeyCompare>
1039 return !(lhs == rhs);
Definition reference_flat_multiset.h:71
Definition reference_flat_multiset.h:121
Definition reference_flat_multiset.h:101
iterator upper_bound(parameter_t key)
Definition reference_flat_multiset.h:736
iterator erase(const_iterator first, const_iterator last)
Definition reference_flat_multiset.h:563
iterator erase(iterator i_element)
Definition reference_flat_multiset.h:542
iterator erase(const_iterator i_element)
Definition reference_flat_multiset.h:551
size_t count(parameter_t key) const
Definition reference_flat_multiset.h:675
const_iterator begin() const
Definition reference_flat_multiset.h:319
ETL_OR_STD::pair< iterator, bool > insert_at(iterator i_element, reference value)
Definition reference_flat_multiset.h:884
iterator begin()
Definition reference_flat_multiset.h:310
const_iterator find(parameter_t key) const
Definition reference_flat_multiset.h:628
~ireference_flat_multiset()
Destructor.
Definition reference_flat_multiset.h:931
const_iterator upper_bound(parameter_t key) const
Definition reference_flat_multiset.h:755
ireference_flat_multiset(lookup_t &lookup_)
Constructor.
Definition reference_flat_multiset.h:874
ETL_OR_STD::pair< const_iterator, const_iterator > equal_range(parameter_t key) const
Definition reference_flat_multiset.h:810
reverse_iterator rbegin()
Definition reference_flat_multiset.h:364
size_t erase(parameter_t key)
Definition reference_flat_multiset.h:502
bool empty() const
Definition reference_flat_multiset.h:828
const_iterator end() const
Definition reference_flat_multiset.h:337
reverse_iterator rend()
Definition reference_flat_multiset.h:382
iterator insert(const_iterator, value_type &value)
Definition reference_flat_multiset.h:475
ETL_OR_STD::pair< iterator, bool > insert(value_type &value)
Definition reference_flat_multiset.h:443
size_t available() const
Definition reference_flat_multiset.h:864
void insert(TIterator first, TIterator last)
Definition reference_flat_multiset.h:488
iterator find(parameter_t key)
Definition reference_flat_multiset.h:581
size_type size() const
Definition reference_flat_multiset.h:819
const_iterator lower_bound(parameter_t key) const
Definition reference_flat_multiset.h:717
bool contains(parameter_t key) const
Check if the map contains the key.
Definition reference_flat_multiset.h:791
bool full() const
Definition reference_flat_multiset.h:837
void clear()
Clears the reference_flat_multiset.
Definition reference_flat_multiset.h:571
iterator end()
Definition reference_flat_multiset.h:328
const_reverse_iterator rbegin() const
Definition reference_flat_multiset.h:373
iterator lower_bound(parameter_t key)
Definition reference_flat_multiset.h:698
ETL_OR_STD::pair< iterator, iterator > equal_range(parameter_t key)
Definition reference_flat_multiset.h:774
size_type capacity() const
Definition reference_flat_multiset.h:846
const_reverse_iterator crbegin() const
Definition reference_flat_multiset.h:400
const_reverse_iterator crend() const
Definition reference_flat_multiset.h:409
const_iterator cend() const
Definition reference_flat_multiset.h:355
const_reverse_iterator rend() const
Definition reference_flat_multiset.h:391
size_type max_size() const
Definition reference_flat_multiset.h:855
void assign(TIterator first, TIterator last)
Definition reference_flat_multiset.h:422
const_iterator cbegin() const
Definition reference_flat_multiset.h:346
Definition reference_flat_multiset.h:943
reference_flat_multiset(const reference_flat_multiset &other)
Copy constructor.
Definition reference_flat_multiset.h:961
~reference_flat_multiset()
Destructor.
Definition reference_flat_multiset.h:983
reference_flat_multiset()
Constructor.
Definition reference_flat_multiset.h:953
reference_flat_multiset(TIterator first, TIterator last)
Definition reference_flat_multiset.h:974
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
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:48