31#ifndef ETL_FLAT_MULTISET_INCLUDED
32#define ETL_FLAT_MULTISET_INCLUDED
59 template <
typename T,
typename TKeyCompare = etl::less<T> >
68 typedef const T& key_parameter_t;
74 typedef TKeyCompare key_compare;
75 typedef value_type& reference;
76 typedef const value_type& const_reference;
78 typedef value_type&& rvalue_reference;
80 typedef value_type* pointer;
81 typedef const value_type* const_pointer;
82 typedef size_t size_type;
87 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
88 typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
89 typedef typename etl::iterator_traits<iterator>::difference_type difference_type;
178 const_reverse_iterator
rend()
const
196 const_reverse_iterator
crend()
const
208 template <
typename TIterator>
209 void assign(TIterator first, TIterator last)
211#if ETL_IS_DEBUG_BUILD
212 difference_type d = etl::distance(first, last);
218 while (first != last)
230 ETL_OR_STD::pair<iterator, bool>
insert(const_reference value)
232 ETL_OR_STD::pair<iterator, bool> result(
end(),
false);
238 value_type* pvalue = storage.
allocate<value_type>();
239 ::new (pvalue) value_type(value);
240 ETL_INCREMENT_DEBUG_COUNT
252 ETL_OR_STD::pair<iterator, bool>
insert(rvalue_reference value)
254 ETL_OR_STD::pair<iterator, bool> result(
end(),
false);
260 value_type* pvalue = storage.
allocate<value_type>();
261 ::new (pvalue) value_type(etl::move(value));
262 ETL_INCREMENT_DEBUG_COUNT
277 return insert(value).first;
289 return insert(etl::move(value)).first;
300 template <
class TIterator>
301 void insert(TIterator first, TIterator last)
303 while (first != last)
313 template <
typename T1>
314 ETL_OR_STD::pair<iterator, bool>
emplace(const_reference value)
322#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT
323 template <
typename ... Args>
324 ETL_OR_STD::pair<iterator, bool>
emplace(Args && ... args)
329 value_type* pvalue = storage.
allocate<value_type>();
330 ::new (pvalue) value_type(etl::forward<Args>(args)...);
334 ETL_INCREMENT_DEBUG_COUNT
341 template <
typename T1>
342 ETL_OR_STD::pair<iterator, bool>
emplace(
const T1& value1)
347 value_type* pvalue = storage.
allocate<value_type>();
348 ::new (pvalue) value_type(value1);
352 ETL_INCREMENT_DEBUG_COUNT
359 template <
typename T1,
typename T2>
360 ETL_OR_STD::pair<iterator, bool>
emplace(
const T1& value1,
const T2& value2)
365 value_type* pvalue = storage.
allocate<value_type>();
366 ::new (pvalue) value_type(value1, value2);
370 ETL_INCREMENT_DEBUG_COUNT
377 template <
typename T1,
typename T2,
typename T3>
378 ETL_OR_STD::pair<iterator, bool>
emplace(
const T1& value1,
const T2& value2,
const T3& value3)
383 value_type* pvalue = storage.
allocate<value_type>();
384 ::new (pvalue) value_type(value1, value2, value3);
388 ETL_INCREMENT_DEBUG_COUNT
395 template <
typename T1,
typename T2,
typename T3,
typename T4>
396 ETL_OR_STD::pair<iterator, bool>
emplace(
const T1& value1,
const T2& value2,
const T3& value3,
const T4& value4)
401 value_type* pvalue = storage.
allocate<value_type>();
402 ::new (pvalue) value_type(value1, value2, value3, value4);
406 ETL_INCREMENT_DEBUG_COUNT
418 ETL_OR_STD::pair<iterator, iterator> range =
equal_range(key);
420 if (range.first ==
end())
426 size_t d = etl::distance(range.first, range.second);
427 erase(range.first, range.second);
434 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
435 size_t erase(K&& key)
437 ETL_OR_STD::pair<iterator, iterator> range =
equal_range(etl::forward<K>(key));
439 if (range.first ==
end())
445 size_t d = etl::distance(range.first, range.second);
446 erase(range.first, range.second);
460 ETL_DECREMENT_DEBUG_COUNT
472 ETL_DECREMENT_DEBUG_COUNT
492 ETL_DECREMENT_DEBUG_COUNT
519 ETL_RESET_DEBUG_COUNT
535 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
554 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
555 const_iterator
find(
const K& key)
const
566 size_t count(key_parameter_t key)
const
573 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
574 size_t count(
const K& key)
const
592 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
611 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
630 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
649 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
661 ETL_OR_STD::pair<iterator, iterator>
equal_range(key_parameter_t key)
668 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
669 ETL_OR_STD::pair<iterator, iterator>
equal_range(
const K& key)
680 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(key_parameter_t key)
const
687 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
688 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(
const K& key)
const
704 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
730 move_container(etl::move(rhs));
816 while (first != last)
821 this->
insert(etl::move(*first));
838 ETL_DECLARE_DEBUG_COUNT
843#if defined(ETL_POLYMORPHIC_FLAT_MULTISET) || defined(ETL_POLYMORPHIC_CONTAINERS)
863 template <
typename T,
typename TKeyCompare>
876 template <
typename T,
typename TKeyCompare>
879 return !(lhs == rhs);
889 template <
typename T, const
size_t MAX_SIZE_,
typename TCompare = etl::less<T> >
894 static ETL_CONSTANT
size_t MAX_SIZE = MAX_SIZE_;
922 this->move_container(etl::move(other));
933 template <
typename TIterator>
937 this->
assign(first, last);
940#if ETL_HAS_INITIALIZER_LIST
947 this->
assign(init.begin(), init.end());
980 this->move_container(etl::move(rhs));
989 typedef typename etl::iflat_multiset<T, TCompare>::value_type node_t;
998 template <
typename T,const
size_t MAX_SIZE_,
typename TCompare>
999 ETL_CONSTANT
size_t flat_multiset<T, MAX_SIZE_, TCompare>::MAX_SIZE;
1004#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
1005 template <
typename... T>
1006 flat_multiset(T...) -> flat_multiset<etl::nth_type_t<0, T...>,
sizeof...(T)>;
1012#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
1013 template <
typename TKey,
typename TKeyCompare = etl::less<TKey>,
typename... T>
1014 constexpr auto make_flat_multiset(T&&... keys) ->
etl::flat_multiset<TKey,
sizeof...(T), TKeyCompare>
1016 return { {etl::forward<T>(keys)...} };
Definition: reference_flat_multiset.h:71
Definition: reference_flat_multiset.h:204
Definition: reference_flat_multiset.h:121
Definition: reference_flat_multiset.h:101
iterator upper_bound(parameter_t key)
Definition: reference_flat_multiset.h:736
size_t count(parameter_t key) const
Definition: reference_flat_multiset.h:675
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
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
reverse_iterator rend()
Definition: reference_flat_multiset.h:382
size_t available() const
Definition: reference_flat_multiset.h:864
iterator find(parameter_t key)
Definition: reference_flat_multiset.h:581
size_type size() const
Definition: reference_flat_multiset.h:819
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
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
size_type max_size() const
Definition: reference_flat_multiset.h:855
const_iterator cbegin() const
Definition: reference_flat_multiset.h:346
#define ETL_ASSERT(b, e)
Definition: error_handler.h:316
void clear()
Clears the flat_multiset.
Definition: flat_multiset.h:501
ETL_OR_STD::pair< iterator, iterator > equal_range(key_parameter_t key)
Definition: flat_multiset.h:661
const_reverse_iterator crbegin() const
Definition: flat_multiset.h:187
ETL_OR_STD::pair< const_iterator, const_iterator > equal_range(key_parameter_t key) const
Definition: flat_multiset.h:680
const_iterator end() const
Definition: flat_multiset.h:124
iterator erase(const_iterator i_element)
Definition: flat_multiset.h:468
const_reverse_iterator rbegin() const
Definition: flat_multiset.h:160
const_reverse_iterator rend() const
Definition: flat_multiset.h:178
iterator erase(iterator i_element)
Definition: flat_multiset.h:456
flat_multiset()
Constructor.
Definition: flat_multiset.h:899
iflat_multiset(lookup_t &lookup_, storage_t &storage_)
Constructor.
Definition: flat_multiset.h:795
iterator begin()
Definition: flat_multiset.h:97
void insert(TIterator first, TIterator last)
Definition: flat_multiset.h:301
ETL_OR_STD::pair< iterator, bool > insert(const_reference value)
Definition: flat_multiset.h:230
const_iterator cend() const
Definition: flat_multiset.h:142
iterator erase(const_iterator first, const_iterator last)
Definition: flat_multiset.h:483
iterator lower_bound(key_parameter_t key)
Definition: flat_multiset.h:585
void assign(TIterator first, TIterator last)
Definition: flat_multiset.h:209
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:396
~iflat_multiset()
Internal debugging.
Definition: flat_multiset.h:850
iterator find(key_parameter_t key)
Definition: flat_multiset.h:528
const_iterator find(key_parameter_t key) const
Definition: flat_multiset.h:547
bool contains(key_parameter_t key) const
Check if the map contains the key.
Definition: flat_multiset.h:697
const_iterator lower_bound(key_parameter_t key) const
Definition: flat_multiset.h:604
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:378
size_t count(key_parameter_t key) const
Definition: flat_multiset.h:566
reverse_iterator rend()
Definition: flat_multiset.h:169
bool empty() const
Definition: flat_multiset.h:749
~flat_multiset()
Destructor.
Definition: flat_multiset.h:954
const_reverse_iterator crend() const
Definition: flat_multiset.h:196
flat_multiset(TIterator first, TIterator last)
Definition: flat_multiset.h:934
size_type max_size() const
Definition: flat_multiset.h:776
ETL_OR_STD::pair< iterator, bool > emplace(const_reference value)
Emplaces a value to the set.
Definition: flat_multiset.h:314
const_iterator upper_bound(key_parameter_t key) const
Definition: flat_multiset.h:642
ETL_OR_STD::pair< iterator, bool > emplace(const T1 &value1)
Emplaces a value to the set.
Definition: flat_multiset.h:342
size_type capacity() const
Definition: flat_multiset.h:767
flat_multiset & operator=(const flat_multiset &rhs)
Assignment operator.
Definition: flat_multiset.h:962
iterator end()
Definition: flat_multiset.h:115
const_iterator begin() const
Definition: flat_multiset.h:106
const_iterator cbegin() const
Definition: flat_multiset.h:133
reverse_iterator rbegin()
Definition: flat_multiset.h:151
bool full() const
Definition: flat_multiset.h:758
size_t erase(key_parameter_t key)
Definition: flat_multiset.h:416
iterator upper_bound(key_parameter_t key)
Definition: flat_multiset.h:623
size_type size() const
Definition: flat_multiset.h:740
ETL_OR_STD::pair< iterator, bool > emplace(const T1 &value1, const T2 &value2)
Emplaces a value to the set.
Definition: flat_multiset.h:360
size_t available() const
Definition: flat_multiset.h:785
flat_multiset(const flat_multiset &other)
Copy constructor.
Definition: flat_multiset.h:907
iterator insert(const_iterator, const_reference value)
Definition: flat_multiset.h:275
iflat_multiset & operator=(const iflat_multiset &rhs)
Assignment operator.
Definition: flat_multiset.h:714
Definition: flat_multiset.h:891
Definition: flat_multiset.h:61
etl::enable_if< etl::is_trivially_destructible< T >::value, void >::type destroy_at(T *)
Definition: memory.h:1006
ETL_CONSTEXPR17 T * addressof(T &t)
Definition: addressof.h:51
void release_all()
Release all objects in the pool.
Definition: ipool.h:248
T * allocate()
Definition: ipool.h:113
void release(const void *const p_object)
Definition: ipool.h:239
bitset_ext
Definition: absolute.h:38
bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:645
bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:633
Definition: type_traits_generator.h:2055
iterator
Definition: iterator.h:399