31#ifndef ETL_UNORDERED_MULTISET_INCLUDED
32#define ETL_UNORDERED_MULTISET_INCLUDED
74 unordered_multiset_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
88 unordered_multiset_full(string_type file_name_, numeric_type line_number_)
102 unordered_multiset_out_of_range(string_type file_name_, numeric_type line_number_)
115 unordered_multiset_iterator(string_type file_name_, numeric_type line_number_)
126 template <
typename TKey,
typename THash = etl::hash<TKey>,
typename TKeyEqual = etl::equal_to<TKey> >
131 typedef TKey value_type;
132 typedef TKey key_type;
133 typedef THash hasher;
134 typedef TKeyEqual key_equal;
135 typedef value_type& reference;
136 typedef const value_type& const_reference;
138 typedef value_type&& rvalue_reference;
140 typedef value_type* pointer;
141 typedef const value_type* const_pointer;
142 typedef size_t size_type;
144 typedef const TKey& key_parameter_t;
150 struct node_t :
public link_t
152 node_t(const_reference key_)
160 friend bool operator ==(
const node_t& lhs,
const node_t& rhs)
162 return (lhs.key == rhs.key);
165 friend bool operator !=(
const node_t& lhs,
const node_t& rhs)
167 return !(lhs == rhs);
178 typedef typename bucket_t::iterator local_iterator;
179 typedef typename bucket_t::const_iterator const_local_iterator;
182 class iterator :
public etl::iterator<ETL_OR_STD::forward_iterator_tag, TKey>
186 typedef typename etl::iterator<ETL_OR_STD::forward_iterator_tag, TKey>::value_type value_type;
187 typedef typename iunordered_multiset::key_type key_type;
188 typedef typename iunordered_multiset::hasher hasher;
189 typedef typename iunordered_multiset::key_equal key_equal;
190 typedef typename iunordered_multiset::reference reference;
191 typedef typename iunordered_multiset::const_reference const_reference;
192 typedef typename iunordered_multiset::pointer pointer;
193 typedef typename iunordered_multiset::const_pointer const_pointer;
194 typedef typename iunordered_multiset::size_type size_type;
196 friend class iunordered_multiset;
197 friend class const_iterator;
205 iterator(
const iterator& other)
206 : pbuckets_end(other.pbuckets_end)
207 , pbucket(other.pbucket)
213 iterator& operator ++()
218 if (inode == pbucket->end())
222 while ((pbucket != pbuckets_end) && (pbucket->empty()))
228 if (pbucket != pbuckets_end)
230 inode = pbucket->begin();
238 iterator operator ++(
int)
240 iterator temp(*
this);
246 iterator& operator =(
const iterator& other)
248 pbuckets_end = other.pbuckets_end;
249 pbucket = other.pbucket;
255 reference operator *()
const
261 pointer operator &()
const
263 return &(inode->key);
267 pointer operator ->()
const
269 return &(inode->key);
273 friend bool operator == (
const iterator& lhs,
const iterator& rhs)
275 return lhs.compare(rhs);
279 friend bool operator != (
const iterator& lhs,
const iterator& rhs)
281 return !(lhs == rhs);
287 iterator(bucket_t* pbuckets_end_, bucket_t* pbucket_, local_iterator inode_)
288 : pbuckets_end(pbuckets_end_)
295 bool compare(
const iterator& rhs)
const
297 return rhs.inode == inode;
301 bucket_t& get_bucket()
307 bucket_t*& get_bucket_list_iterator()
313 local_iterator get_local_iterator()
318 bucket_t* pbuckets_end;
320 local_iterator inode;
324 class const_iterator :
public etl::iterator<ETL_OR_STD::forward_iterator_tag, const TKey>
328 typedef typename etl::iterator<ETL_OR_STD::forward_iterator_tag, const TKey>::value_type value_type;
329 typedef typename iunordered_multiset::key_type key_type;
330 typedef typename iunordered_multiset::hasher hasher;
331 typedef typename iunordered_multiset::key_equal key_equal;
332 typedef typename iunordered_multiset::reference reference;
333 typedef typename iunordered_multiset::const_reference const_reference;
334 typedef typename iunordered_multiset::pointer pointer;
335 typedef typename iunordered_multiset::const_pointer const_pointer;
336 typedef typename iunordered_multiset::size_type size_type;
338 friend class iunordered_multiset;
339 friend class iterator;
348 : pbuckets_end(other.pbuckets_end)
349 , pbucket(other.pbucket)
355 const_iterator(
const const_iterator& other)
356 : pbuckets_end(other.pbuckets_end)
357 , pbucket(other.pbucket)
363 const_iterator& operator ++()
368 if (inode == pbucket->end())
373 while ((pbucket != pbuckets_end) && (pbucket->empty()))
379 if (pbucket != pbuckets_end)
381 inode = pbucket->begin();
389 const_iterator operator ++(
int)
391 const_iterator temp(*
this);
397 const_iterator& operator =(
const const_iterator& other)
399 pbuckets_end = other.pbuckets_end;
400 pbucket = other.pbucket;
406 const_reference operator *()
const
412 const_pointer operator &()
const
414 return &(inode->key);
418 const_pointer operator ->()
const
420 return &(inode->key);
424 friend bool operator == (
const const_iterator& lhs,
const const_iterator& rhs)
426 return lhs.compare(rhs);
430 friend bool operator != (
const const_iterator& lhs,
const const_iterator& rhs)
432 return !(lhs == rhs);
438 const_iterator(bucket_t* pbuckets_end_, bucket_t* pbucket_, local_iterator inode_)
439 : pbuckets_end(pbuckets_end_)
446 bool compare(
const const_iterator& rhs)
const
448 return rhs.inode == inode;
452 bucket_t& get_bucket()
458 bucket_t*& get_bucket_list_iterator()
464 local_iterator get_local_iterator()
469 bucket_t* pbuckets_end;
471 local_iterator inode;
474 typedef typename etl::iterator_traits<iterator>::difference_type difference_type;
482 return iterator((pbuckets + number_of_buckets), first, first->begin());
491 return const_iterator((pbuckets + number_of_buckets), first, first->begin());
500 return const_iterator((pbuckets + number_of_buckets), first, first->begin());
509 return pbuckets[i].begin();
516 const_local_iterator
begin(
size_t i)
const
518 return pbuckets[i].cbegin();
525 const_local_iterator
cbegin(
size_t i)
const
527 return pbuckets[i].cbegin();
536 return iterator((pbuckets + number_of_buckets), last, last->end());
543 const_iterator
end()
const
545 return const_iterator((pbuckets + number_of_buckets), last, last->end());
554 return const_iterator((pbuckets + number_of_buckets), last, last->end());
561 local_iterator
end(
size_t i)
563 return pbuckets[i].end();
570 const_local_iterator
end(
size_t i)
const
572 return pbuckets[i].cend();
579 const_local_iterator
cend(
size_t i)
const
581 return pbuckets[i].cend();
590 return key_hash_function(key) % number_of_buckets;
598 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
601 return key_hash_function(key) % number_of_buckets;
611 size_t index = bucket(key);
613 return etl::distance(pbuckets[index].
begin(), pbuckets[index].
end());
621 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
624 size_t index = bucket(key);
626 return etl::distance(pbuckets[index].
begin(), pbuckets[index].
end());
636 return number_of_buckets;
645 return number_of_buckets;
655 template <
typename TIterator>
656 void assign(TIterator first_, TIterator last_)
658#if ETL_IS_DEBUG_BUILD
659 difference_type d = etl::distance(first_, last_);
666 while (first_ != last_)
678 ETL_OR_STD::pair<iterator, bool>
insert(const_reference key)
680 ETL_OR_STD::pair<iterator, bool> result(
end(),
false);
688 bucket_t* pbucket = pbuckets + index;
689 bucket_t& bucket = *pbucket;
695 node_t* node = allocate_data_node();
697 ::new (&node->key) value_type(key);
698 ETL_INCREMENT_DEBUG_COUNT;
702 adjust_first_last_markers_after_insert(&bucket);
704 result.first = iterator((pbuckets + number_of_buckets), pbucket, pbucket->
begin());
705 result.second =
true;
711 local_iterator inode = bucket.
begin();
713 while (inode != bucket.
end())
716 if (key_equal_function(inode->key, key))
726 node_t* node = allocate_data_node();
728 ::new (&node->key) value_type(key);
729 ETL_INCREMENT_DEBUG_COUNT;
733 adjust_first_last_markers_after_insert(&bucket);
736 result.first = iterator((pbuckets + number_of_buckets), pbucket, inode_previous);
737 result.second =
true;
749 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
750 ETL_OR_STD::pair<iterator, bool>
insert(
const K& key)
752 ETL_OR_STD::pair<iterator, bool> result(
end(),
false);
760 bucket_t* pbucket = pbuckets + index;
761 bucket_t& bucket = *pbucket;
767 node_t* node = allocate_data_node();
770 ETL_INCREMENT_DEBUG_COUNT;
773 bucket.insert_after(bucket.before_begin(), *node);
774 adjust_first_last_markers_after_insert(&bucket);
776 result.first =
iterator((pbuckets + number_of_buckets), pbucket, pbucket->
begin());
777 result.second = true;
782 local_iterator inode_previous = bucket.before_begin();
783 local_iterator inode = bucket.begin();
785 while (inode != bucket.end())
788 if (key_equal_function(inode->key, key))
798 node_t* node = allocate_data_node();
800 ::new (&node->key) value_type(key);
801 ETL_INCREMENT_DEBUG_COUNT;
804 bucket.insert_after(inode_previous, *node);
805 adjust_first_last_markers_after_insert(&bucket);
808 result.first = iterator((pbuckets + number_of_buckets), pbucket, inode_previous);
809 result.second = true;
822 ETL_OR_STD::pair<iterator, bool>
insert(rvalue_reference key)
824 ETL_OR_STD::pair<iterator, bool> result(
end(),
false);
832 bucket_t* pbucket = pbuckets + index;
833 bucket_t& bucket = *pbucket;
839 node_t* node = allocate_data_node();
841 ::new (&node->key) value_type(
etl::move(key));
842 ETL_INCREMENT_DEBUG_COUNT;
845 bucket.insert_after(bucket.before_begin(), *node);
846 adjust_first_last_markers_after_insert(&bucket);
848 result.first = iterator((pbuckets + number_of_buckets), pbucket, pbucket->
begin());
849 result.second = true;
854 local_iterator inode_previous = bucket.before_begin();
855 local_iterator inode = bucket.begin();
857 while (inode != bucket.end())
860 if (key_equal_function(inode->key, key))
870 node_t* node = allocate_data_node();
872 ::new (&node->key) value_type(etl::move(key));
873 ETL_INCREMENT_DEBUG_COUNT;
876 bucket.insert_after(inode_previous, *node);
877 adjust_first_last_markers_after_insert(&bucket);
880 result.first =
iterator((pbuckets + number_of_buckets), pbucket, inode_previous);
881 result.second = true;
894 iterator
insert(const_iterator , const_reference key)
906 template <
class TIterator>
907 void insert(TIterator first_, TIterator last_)
909 while (first_ != last_)
926 bucket_t& bucket = pbuckets[bucket_id];
929 local_iterator icurrent = bucket.
begin();
931 while (icurrent != bucket.
end())
933 if (key_equal_function(icurrent->key, key))
935 delete_data_node(iprevious, icurrent, bucket);
937 icurrent = iprevious;
956 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
957 size_t erase(
const K& key)
962 bucket_t& bucket = pbuckets[bucket_id];
965 local_iterator icurrent = bucket.begin();
967 while (icurrent != bucket.end())
969 if (key_equal_function(icurrent->key, key))
971 delete_data_node(iprevious, icurrent, bucket);
973 icurrent = iprevious;
991 iterator
erase(const_iterator ielement)
994 iterator inext((pbuckets + number_of_buckets), ielement.get_bucket_list_iterator(), ielement.get_local_iterator());
997 bucket_t& bucket = ielement.get_bucket();
999 local_iterator icurrent = ielement.get_local_iterator();
1002 while (iprevious->etl_next != &*icurrent)
1007 delete_data_node(iprevious, icurrent, bucket);
1019 iterator
erase(const_iterator first_, const_iterator last_)
1022 if ((first_ ==
begin()) && (last_ ==
end()))
1029 bucket_t* pbucket = first_.get_bucket_list_iterator();
1030 bucket_t* pend_bucket = last_.get_bucket_list_iterator();
1032 local_iterator icurrent = first_.get_local_iterator();
1033 local_iterator iend = last_.get_local_iterator();
1036 while (iprevious->etl_next != &*icurrent)
1042 iterator ibefore_erased = iterator((pbuckets + number_of_buckets), pbucket, iprevious);
1045 while ((icurrent != iend) || (pbucket != pend_bucket))
1047 icurrent = delete_data_node(iprevious, icurrent, *pbucket);
1050 if ((icurrent != iend) || (pbucket != pend_bucket))
1053 if ((icurrent == pbucket->
end()))
1059 }
while (pbucket->
empty());
1062 icurrent = pbucket->
begin();
1067 return ++ibefore_erased;
1086 const_iterator f =
find(key);
1087 const_iterator l = f;
1094 while ((l !=
end()) && key_equal_function(key, *l))
1110 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
1111 size_t count(
const K& key)
const
1122 while ((l !=
end()) && key_equal_function(key, *l))
1142 bucket_t* pbucket = pbuckets + index;
1143 bucket_t& bucket = *pbucket;
1146 if (!bucket.
empty())
1149 local_iterator inode = bucket.
begin();
1150 local_iterator iend = bucket.
end();
1152 while (inode != iend)
1155 if (key_equal_function(key, inode->key))
1157 return iterator((pbuckets + number_of_buckets), pbucket, inode);
1173 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
1178 bucket_t* pbucket = pbuckets + index;
1179 bucket_t& bucket = *pbucket;
1182 if (!bucket.empty())
1185 local_iterator inode = bucket.begin();
1186 local_iterator iend = bucket.end();
1188 while (inode != iend)
1191 if (key_equal_function(key, inode->key))
1193 return iterator((pbuckets + number_of_buckets), pbucket, inode);
1209 const_iterator
find(key_parameter_t key)
const
1213 bucket_t* pbucket = pbuckets + index;
1214 bucket_t& bucket = *pbucket;
1217 if (!bucket.
empty())
1220 local_iterator inode = bucket.
begin();
1221 local_iterator iend = bucket.
end();
1223 while (inode != iend)
1226 if (key_equal_function(key, inode->key))
1228 return iterator((pbuckets + number_of_buckets), pbucket, inode);
1244 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
1249 bucket_t* pbucket = pbuckets + index;
1250 bucket_t& bucket = *pbucket;
1253 if (!bucket.empty())
1256 local_iterator inode = bucket.begin();
1257 local_iterator iend = bucket.end();
1259 while (inode != iend)
1262 if (key_equal_function(key, inode->key))
1264 return iterator((pbuckets + number_of_buckets), pbucket, inode);
1285 iterator f =
find(key);
1292 while ((l !=
end()) && key_equal_function(key, *l))
1298 return ETL_OR_STD::pair<iterator, iterator>(f, l);
1310 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
1311 ETL_OR_STD::pair<iterator, iterator>
equal_range(
const K& key)
1320 while ((l !=
end()) && key_equal_function(key, *l))
1326 return ETL_OR_STD::pair<iterator, iterator>(f, l);
1338 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(key_parameter_t key)
const
1340 const_iterator f =
find(key);
1341 const_iterator l = f;
1347 while ((l !=
end()) && key_equal_function(key, *l))
1353 return ETL_OR_STD::pair<const_iterator, const_iterator>(f, l);
1365 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
1366 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(
const K& key)
const
1375 while ((l !=
end()) && key_equal_function(key, *l))
1381 return ETL_OR_STD::pair<const_iterator, const_iterator>(f, l);
1390 return pnodepool->size();
1398 return pnodepool->max_size();
1406 return pnodepool->max_size();
1414 return pnodepool->empty();
1422 return pnodepool->full();
1431 return pnodepool->available();
1449 return key_hash_function;
1458 return key_equal_function;
1470 key_equal_function = rhs.
key_eq();
1487 key_hash_function = rhs.hash_function();
1488 key_equal_function = rhs.key_eq();
1489 move(rhs.begin(), rhs.end());
1508 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
1520 iunordered_multiset(pool_t& node_pool_, bucket_t* pbuckets_,
size_t number_of_buckets_, hasher key_hash_function_, key_equal key_equal_function_)
1521 : pnodepool(&node_pool_)
1522 , pbuckets(pbuckets_)
1523 , number_of_buckets(number_of_buckets_)
1526 , key_hash_function(key_hash_function_)
1527 , key_equal_function(key_equal_function_)
1539 for (
size_t i = 0UL; i < number_of_buckets; ++i)
1541 bucket_t& bucket = pbuckets[i];
1543 if (!bucket.
empty())
1546 local_iterator it = bucket.
begin();
1548 while (it != bucket.
end())
1551 it->key.~value_type();
1553 ETL_DECREMENT_DEBUG_COUNT;
1562 pnodepool->release_all();
1590 node_t* allocate_data_node()
1593 return (pnodepool->*func)();
1599 void adjust_first_last_markers_after_insert(bucket_t* pbucket)
1608 if (pbucket < first)
1612 else if (pbucket > last)
1622 void adjust_first_last_markers_after_erase(bucket_t* pbucket)
1631 if (pbucket == first)
1634 while (first->empty())
1639 else if (pbucket == last)
1643 bucket_t* pend = last;
1647 while (pbucket != pend)
1649 if (!pbucket->empty())
1663 local_iterator delete_data_node(local_iterator iprevious, local_iterator icurrent, bucket_t& bucket)
1665 local_iterator inext = bucket.erase_after(iprevious);
1666 icurrent->key.~value_type();
1667 pnodepool->release(&*icurrent);
1668 adjust_first_last_markers_after_erase(&bucket);
1669 ETL_DECREMENT_DEBUG_COUNT;
1684 const size_t number_of_buckets;
1691 hasher key_hash_function;
1694 key_equal key_equal_function;
1697 ETL_DECLARE_DEBUG_COUNT;
1702#if defined(ETL_POLYMORPHIC_UNORDERED_MULTISET) || defined(ETL_POLYMORPHIC_CONTAINERS)
1722 template <
typename TKey,
typename THash,
typename TKeyEqual>
1726 const bool sizes_match = (lhs.
size() == rhs.
size());
1727 bool elements_match =
true;
1733 itr_t l_begin = lhs.
begin();
1734 itr_t l_end = lhs.
end();
1736 while ((l_begin != l_end) && elements_match)
1738 const TKey l_value = *l_begin;
1741 ETL_OR_STD::pair<itr_t, itr_t> l_range = lhs.
equal_range(l_value);
1742 ETL_OR_STD::pair<itr_t, itr_t> r_range = rhs.
equal_range(l_value);
1744 if (r_range.first != rhs.
end())
1746 bool distance_match = (etl::distance(l_range.first, l_range.second) == etl::distance(r_range.first, r_range.second));
1750 elements_match =
etl::is_permutation(l_range.first, l_range.second, r_range.first, r_range.second);
1754 elements_match =
false;
1759 elements_match =
false;
1766 return (sizes_match && elements_match);
1776 template <
typename TKey,
typename THash,
typename TKeyEqual>
1780 return !(lhs == rhs);
1786 template <
typename TKey, const
size_t MAX_SIZE_,
size_t MAX_BUCKETS_ = MAX_SIZE_,
typename THash = etl::hash<TKey>,
typename TKeyEqual = etl::equal_to<TKey> >
1795 static ETL_CONSTANT
size_t MAX_SIZE = MAX_SIZE_;
1796 static ETL_CONSTANT
size_t MAX_BUCKETS = MAX_BUCKETS_;
1803 : base(node_pool, buckets, MAX_BUCKETS, hash, equal)
1826 : base(node_pool, buckets, MAX_BUCKETS, other.hash_function(), other.key_eq())
1831 base::move(other.begin(), other.end());
1842 template <
typename TIterator>
1843 unordered_multiset(TIterator first_, TIterator last_,
const THash& hash = THash(),
const TKeyEqual& equal = TKeyEqual())
1844 : base(node_pool, buckets, MAX_BUCKETS, hash, equal)
1849#if ETL_HAS_INITIALIZER_LIST
1853 unordered_multiset(std::initializer_list<TKey> init,
const THash& hash = THash(),
const TKeyEqual& equal = TKeyEqual())
1854 : base(node_pool, buckets, MAX_BUCKETS, hash, equal)
1856 base::assign(init.begin(), init.end());
1873 base::operator =(rhs);
1884 base::operator =(etl::move(rhs));
1896 typename base::bucket_t buckets[MAX_BUCKETS_];
1902#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
1903 template <
typename... T>
1904 unordered_multiset(T...) -> unordered_multiset<etl::nth_type_t<0, T...>,
sizeof...(T)>;
1910#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
1911 template <
typename TKey,
typename THash = etl::hash<TKey>,
typename TKeyEqual = etl::equal_to<TKey>,
typename... T>
1912 constexpr auto make_unordered_multiset(T&&... keys) -> etl::unordered_multiset<TKey,
sizeof...(T),
sizeof...(T), THash, TKeyEqual>
1914 return { etl::forward<T>(keys)... };
bool empty() const
Returns true if the list has no elements.
Definition intrusive_forward_list.h:242
void clear()
Clears the intrusive_forward_list.
Definition intrusive_forward_list.h:149
Definition intrusive_forward_list.h:447
iterator insert_after(iterator position, value_type &value)
Inserts a value to the intrusive_forward_list after the specified position.
Definition intrusive_forward_list.h:747
iterator end()
Gets the end of the intrusive_forward_list.
Definition intrusive_forward_list.h:707
iterator before_begin()
Gets before the beginning of the intrusive_forward_list.
Definition intrusive_forward_list.h:683
iterator begin()
Gets the beginning of the intrusive_forward_list.
Definition intrusive_forward_list.h:667
Definition unordered_multiset.h:325
Definition unordered_multiset.h:183
A templated unordered_multiset implementation that uses a fixed size buffer.
Definition unordered_multiset.h:1788
unordered_multiset(const THash &hash=THash(), const TKeyEqual &equal=TKeyEqual())
Default constructor.
Definition unordered_multiset.h:1802
~unordered_multiset()
Destructor.
Definition unordered_multiset.h:1863
unordered_multiset(const unordered_multiset &other)
Copy constructor.
Definition unordered_multiset.h:1810
unordered_multiset(TIterator first_, TIterator last_, const THash &hash=THash(), const TKeyEqual &equal=TKeyEqual())
Definition unordered_multiset.h:1843
ETL_CONSTEXPR14 bool operator==(const etl::expected< TValue, TError > &lhs, const etl::expected< TValue2, TError2 > &rhs)
Equivalence operators.
Definition expected.h:962
ETL_NODISCARD ETL_CONSTEXPR14 bool is_permutation(TIterator1 begin1, TIterator1 end1, TIterator2 begin2)
Definition algorithm.h:1847
#define ETL_ASSERT(b, e)
Definition error_handler.h:356
Definition exception.h:47
T * allocate()
Definition ipool.h:316
~iunordered_multiset()
Destructor.
Definition unordered_multiset.h:1709
ETL_OR_STD::pair< iterator, bool > insert(const_reference key)
Definition unordered_multiset.h:678
size_t available() const
Definition unordered_multiset.h:1429
const_iterator cend() const
Definition unordered_multiset.h:552
iunordered_multiset & operator=(const iunordered_multiset &rhs)
Assignment operator.
Definition unordered_multiset.h:1464
const_iterator begin() const
Definition unordered_multiset.h:489
size_t erase(key_parameter_t key)
Definition unordered_multiset.h:921
void initialise()
Initialise the unordered_multiset.
Definition unordered_multiset.h:1534
iterator end()
Definition unordered_multiset.h:534
size_type max_size() const
Gets the maximum possible size of the unordered_multiset.
Definition unordered_multiset.h:1396
iterator insert(const_iterator, const_reference key)
Definition unordered_multiset.h:894
const_local_iterator end(size_t i) const
Definition unordered_multiset.h:570
size_type get_bucket_index(key_parameter_t key) const
Definition unordered_multiset.h:588
ETL_OR_STD::pair< const_iterator, const_iterator > equal_range(key_parameter_t key) const
Definition unordered_multiset.h:1338
const_iterator find(key_parameter_t key) const
Definition unordered_multiset.h:1209
local_iterator begin(size_t i)
Definition unordered_multiset.h:507
void assign(TIterator first_, TIterator last_)
Definition unordered_multiset.h:656
const_iterator cbegin() const
Definition unordered_multiset.h:498
iunordered_multiset(pool_t &node_pool_, bucket_t *pbuckets_, size_t number_of_buckets_, hasher key_hash_function_, key_equal key_equal_function_)
Constructor.
Definition unordered_multiset.h:1520
const_iterator end() const
Definition unordered_multiset.h:543
size_type bucket_size(key_parameter_t key) const
Definition unordered_multiset.h:609
void insert(TIterator first_, TIterator last_)
Definition unordered_multiset.h:907
void clear()
Clears the unordered_multiset.
Definition unordered_multiset.h:1073
const_local_iterator cend(size_t i) const
Definition unordered_multiset.h:579
bool contains(key_parameter_t key) const
Check if the unordered_multiset contains the key.
Definition unordered_multiset.h:1499
iterator erase(const_iterator first_, const_iterator last_)
Definition unordered_multiset.h:1019
const_local_iterator cbegin(size_t i) const
Definition unordered_multiset.h:525
iterator find(key_parameter_t key)
Definition unordered_multiset.h:1138
iterator begin()
Definition unordered_multiset.h:480
iterator erase(const_iterator ielement)
Definition unordered_multiset.h:991
key_equal key_eq() const
Definition unordered_multiset.h:1456
local_iterator end(size_t i)
Definition unordered_multiset.h:561
const_local_iterator begin(size_t i) const
Definition unordered_multiset.h:516
size_type max_bucket_count() const
Definition unordered_multiset.h:634
size_type size() const
Gets the size of the unordered_multiset.
Definition unordered_multiset.h:1388
hasher hash_function() const
Definition unordered_multiset.h:1447
size_type bucket_count() const
Definition unordered_multiset.h:643
size_type capacity() const
Gets the maximum possible size of the unordered_multiset.
Definition unordered_multiset.h:1404
size_t count(key_parameter_t key) const
Definition unordered_multiset.h:1083
bool full() const
Checks to see if the unordered_multiset is full.
Definition unordered_multiset.h:1420
float load_factor() const
Definition unordered_multiset.h:1438
ETL_OR_STD::pair< iterator, iterator > equal_range(key_parameter_t key)
Definition unordered_multiset.h:1283
bool empty() const
Checks to see if the unordered_multiset is empty.
Definition unordered_multiset.h:1412
Definition unordered_multiset.h:128
Definition unordered_multiset.h:71
Definition unordered_multiset.h:85
Definition unordered_multiset.h:112
bitset_ext
Definition absolute.h:39
ETL_CONSTEXPR TContainer::iterator begin(TContainer &container)
Definition iterator.h:962
A forward link.
Definition intrusive_links.h:88
iterator
Definition iterator.h:399
Definition unordered_multiset.h:151