31#ifndef ETL_UNORDERED_MULTIMAP_INCLUDED
32#define ETL_UNORDERED_MULTIMAP_INCLUDED
73 unordered_multimap_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
87 unordered_multimap_full(string_type file_name_, numeric_type line_number_)
101 unordered_multimap_out_of_range(string_type file_name_, numeric_type line_number_)
115 unordered_multimap_iterator(string_type file_name_, numeric_type line_number_)
127 template <
typename TKey,
typename T,
typename THash = etl::hash<TKey>,
typename TKeyEqual = etl::equal_to<TKey> >
132 typedef ETL_OR_STD::pair<const TKey, T> value_type;
134 typedef TKey key_type;
135 typedef T mapped_type;
136 typedef THash hasher;
137 typedef TKeyEqual key_equal;
138 typedef value_type& reference;
139 typedef const value_type& const_reference;
141 typedef value_type&& rvalue_reference;
143 typedef value_type* pointer;
144 typedef const value_type* const_pointer;
145 typedef size_t size_type;
147 typedef const key_type& const_key_reference;
149 typedef key_type&& rvalue_key_reference;
156 struct node_t :
public link_t
158 node_t(const_reference key_value_pair_)
159 : key_value_pair(key_value_pair_)
163 value_type key_value_pair;
166 friend bool operator==(
const node_t& lhs,
const node_t& rhs)
168 return (lhs.key_value_pair.first == rhs.key_value_pair.first) && (lhs.key_value_pair.second == rhs.key_value_pair.second);
171 friend bool operator!=(
const node_t& lhs,
const node_t& rhs)
173 return !(lhs == rhs);
184 typedef typename bucket_t::iterator local_iterator;
185 typedef typename bucket_t::const_iterator const_local_iterator;
192 typedef typename etl::iterator<ETL_OR_STD::forward_iterator_tag, T>::value_type value_type;
193 typedef typename iunordered_multimap::key_type key_type;
194 typedef typename iunordered_multimap::mapped_type mapped_type;
195 typedef typename iunordered_multimap::hasher hasher;
196 typedef typename iunordered_multimap::key_equal key_equal;
197 typedef typename iunordered_multimap::reference reference;
198 typedef typename iunordered_multimap::const_reference const_reference;
199 typedef typename iunordered_multimap::pointer pointer;
200 typedef typename iunordered_multimap::const_pointer const_pointer;
201 typedef typename iunordered_multimap::size_type size_type;
203 friend class iunordered_multimap;
204 friend class const_iterator;
210 iterator(
const iterator& other)
211 : pbuckets_end(other.pbuckets_end)
212 , pbucket(other.pbucket)
218 iterator& operator++()
223 if (inode == pbucket->end())
227 while ((pbucket != pbuckets_end) && (pbucket->empty()))
233 if (pbucket != pbuckets_end)
235 inode = pbucket->begin();
243 iterator operator++(
int)
245 iterator temp(*
this);
251 iterator& operator=(
const iterator& other)
253 pbuckets_end = other.pbuckets_end;
254 pbucket = other.pbucket;
260 reference operator*()
const
262 return inode->key_value_pair;
266 pointer operator&()
const
268 return &(inode->key_value_pair);
272 pointer operator->()
const
274 return &(inode->key_value_pair);
278 friend bool operator==(
const iterator& lhs,
const iterator& rhs)
280 return lhs.compare(rhs);
284 friend bool operator!=(
const iterator& lhs,
const iterator& rhs)
286 return !(lhs == rhs);
292 iterator(bucket_t* pbuckets_end_, bucket_t* pbucket_, local_iterator inode_)
293 : pbuckets_end(pbuckets_end_)
300 bool compare(
const iterator& rhs)
const
302 return rhs.inode == inode;
306 bucket_t& get_bucket()
312 bucket_t*& get_bucket_list_iterator()
318 local_iterator get_local_iterator()
323 bucket_t* pbuckets_end;
325 local_iterator inode;
329 class const_iterator :
public etl::iterator<ETL_OR_STD::forward_iterator_tag, const T>
333 typedef typename etl::iterator<ETL_OR_STD::forward_iterator_tag, const T>::value_type value_type;
334 typedef typename iunordered_multimap::key_type key_type;
335 typedef typename iunordered_multimap::mapped_type mapped_type;
336 typedef typename iunordered_multimap::hasher hasher;
337 typedef typename iunordered_multimap::key_equal key_equal;
338 typedef typename iunordered_multimap::reference reference;
339 typedef typename iunordered_multimap::const_reference const_reference;
340 typedef typename iunordered_multimap::pointer pointer;
341 typedef typename iunordered_multimap::const_pointer const_pointer;
342 typedef typename iunordered_multimap::size_type size_type;
344 friend class iunordered_multimap;
345 friend class iterator;
352 : pbuckets_end(other.pbuckets_end)
353 , pbucket(other.pbucket)
359 const_iterator(
const const_iterator& other)
360 : pbuckets_end(other.pbuckets_end)
361 , pbucket(other.pbucket)
367 const_iterator& operator++()
372 if (inode == pbucket->end())
377 while ((pbucket != pbuckets_end) && (pbucket->empty()))
383 if (pbucket != pbuckets_end)
385 inode = pbucket->begin();
393 const_iterator operator++(
int)
395 const_iterator temp(*
this);
401 const_iterator& operator=(
const const_iterator& other)
403 pbuckets_end = other.pbuckets_end;
404 pbucket = other.pbucket;
410 const_reference operator*()
const
412 return inode->key_value_pair;
416 const_pointer operator&()
const
418 return &(inode->key_value_pair);
422 const_pointer operator->()
const
424 return &(inode->key_value_pair);
428 friend bool operator==(
const const_iterator& lhs,
const const_iterator& rhs)
430 return lhs.compare(rhs);
434 friend bool operator!=(
const const_iterator& lhs,
const const_iterator& rhs)
436 return !(lhs == rhs);
442 const_iterator(bucket_t* pbuckets_end_, bucket_t* pbucket_, local_iterator inode_)
443 : pbuckets_end(pbuckets_end_)
450 bool compare(
const const_iterator& rhs)
const
452 return rhs.inode == inode;
456 bucket_t& get_bucket()
462 bucket_t*& get_bucket_list_iterator()
468 local_iterator get_local_iterator()
473 bucket_t* pbuckets_end;
475 local_iterator inode;
478 typedef typename etl::iterator_traits<iterator>::difference_type difference_type;
486 return iterator((pbuckets + number_of_buckets), first, first->begin());
495 return const_iterator((pbuckets + number_of_buckets), first, first->begin());
504 return const_iterator((pbuckets + number_of_buckets), first, first->begin());
513 return pbuckets[i].begin();
522 const_local_iterator
begin(
size_t i)
const
524 return pbuckets[i].cbegin();
533 const_local_iterator
cbegin(
size_t i)
const
535 return pbuckets[i].cbegin();
544 return iterator((pbuckets + number_of_buckets), last, last->end());
551 const_iterator
end()
const
553 return const_iterator((pbuckets + number_of_buckets), last, last->end());
562 return const_iterator((pbuckets + number_of_buckets), last, last->end());
569 local_iterator
end(
size_t i)
571 return pbuckets[i].end();
578 const_local_iterator
end(
size_t i)
const
580 return pbuckets[i].cend();
587 const_local_iterator
cend(
size_t i)
const
589 return pbuckets[i].cend();
598 return key_hash_function(key) % number_of_buckets;
606 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
609 return key_hash_function(key) % number_of_buckets;
619 size_t index = bucket(key);
621 return etl::distance(pbuckets[index].
begin(), pbuckets[index].
end());
629 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
632 size_t index = bucket(key);
634 return etl::distance(pbuckets[index].
begin(), pbuckets[index].
end());
644 return number_of_buckets;
653 return number_of_buckets;
665 template <
typename TIterator>
666 void assign(TIterator first_, TIterator last_)
668#if ETL_IS_DEBUG_BUILD
669 difference_type d = etl::distance(first_, last_);
676 while (first_ != last_)
689 iterator
insert(const_reference key_value_pair)
691 iterator result =
end();
695 const_key_reference key = key_value_pair.first;
701 bucket_t* pbucket = pbuckets + index;
702 bucket_t& bucket = *pbucket;
708 node_t* node = allocate_data_node();
710 ::new (&node->key_value_pair) value_type(key_value_pair);
711 ETL_INCREMENT_DEBUG_COUNT;
715 adjust_first_last_markers_after_insert(pbucket);
717 result = iterator((pbuckets + number_of_buckets), pbucket, pbucket->
begin());
723 local_iterator inode = bucket.
begin();
725 while (inode != bucket.
end())
728 if (key_equal_function(inode->key_value_pair.first, key))
738 node_t* node = allocate_data_node();
740 ::new (&node->key_value_pair) value_type(key_value_pair);
741 ETL_INCREMENT_DEBUG_COUNT;
745 adjust_first_last_markers_after_insert(&bucket);
748 result = iterator((pbuckets + number_of_buckets), pbucket, inode_previous);
767 const_key_reference key = key_value_pair.first;
773 bucket_t* pbucket = pbuckets + index;
774 bucket_t& bucket = *pbucket;
780 node_t* node = allocate_data_node();
782 ::new (&node->key_value_pair)
value_type(
etl::move(key_value_pair));
783 ETL_INCREMENT_DEBUG_COUNT;
786 bucket.insert_after(bucket.before_begin(), *node);
787 adjust_first_last_markers_after_insert(pbucket);
789 result =
iterator((pbuckets + number_of_buckets), pbucket, pbucket->
begin());
794 local_iterator inode_previous = bucket.before_begin();
795 local_iterator inode = bucket.begin();
797 while (inode != bucket.end())
800 if (key_equal_function(inode->key_value_pair.first, key))
810 node_t* node = allocate_data_node();
812 ::new (&node->key_value_pair) value_type(
etl::move(key_value_pair));
813 ETL_INCREMENT_DEBUG_COUNT;
816 bucket.insert_after(inode_previous, *node);
817 adjust_first_last_markers_after_insert(&bucket);
820 result = iterator((pbuckets + number_of_buckets), pbucket, inode_previous);
834 iterator
insert(const_iterator, const_reference key_value_pair)
836 return insert(key_value_pair);
849 return insert(etl::move(key_value_pair));
861 template <
class TIterator>
862 void insert(TIterator first_, TIterator last_)
864 while (first_ != last_)
876 size_t erase(const_key_reference key)
881 bucket_t& bucket = pbuckets[bucket_id];
884 local_iterator icurrent = bucket.
begin();
886 while (icurrent != bucket.
end())
888 if (key_equal_function(icurrent->key_value_pair.first, key))
890 delete_data_node(iprevious, icurrent, bucket);
892 icurrent = iprevious;
911 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
912 size_t erase(
const K& key)
917 bucket_t& bucket = pbuckets[bucket_id];
920 local_iterator icurrent = bucket.begin();
922 while (icurrent != bucket.end())
924 if (key_equal_function(icurrent->key_value_pair.first, key))
926 delete_data_node(iprevious, icurrent, bucket);
928 icurrent = iprevious;
946 iterator
erase(const_iterator ielement)
949 iterator inext((pbuckets + number_of_buckets), ielement.get_bucket_list_iterator(), ielement.get_local_iterator());
952 bucket_t& bucket = ielement.get_bucket();
954 local_iterator icurrent = ielement.get_local_iterator();
957 while (iprevious->etl_next != &*icurrent)
962 delete_data_node(iprevious, icurrent, bucket);
974 iterator
erase(const_iterator first_, const_iterator last_)
977 if ((first_ ==
begin()) && (last_ ==
end()))
984 bucket_t* pbucket = first_.get_bucket_list_iterator();
985 bucket_t* pend_bucket = last_.get_bucket_list_iterator();
987 local_iterator icurrent = first_.get_local_iterator();
988 local_iterator iend = last_.get_local_iterator();
992 while (iprevious->etl_next != &*icurrent)
998 iterator ibefore_erased = iterator((pbuckets + number_of_buckets), pbucket, iprevious);
1001 while ((icurrent != iend) || (pbucket != pend_bucket))
1003 icurrent = delete_data_node(iprevious, icurrent, *pbucket);
1006 if ((icurrent != iend) || (pbucket != pend_bucket))
1009 if ((icurrent == pbucket->
end()))
1014 }
while (pbucket->
empty());
1017 icurrent = pbucket->
begin();
1022 return ++ibefore_erased;
1038 size_t count(const_key_reference key)
const
1041 const_iterator f =
find(key);
1042 const_iterator l = f;
1049 while ((l !=
end()) && key_equal_function(key, l->first))
1065 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
1066 size_t count(
const K& key)
const
1077 while ((l !=
end()) && key_equal_function(key, l->first))
1093 iterator
find(const_key_reference key)
1097 bucket_t* pbucket = pbuckets + index;
1098 bucket_t& bucket = *pbucket;
1101 if (!bucket.
empty())
1104 local_iterator inode = bucket.
begin();
1105 local_iterator iend = bucket.
end();
1107 while (inode != iend)
1110 if (key_equal_function(key, inode->key_value_pair.first))
1112 return iterator((pbuckets + number_of_buckets), pbucket, inode);
1127 const_iterator
find(const_key_reference key)
const
1131 bucket_t* pbucket = pbuckets + index;
1132 bucket_t& bucket = *pbucket;
1135 if (!bucket.
empty())
1138 local_iterator inode = bucket.
begin();
1139 local_iterator iend = bucket.
end();
1141 while (inode != iend)
1144 if (key_equal_function(key, inode->key_value_pair.first))
1146 return const_iterator((pbuckets + number_of_buckets), pbucket, inode);
1162 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
1167 bucket_t* pbucket = pbuckets + index;
1168 bucket_t& bucket = *pbucket;
1171 if (!bucket.empty())
1174 local_iterator inode = bucket.begin();
1175 local_iterator iend = bucket.end();
1177 while (inode != iend)
1180 if (key_equal_function(key, inode->key_value_pair.first))
1182 return iterator((pbuckets + number_of_buckets), pbucket, inode);
1199 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
1204 bucket_t* pbucket = pbuckets + index;
1205 bucket_t& bucket = *pbucket;
1208 if (!bucket.empty())
1211 local_iterator inode = bucket.begin();
1212 local_iterator iend = bucket.end();
1214 while (inode != iend)
1217 if (key_equal_function(key, inode->key_value_pair.first))
1219 return const_iterator((pbuckets + number_of_buckets), pbucket, inode);
1239 ETL_OR_STD::pair<iterator, iterator>
equal_range(const_key_reference key)
1241 iterator f =
find(key);
1248 while ((l !=
end()) && key_equal_function(key, l->first))
1254 return ETL_OR_STD::pair<iterator, iterator>(f, l);
1266 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(const_key_reference key)
const
1268 const_iterator f =
find(key);
1269 const_iterator l = f;
1275 while ((l !=
end()) && key_equal_function(key, l->first))
1281 return ETL_OR_STD::pair<const_iterator, const_iterator>(f, l);
1294 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
1295 ETL_OR_STD::pair<iterator, iterator>
equal_range(
const K& key)
1304 while ((l !=
end()) && key_equal_function(key, l->first))
1310 return ETL_OR_STD::pair<iterator, iterator>(f, l);
1324 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
1325 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(
const K& key)
const
1334 while ((l !=
end()) && key_equal_function(key, l->first))
1340 return ETL_OR_STD::pair<const_iterator, const_iterator>(f, l);
1349 return pnodepool->size();
1357 return pnodepool->max_size();
1365 return pnodepool->max_size();
1373 return pnodepool->empty();
1381 return pnodepool->full();
1390 return pnodepool->available();
1408 return key_hash_function;
1417 return key_equal_function;
1429 key_equal_function = rhs.
key_eq();
1446 key_hash_function = rhs.hash_function();
1447 key_equal_function = rhs.key_eq();
1448 move(rhs.begin(), rhs.end());
1467 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
1479 iunordered_multimap(pool_t& node_pool_, bucket_t* pbuckets_,
size_t number_of_buckets_, hasher key_hash_function_, key_equal key_equal_function_)
1480 : pnodepool(&node_pool_)
1481 , pbuckets(pbuckets_)
1482 , number_of_buckets(number_of_buckets_)
1485 , key_hash_function(key_hash_function_)
1486 , key_equal_function(key_equal_function_)
1498 for (
size_t i = 0UL; i < number_of_buckets; ++i)
1500 bucket_t& bucket = pbuckets[i];
1502 if (!bucket.
empty())
1505 local_iterator it = bucket.
begin();
1507 while (it != bucket.
end())
1510 it->key_value_pair.~value_type();
1512 ETL_DECREMENT_DEBUG_COUNT;
1521 pnodepool->release_all();
1549 node_t* allocate_data_node()
1552 return (pnodepool->*func)();
1558 void adjust_first_last_markers_after_insert(bucket_t* pbucket)
1567 if (pbucket < first)
1571 else if (pbucket > last)
1581 void adjust_first_last_markers_after_erase(bucket_t* pbucket)
1590 if (pbucket == first)
1594 while (first->empty())
1599 else if (pbucket == last)
1604 bucket_t* pend = last;
1608 while (pbucket != pend)
1610 if (!pbucket->empty())
1624 local_iterator delete_data_node(local_iterator iprevious, local_iterator icurrent, bucket_t& bucket)
1626 local_iterator inext = bucket.erase_after(iprevious);
1627 icurrent->key_value_pair.~value_type();
1628 pnodepool->release(&*icurrent);
1629 adjust_first_last_markers_after_erase(&bucket);
1630 ETL_DECREMENT_DEBUG_COUNT;
1645 const size_t number_of_buckets;
1652 hasher key_hash_function;
1655 key_equal key_equal_function;
1658 ETL_DECLARE_DEBUG_COUNT;
1663#if defined(ETL_POLYMORPHIC_UNORDERED_MULTIMAP) || defined(ETL_POLYMORPHIC_CONTAINERS)
1683 template <
typename TKey,
typename T,
typename THash,
typename TKeyEqual>
1686 const bool sizes_match = (lhs.
size() == rhs.
size());
1687 bool elements_match =
true;
1693 itr_t l_begin = lhs.
begin();
1694 itr_t l_end = lhs.
end();
1696 while ((l_begin != l_end) && elements_match)
1698 const TKey key = l_begin->first;
1699 const T l_value = l_begin->second;
1702 ETL_OR_STD::pair<itr_t, itr_t> l_range = lhs.
equal_range(key);
1703 ETL_OR_STD::pair<itr_t, itr_t> r_range = rhs.
equal_range(key);
1705 if (r_range.first != rhs.
end())
1707 bool distance_match = (etl::distance(l_range.first, l_range.second) == etl::distance(r_range.first, r_range.second));
1711 elements_match =
etl::is_permutation(l_range.first, l_range.second, r_range.first, r_range.second);
1715 elements_match =
false;
1720 elements_match =
false;
1727 return (sizes_match && elements_match);
1737 template <
typename TKey,
typename T,
typename THash,
typename TKeyEqual>
1740 return !(lhs == rhs);
1747 template <
typename TKey,
typename TValue, const
size_t MAX_SIZE_, const
size_t MAX_BUCKETS_ = MAX_SIZE_,
typename THash = etl::hash<TKey>,
1748 typename TKeyEqual = etl::equal_to<TKey> >
1757 static ETL_CONSTANT
size_t MAX_SIZE = MAX_SIZE_;
1758 static ETL_CONSTANT
size_t MAX_BUCKETS = MAX_BUCKETS_;
1764 : base(node_pool, buckets, MAX_BUCKETS, hash, equal)
1786 : base(node_pool, buckets, MAX_BUCKETS, other.hash_function(), other.key_eq())
1791 base::move(other.begin(), other.end());
1802 template <
typename TIterator>
1803 unordered_multimap(TIterator first_, TIterator last_,
const THash& hash = THash(),
const TKeyEqual& equal = TKeyEqual())
1804 : base(node_pool, buckets, MAX_BUCKETS, hash, equal)
1809#if ETL_HAS_INITIALIZER_LIST
1813 unordered_multimap(std::initializer_list<ETL_OR_STD::pair<TKey, TValue>> init,
const THash& hash = THash(),
const TKeyEqual& equal = TKeyEqual())
1814 : base(node_pool, buckets, MAX_BUCKETS_, hash, equal)
1816 base::assign(init.begin(), init.end());
1844 base::operator=(etl::move(rhs));
1856 typename base::bucket_t buckets[MAX_BUCKETS_];
1862#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
1863 template <
typename... TPairs>
1864 unordered_multimap(TPairs...)
1865 -> unordered_multimap<
typename etl::nth_type_t<0, TPairs...>::first_type,
typename etl::nth_type_t<0, TPairs...>::second_type,
sizeof...(TPairs)>;
1871#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
1872 template <
typename TKey,
typename T,
typename THash = etl::hash<TKey>,
typename TKeyEqual = etl::equal_to<TKey>,
typename... TPairs>
1874 make_unordered_multimap(TPairs&&... pairs) -> etl::unordered_multimap<TKey, T,
sizeof...(TPairs),
sizeof...(TPairs), THash, TKeyEqual>
1876 return {etl::forward<TPairs>(pairs)...};
bool empty() const
Returns true if the list has no elements.
Definition intrusive_forward_list.h:250
void clear()
Clears the intrusive_forward_list.
Definition intrusive_forward_list.h:154
Definition intrusive_forward_list.h:457
iterator insert_after(iterator position, value_type &value)
Definition intrusive_forward_list.h:760
iterator end()
Gets the end of the intrusive_forward_list.
Definition intrusive_forward_list.h:713
iterator before_begin()
Gets before the beginning of the intrusive_forward_list.
Definition intrusive_forward_list.h:689
iterator begin()
Gets the beginning of the intrusive_forward_list.
Definition intrusive_forward_list.h:673
Definition unordered_multimap.h:330
Definition unordered_multimap.h:189
Definition unordered_multimap.h:1750
unordered_multimap(const unordered_multimap &other)
Copy constructor.
Definition unordered_multimap.h:1771
unordered_multimap & operator=(const unordered_multimap &rhs)
Assignment operator.
Definition unordered_multimap.h:1831
unordered_multimap(TIterator first_, TIterator last_, const THash &hash=THash(), const TKeyEqual &equal=TKeyEqual())
Definition unordered_multimap.h:1803
unordered_multimap(const THash &hash=THash(), const TKeyEqual &equal=TKeyEqual())
Default constructor.
Definition unordered_multimap.h:1763
~unordered_multimap()
Destructor.
Definition unordered_multimap.h:1823
ETL_NODISCARD ETL_CONSTEXPR14 bool is_permutation(TIterator1 begin1, TIterator1 end1, TIterator2 begin2)
Definition algorithm.h:1801
ETL_CONSTEXPR14 bool operator!=(const etl::bitset< Active_Bits, TElement > &lhs, const etl::bitset< Active_Bits, TElement > &rhs) ETL_NOEXCEPT
Definition bitset_new.h:2529
#define ETL_ASSERT(b, e)
Definition error_handler.h:511
Definition exception.h:59
T * allocate()
Definition ipool.h:333
iterator end()
Definition unordered_multimap.h:542
iunordered_multimap & operator=(const iunordered_multimap &rhs)
Assignment operator.
Definition unordered_multimap.h:1423
const_local_iterator cend(size_t i) const
Definition unordered_multimap.h:587
const_local_iterator cbegin(size_t i) const
Definition unordered_multimap.h:533
float load_factor() const
Definition unordered_multimap.h:1397
void assign(TIterator first_, TIterator last_)
Definition unordered_multimap.h:666
size_t available() const
Definition unordered_multimap.h:1388
const_local_iterator end(size_t i) const
Definition unordered_multimap.h:578
key_equal key_eq() const
Definition unordered_multimap.h:1415
const_iterator find(const_key_reference key) const
Definition unordered_multimap.h:1127
bool contains(const_key_reference key) const
Check if the unordered_multimap contains the key.
Definition unordered_multimap.h:1458
bool empty() const
Checks to see if the unordered_multimap is empty.
Definition unordered_multimap.h:1371
size_type bucket_count() const
Definition unordered_multimap.h:651
iterator insert(const_reference key_value_pair)
Definition unordered_multimap.h:689
iterator erase(const_iterator ielement)
Definition unordered_multimap.h:946
local_iterator end(size_t i)
Definition unordered_multimap.h:569
size_type capacity() const
Gets the maximum possible size of the unordered_multimap.
Definition unordered_multimap.h:1363
const_local_iterator begin(size_t i) const
Definition unordered_multimap.h:522
void initialise()
Initialise the unordered_multimap.
Definition unordered_multimap.h:1493
const_iterator end() const
Definition unordered_multimap.h:551
size_t count(const_key_reference key) const
Definition unordered_multimap.h:1038
iterator find(const_key_reference key)
Definition unordered_multimap.h:1093
size_type size() const
Gets the size of the unordered_multimap.
Definition unordered_multimap.h:1347
void clear()
Clears the unordered_multimap.
Definition unordered_multimap.h:1028
const_iterator begin() const
Definition unordered_multimap.h:493
hasher hash_function() const
Definition unordered_multimap.h:1406
iterator erase(const_iterator first_, const_iterator last_)
Definition unordered_multimap.h:974
ETL_OR_STD::pair< const_iterator, const_iterator > equal_range(const_key_reference key) const
Definition unordered_multimap.h:1266
iterator insert(const_iterator, const_reference key_value_pair)
Definition unordered_multimap.h:834
size_type max_size() const
Gets the maximum possible size of the unordered_multimap.
Definition unordered_multimap.h:1355
const_iterator cbegin() const
Definition unordered_multimap.h:502
local_iterator begin(size_t i)
Definition unordered_multimap.h:511
ETL_OR_STD::pair< iterator, iterator > equal_range(const_key_reference key)
Definition unordered_multimap.h:1239
~iunordered_multimap()
Destructor.
Definition unordered_multimap.h:1672
iunordered_multimap(pool_t &node_pool_, bucket_t *pbuckets_, size_t number_of_buckets_, hasher key_hash_function_, key_equal key_equal_function_)
Constructor.
Definition unordered_multimap.h:1479
size_type bucket_size(const_key_reference key) const
Definition unordered_multimap.h:617
size_type max_bucket_count() const
Definition unordered_multimap.h:642
const_iterator cend() const
Definition unordered_multimap.h:560
void insert(TIterator first_, TIterator last_)
Definition unordered_multimap.h:862
bool full() const
Checks to see if the unordered_multimap is full.
Definition unordered_multimap.h:1379
size_t erase(const_key_reference key)
Definition unordered_multimap.h:876
size_type get_bucket_index(const_key_reference key) const
Definition unordered_multimap.h:596
iterator begin()
Definition unordered_multimap.h:484
Definition unordered_multimap.h:129
Definition unordered_multimap.h:70
Definition unordered_multimap.h:84
Definition unordered_multimap.h:112
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 begin(TContainer &container)
Definition iterator.h:967
A forward link.
Definition intrusive_links.h:87
iterator
Definition iterator.h:424
Definition unordered_multimap.h:157