31#ifndef ETL_FLAT_MULTISET_INCLUDED
32#define ETL_FLAT_MULTISET_INCLUDED
60 template <
typename T,
typename TKeyCompare = etl::less<T> >
66 typedef typename refset_t::lookup_t lookup_t;
69 typedef const T& key_parameter_t;
75 typedef TKeyCompare key_compare;
76 typedef value_type& reference;
77 typedef const value_type& const_reference;
79 typedef value_type&& rvalue_reference;
81 typedef value_type* pointer;
82 typedef const value_type* const_pointer;
83 typedef size_t size_type;
85 typedef typename refset_t::iterator iterator;
86 typedef typename refset_t::const_iterator const_iterator;
88 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
89 typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
90 typedef typename etl::iterator_traits<iterator>::difference_type difference_type;
125 const_iterator
end()
const
181 const_reverse_iterator
rend()
const
201 const_reverse_iterator
crend()
const
214 template <
typename TIterator>
215 void assign(TIterator first, TIterator last)
217#if ETL_IS_DEBUG_BUILD
218 difference_type d = etl::distance(first, last);
224 while (first != last)
237 ETL_OR_STD::pair<iterator, bool>
insert(const_reference value)
239 ETL_OR_STD::pair<iterator, bool> result(
end(),
false);
243 iterator i_element = etl::upper_bound(
begin(),
end(), value, compare);
245 value_type* pvalue = storage.allocate<value_type>();
246 ::new (pvalue) value_type(value);
247 ETL_INCREMENT_DEBUG_COUNT;
260 ETL_OR_STD::pair<iterator, bool>
insert(rvalue_reference value)
262 ETL_OR_STD::pair<iterator, bool> result(
end(),
false);
270 ETL_INCREMENT_DEBUG_COUNT;
284 iterator
insert(const_iterator , const_reference value)
286 return insert(value).first;
299 return insert(etl::move(value)).first;
311 template <
class TIterator>
312 void insert(TIterator first, TIterator last)
314 while (first != last)
324 template <
typename T1>
325 ETL_OR_STD::pair<iterator, bool>
emplace(const_reference value)
333#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_FLAT_MULTISET_FORCE_CPP03_IMPLEMENTATION)
334 template <
typename... Args>
335 ETL_OR_STD::pair<iterator, bool>
emplace(Args&&... args)
341 ::new (pvalue)
value_type(etl::forward<Args>(args)...);
345 ETL_INCREMENT_DEBUG_COUNT;
357 value_type* pvalue = storage.allocate<value_type>();
358 ::new (pvalue) value_type();
362 ETL_INCREMENT_DEBUG_COUNT;
369 template <
typename T1>
370 ETL_OR_STD::pair<iterator, bool>
emplace(
const T1& value1)
375 value_type* pvalue = storage.allocate<value_type>();
376 ::new (pvalue) value_type(value1);
380 ETL_INCREMENT_DEBUG_COUNT;
387 template <
typename T1,
typename T2>
388 ETL_OR_STD::pair<iterator, bool>
emplace(
const T1& value1,
const T2& value2)
393 value_type* pvalue = storage.allocate<value_type>();
394 ::new (pvalue) value_type(value1, value2);
398 ETL_INCREMENT_DEBUG_COUNT;
405 template <
typename T1,
typename T2,
typename T3>
406 ETL_OR_STD::pair<iterator, bool>
emplace(
const T1& value1,
const T2& value2,
const T3& value3)
411 value_type* pvalue = storage.allocate<value_type>();
412 ::new (pvalue) value_type(value1, value2, value3);
416 ETL_INCREMENT_DEBUG_COUNT;
423 template <
typename T1,
typename T2,
typename T3,
typename T4>
424 ETL_OR_STD::pair<iterator, bool>
emplace(
const T1& value1,
const T2& value2,
const T3& value3,
const T4& value4)
429 value_type* pvalue = storage.allocate<value_type>();
430 ::new (pvalue) value_type(value1, value2, value3, value4);
434 ETL_INCREMENT_DEBUG_COUNT;
446 ETL_OR_STD::pair<iterator, iterator> range =
equal_range(key);
448 if (range.first ==
end())
454 size_t d =
static_cast<size_t>(etl::distance(range.first, range.second));
455 erase(range.first, range.second);
462 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
463 size_t erase(K&& key)
465 ETL_OR_STD::pair<iterator, iterator> range =
equal_range(etl::forward<K>(key));
467 if (range.first ==
end())
473 size_t d =
static_cast<size_t>(etl::distance(range.first, range.second));
474 erase(range.first, range.second);
488 ETL_DECREMENT_DEBUG_COUNT;
496 iterator
erase(const_iterator i_element)
500 ETL_DECREMENT_DEBUG_COUNT;
511 iterator
erase(const_iterator first, const_iterator last)
513 const_iterator itr = first;
520 ETL_DECREMENT_DEBUG_COUNT;
531 if ETL_IF_CONSTEXPR (etl::is_trivially_destructible<value_type>::value)
533 storage.release_all();
537 iterator itr =
begin();
547 ETL_RESET_DEBUG_COUNT;
556 iterator
find(key_parameter_t key)
563 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
575 const_iterator
find(key_parameter_t key)
const
582 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
594 size_t count(key_parameter_t key)
const
601 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
602 size_t count(
const K& key)
const
620 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
639 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
658 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
677 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
689 ETL_OR_STD::pair<iterator, iterator>
equal_range(key_parameter_t key)
696 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
697 ETL_OR_STD::pair<iterator, iterator>
equal_range(
const K& key)
708 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(key_parameter_t key)
const
715 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
716 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(
const K& key)
const
732 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
758 move_container(etl::move(rhs));
840 etl::iflat_multiset<T, TKeyCompare>::iterator first = rhs.begin();
841 etl::iflat_multiset<T, TKeyCompare>::iterator last = rhs.end();
844 while (first != last)
846 typename etl::iflat_multiset<T, TKeyCompare>::iterator temp = first;
849 this->
insert(etl::move(*first));
866 ETL_DECLARE_DEBUG_COUNT;
871#if defined(ETL_POLYMORPHIC_FLAT_MULTISET) || defined(ETL_POLYMORPHIC_CONTAINERS)
891 template <
typename T,
typename TKeyCompare>
904 template <
typename T,
typename TKeyCompare>
907 return !(lhs == rhs);
917 template <
typename T, const
size_t MAX_SIZE_,
typename TCompare = etl::less<T> >
922 static ETL_CONSTANT
size_t MAX_SIZE = MAX_SIZE_;
950 this->move_container(etl::move(other));
961 template <
typename TIterator>
965 this->
assign(first, last);
968#if ETL_HAS_INITIALIZER_LIST
975 this->
assign(init.begin(), init.end());
1008 this->move_container(etl::move(rhs));
1017 typedef typename etl::iflat_multiset<T, TCompare>::value_type node_t;
1020 etl::pool<node_t, MAX_SIZE> storage;
1023 etl::vector<node_t*, MAX_SIZE> lookup;
1026 template <
typename T, const
size_t MAX_SIZE_,
typename TCompare>
1027 ETL_CONSTANT
size_t flat_multiset<T, MAX_SIZE_, TCompare>::MAX_SIZE;
1032#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
1033 template <
typename... T>
1040#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
1041 template <
typename TKey,
typename TKeyCompare = etl::less<TKey>,
typename... T>
1042 constexpr auto make_flat_multiset(T&&... keys) -> etl::flat_multiset<TKey,
sizeof...(T), TKeyCompare>
1044 return {etl::forward<T>(keys)...};
Definition reference_flat_multiset.h:71
Definition reference_flat_multiset.h:102
iterator upper_bound(parameter_t key)
Definition reference_flat_multiset.h:750
size_t count(parameter_t key) const
Definition reference_flat_multiset.h:689
ETL_OR_STD::pair< iterator, bool > insert_at(iterator i_element, reference value)
Definition reference_flat_multiset.h:898
iterator begin()
Definition reference_flat_multiset.h:307
reverse_iterator rbegin()
Definition reference_flat_multiset.h:364
size_t erase(parameter_t key)
Definition reference_flat_multiset.h:516
bool empty() const
Definition reference_flat_multiset.h:842
reverse_iterator rend()
Definition reference_flat_multiset.h:385
size_t available() const
Definition reference_flat_multiset.h:878
iterator find(parameter_t key)
Definition reference_flat_multiset.h:595
size_type size() const
Definition reference_flat_multiset.h:833
bool full() const
Definition reference_flat_multiset.h:851
void clear()
Definition reference_flat_multiset.h:585
iterator end()
Definition reference_flat_multiset.h:326
iterator lower_bound(parameter_t key)
Definition reference_flat_multiset.h:712
ETL_OR_STD::pair< iterator, iterator > equal_range(parameter_t key)
Definition reference_flat_multiset.h:788
size_type capacity() const
Definition reference_flat_multiset.h:860
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
size_type max_size() const
Definition reference_flat_multiset.h:869
const_iterator cbegin() const
Definition reference_flat_multiset.h:345
#define ETL_ASSERT(b, e)
Definition error_handler.h:511
void clear()
Clears the flat_multiset.
Definition flat_multiset.h:529
ETL_OR_STD::pair< iterator, iterator > equal_range(key_parameter_t key)
Definition flat_multiset.h:689
const_reverse_iterator crbegin() const
Definition flat_multiset.h:192
ETL_OR_STD::pair< const_iterator, const_iterator > equal_range(key_parameter_t key) const
Definition flat_multiset.h:708
const_iterator end() const
Definition flat_multiset.h:125
iterator erase(const_iterator i_element)
Definition flat_multiset.h:496
const_reverse_iterator rbegin() const
Definition flat_multiset.h:163
const_reverse_iterator rend() const
Definition flat_multiset.h:181
iterator erase(iterator i_element)
Definition flat_multiset.h:484
flat_multiset()
Constructor.
Definition flat_multiset.h:927
iflat_multiset(lookup_t &lookup_, storage_t &storage_)
Constructor.
Definition flat_multiset.h:823
iterator begin()
Definition flat_multiset.h:98
void insert(TIterator first, TIterator last)
Definition flat_multiset.h:312
ETL_OR_STD::pair< iterator, bool > insert(const_reference value)
Definition flat_multiset.h:237
const_iterator cend() const
Definition flat_multiset.h:143
iterator erase(const_iterator first, const_iterator last)
Definition flat_multiset.h:511
iterator lower_bound(key_parameter_t key)
Definition flat_multiset.h:613
void assign(TIterator first, TIterator last)
Definition flat_multiset.h:215
ETL_OR_STD::pair< iterator, bool > emplace(const T1 &value1, const T2 &value2, const T3 &value3, const T4 &value4)
Emplaces a value to the set.
Definition flat_multiset.h:424
~iflat_multiset()
Destructor.
Definition flat_multiset.h:880
iterator find(key_parameter_t key)
Definition flat_multiset.h:556
const_iterator find(key_parameter_t key) const
Definition flat_multiset.h:575
bool contains(key_parameter_t key) const
Check if the map contains the key.
Definition flat_multiset.h:725
const_iterator lower_bound(key_parameter_t key) const
Definition flat_multiset.h:632
ETL_OR_STD::pair< iterator, bool > emplace(const T1 &value1, const T2 &value2, const T3 &value3)
Emplaces a value to the set.
Definition flat_multiset.h:406
size_t count(key_parameter_t key) const
Definition flat_multiset.h:594
reverse_iterator rend()
Definition flat_multiset.h:172
bool empty() const
Definition flat_multiset.h:777
~flat_multiset()
Destructor.
Definition flat_multiset.h:982
const_reverse_iterator crend() const
Definition flat_multiset.h:201
flat_multiset(TIterator first, TIterator last)
Definition flat_multiset.h:962
size_type max_size() const
Definition flat_multiset.h:804
ETL_OR_STD::pair< iterator, bool > emplace(const_reference value)
Emplaces a value to the set.
Definition flat_multiset.h:325
const_iterator upper_bound(key_parameter_t key) const
Definition flat_multiset.h:670
ETL_OR_STD::pair< iterator, bool > emplace(const T1 &value1)
Emplaces a value to the set.
Definition flat_multiset.h:370
size_type capacity() const
Definition flat_multiset.h:795
flat_multiset & operator=(const flat_multiset &rhs)
Assignment operator.
Definition flat_multiset.h:990
iterator end()
Definition flat_multiset.h:116
const_iterator begin() const
Definition flat_multiset.h:107
const_iterator cbegin() const
Definition flat_multiset.h:134
reverse_iterator rbegin()
Definition flat_multiset.h:153
bool full() const
Definition flat_multiset.h:786
size_t erase(key_parameter_t key)
Definition flat_multiset.h:444
iterator upper_bound(key_parameter_t key)
Definition flat_multiset.h:651
size_type size() const
Definition flat_multiset.h:768
ETL_OR_STD::pair< iterator, bool > emplace(const T1 &value1, const T2 &value2)
Emplaces a value to the set.
Definition flat_multiset.h:388
size_t available() const
Definition flat_multiset.h:813
flat_multiset(const flat_multiset &other)
Copy constructor.
Definition flat_multiset.h:935
iterator insert(const_iterator, const_reference value)
Definition flat_multiset.h:284
ETL_OR_STD::pair< iterator, bool > emplace()
Emplaces a value to the set.
Definition flat_multiset.h:352
iflat_multiset & operator=(const iflat_multiset &rhs)
Assignment operator.
Definition flat_multiset.h:742
Definition flat_multiset.h:919
Definition flat_multiset.h:62
ETL_CONSTEXPR17 etl::enable_if<!etl::is_same< T, etl::nullptr_t >::value, T >::type * addressof(T &t)
Definition addressof.h:52
etl::enable_if< etl::is_trivially_destructible< T >::value, void >::type destroy_at(T *)
Definition memory.h:1511
T * allocate()
Definition ipool.h:333
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