8#ifndef INCLUDED_BSLSTL_UNORDEREDMULTISET
9#define INCLUDED_BSLSTL_UNORDEREDMULTISET
712#include <bslscm_version.h>
751#if defined(BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS)
752# include <initializer_list>
755#ifdef BSLS_COMPILERFEATURES_SUPPORT_TRAITS_HEADER
756#include <type_traits>
759#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS) \
760 && defined(BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES)
761# define BSLSTL_UNORDEREDMULTISET_REQUIRES_CONTAINER_COMPATIBLE_RANGE(R, T) \
762 requires ::BloombergLP::bslmf::ContainerCompatibleRange<R, T>
764# define BSLSTL_UNORDEREDMULTISET_REQUIRES_CONTAINER_COMPATIBLE_RANGE(R, T)
767#if BSLS_COMPILERFEATURES_SIMULATE_CPP11_FEATURES
773# define COMPILING_BSLSTL_UNORDEREDMULTISET_H
775# undef COMPILING_BSLSTL_UNORDEREDMULTISET_H
813 typedef KEY ValueType;
818 typedef ::BloombergLP::bslstl::UnorderedSetKeyConfiguration<ValueType>
824 typedef ::BloombergLP::bslstl::HashTable<ListConfiguration,
827 ALLOCATOR> HashTable;
831 typedef ::BloombergLP::bslalg::BidirectionalLink HashTableLink;
835 typedef BloombergLP::bslmf::MovableRefUtil MoveUtil;
838 template <
class KEY2,
861 typedef ::BloombergLP::bslstl::HashTableIterator<
864 typedef ::BloombergLP::bslstl::HashTableBucketIterator<
874 ::BloombergLP::bslmf::IsBitwiseMoveable,
875 ::BloombergLP::bslmf::IsBitwiseMoveable<HashTable>::value);
904 const HASH& hashFunction = HASH(),
905 const EQUAL& keyEqual = EQUAL(),
906 const ALLOCATOR& basicAllocator = ALLOCATOR());
908 const HASH& hashFunction,
909 const ALLOCATOR& basicAllocator);
911 const ALLOCATOR& basicAllocator);
936 BloombergLP::bslmf::MovableRef<unordered_multiset> original);
951 const typename type_identity<ALLOCATOR>::type& basicAllocator);
969 BloombergLP::bslmf::MovableRef<unordered_multiset> original,
970 const typename type_identity<ALLOCATOR>::type& basicAllocator);
1002 template <
class INPUT_ITERATOR>
1004 INPUT_ITERATOR last,
1006 const HASH& hashFunction = HASH(),
1007 const EQUAL& keyEqual = EQUAL(),
1008 const ALLOCATOR& basicAllocator = ALLOCATOR());
1009 template <
class INPUT_ITERATOR>
1011 INPUT_ITERATOR last,
1013 const HASH& hashFunction,
1014 const ALLOCATOR& basicAllocator);
1015 template <
class INPUT_ITERATOR>
1017 INPUT_ITERATOR last,
1019 const ALLOCATOR& basicAllocator);
1020 template <
class INPUT_ITERATOR>
1022 INPUT_ITERATOR last,
1023 const ALLOCATOR& basicAllocator);
1025#if defined(BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS)
1026# ifdef BSLS_COMPILERFEATURES_SUPPORT_CTAD
1028 class = bsl::enable_if_t<std::is_invocable_v<HASH, const KEY &>>,
1029 class = bsl::enable_if_t<
1030 std::is_invocable_v<EQUAL, const KEY &, const KEY &>>,
1031 class = bsl::enable_if_t< bsl::IsStdAllocator_v<ALLOCATOR>>
1035 std::initializer_list<KEY> values,
1036 size_type initialNumBuckets = 0,
1037 const HASH& hashFunction = HASH(),
1038 const EQUAL& keyEqual = EQUAL(),
1039 const ALLOCATOR& basicAllocator = ALLOCATOR());
1040# ifdef BSLS_COMPILERFEATURES_SUPPORT_CTAD
1042 class = bsl::enable_if_t<std::is_invocable_v<HASH, const KEY &>>,
1043 class = bsl::enable_if_t<bsl::IsStdAllocator<ALLOCATOR>::value>
1047 size_type initialNumBuckets,
1048 const HASH& hashFunction,
1049 const ALLOCATOR& basicAllocator);
1050# ifdef BSLS_COMPILERFEATURES_SUPPORT_CTAD
1051 template <class = bsl::enable_if_t<bsl::IsStdAllocator<ALLOCATOR>::value>>
1054 size_type initialNumBuckets,
1055 const ALLOCATOR& basicAllocator);
1056# ifdef BSLS_COMPILERFEATURES_SUPPORT_CTAD
1079 template <class = bsl::enable_if_t<bsl::IsStdAllocator<ALLOCATOR>::value>>
1082 const ALLOCATOR& basicAllocator);
1109 template <class RANGE>
1114 BSLS_COMPILERFEATURES_FORWARD_REF(RANGE) range,
1115 size_type initialNumBuckets = 0,
1116 const HASH& hashFunction = HASH(),
1117 const EQUAL& keyEqual = EQUAL(),
1118 const ALLOCATOR& basicAllocator = ALLOCATOR())
1119 : d_impl(hashFunction, keyEqual, initialNumBuckets, 1.0f, basicAllocator)
1123#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS) \
1124&& defined(BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES)
1125 if constexpr (ranges::sized_range<RANGE>) {
1126 insertFromRange(bsl::ranges::begin(range),
1127 bsl::ranges::end (range),
1128 bsl::ranges::size (range));
1132 insertFromRange(bsl::ranges::begin(range),
1133 bsl::ranges::end (range));
1137 template <
class RANGE>
1144 const HASH& hashFunction,
1145 const ALLOCATOR& basicAllocator)
1146 : d_impl(hashFunction, EQUAL(), initialNumBuckets, 1.0f, basicAllocator)
1159 template <
class RANGE>
1166 const ALLOCATOR& basicAllocator)
1167 : d_impl(HASH(), EQUAL(), initialNumBuckets, 1.0f, basicAllocator)
1180 template <
class RANGE>
1185 const ALLOCATOR& basicAllocator)
1186 : d_impl(HASH(), EQUAL(), 0, 1.0f, basicAllocator)
1231 operator=(BloombergLP::bslmf::MovableRef<unordered_multiset>
rhs)
1233 AllocatorTraits::is_always_equal::value
1234 && std::is_nothrow_move_assignable<HASH>::value
1235 && std::is_nothrow_move_assignable<EQUAL>::value);
1237#if defined(BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS)
1287 template <class LOOKUP_KEY>
1289 BloombergLP::
bslmf::IsTransparentPredicate<HASH, LOOKUP_KEY>::value
1290 && BloombergLP::
bslmf::IsTransparentPredicate<EQUAL,LOOKUP_KEY>::value,
1292 equal_range(const LOOKUP_KEY& key)
1296 HashTableLink *first;
1297 HashTableLink *last;
1298 d_impl.findRange(&first, &last, key);
1319 template <
class t_KEY>
1321 BloombergLP::bslmf::IsTransparentPredicate<HASH, t_KEY>::value &&
1322 BloombergLP::bslmf::IsTransparentPredicate<EQUAL,t_KEY>::value &&
1337 }
while (it !=
end() &&
key_eq()(*it, key));
1375 template <
class LOOKUP_KEY>
1377 BloombergLP::bslmf::IsTransparentPredicate<HASH, LOOKUP_KEY>::value
1378 && BloombergLP::bslmf::IsTransparentPredicate<EQUAL,LOOKUP_KEY>::value,
1411 iterator insert(BloombergLP::bslmf::MovableRef<value_type> value);
1448 BloombergLP::bslmf::MovableRef<value_type> value);
1463 template <
class INPUT_ITERATOR>
1464 void insert(INPUT_ITERATOR first, INPUT_ITERATOR last);
1466#if defined(BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS)
1472 void insert(std::initializer_list<KEY> values);
1484 template <
class RANGE>
1491#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS) \
1492&& defined(BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES)
1493 if constexpr (ranges::sized_range<RANGE>) {
1494 insertFromRange(bsl::ranges::begin(range),
1495 bsl::ranges::end (range),
1496 bsl::ranges::size (range));
1500 insertFromRange(bsl::ranges::begin(range),
1501 bsl::ranges::end (range));
1505#if !BSLS_COMPILERFEATURES_SIMULATE_CPP11_FEATURES
1515 template <
class... Args>
1536 template <
class... Args>
1581 AllocatorTraits::is_always_equal::value
1582 && bsl::is_nothrow_swappable<HASH>::value
1583 && bsl::is_nothrow_swappable<EQUAL>::value);
1590 template <
class INPUT_ITERATOR,
class SENTINEL>
1591 void constructFromRange(INPUT_ITERATOR first, SENTINEL last);
1593#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS) \
1594 && defined(BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES)
1602 template <
class INPUT_ITERATOR,
class SENTINEL>
1603 void constructFromRange(INPUT_ITERATOR first,
1605 size_t numElements);
1610 template <
class INPUT_ITERATOR,
class SENTINEL>
1611 void insertFromRange(INPUT_ITERATOR first, SENTINEL last);
1613#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS) \
1614 && defined(BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES)
1622 template <
class INPUT_ITERATOR,
class SENTINEL>
1623 void insertFromRange(INPUT_ITERATOR first,
1625 size_t numElements);
1656 template <class LOOKUP_KEY>
1658 BloombergLP::
bslmf::IsTransparentPredicate<HASH, LOOKUP_KEY>::value &&
1659 BloombergLP::
bslmf::IsTransparentPredicate<EQUAL,
1700 template <class LOOKUP_KEY>
1702 BloombergLP::
bslmf::IsTransparentPredicate<HASH, LOOKUP_KEY>::value
1703 && BloombergLP::
bslmf::IsTransparentPredicate<EQUAL,LOOKUP_KEY>::value,
1705 find(const LOOKUP_KEY& key)
const
1722 template <
class LOOKUP_KEY>
1724 BloombergLP::bslmf::IsTransparentPredicate<HASH, LOOKUP_KEY>::value
1725 && BloombergLP::bslmf::IsTransparentPredicate<EQUAL,LOOKUP_KEY>::value,
1730 typedef ::BloombergLP::bslalg::BidirectionalNode<value_type> BNode;
1733 for (HashTableLink *cursor = d_impl.find(key);
1735 ++result, cursor = cursor->nextLink()) {
1737 BNode *cursorNode =
static_cast<BNode *
>(cursor);
1740 ListConfiguration::extractKey(cursorNode->value()))) {
1761 template <
class LOOKUP_KEY>
1763 BloombergLP::bslmf::IsTransparentPredicate<HASH, LOOKUP_KEY>::value
1764 && BloombergLP::bslmf::IsTransparentPredicate<EQUAL,LOOKUP_KEY>::value,
1770 HashTableLink *first;
1771 HashTableLink *last;
1772 d_impl.findRange(&first, &last, key);
1817 template <
class LOOKUP_KEY>
1819 BloombergLP::bslmf::IsTransparentPredicate<HASH, LOOKUP_KEY>::value
1820 && BloombergLP::bslmf::IsTransparentPredicate<EQUAL,LOOKUP_KEY>::value,
1824 return d_impl.bucketIndexForKey(key);
1861#ifdef BSLS_COMPILERFEATURES_SUPPORT_CTAD
1872 class INPUT_ITERATOR,
1873 class KEY = BloombergLP::bslstl::IteratorUtil::IterVal_t<INPUT_ITERATOR>,
1877 class = bsl::enable_if_t<std::is_invocable_v<HASH, const KEY&>>,
1878 class = bsl::enable_if_t<
1879 std::is_invocable_v<EQUAL, const KEY&, const KEY&>>,
1880 class = bsl::enable_if_t< bsl::IsStdAllocator_v<ALLOCATOR>>
1884 typename bsl::allocator_traits<ALLOCATOR>::size_type = 0,
1887 ALLOCATOR = ALLOCATOR())
1896 class INPUT_ITERATOR,
1897 class KEY = BloombergLP::bslstl::IteratorUtil::IterVal_t<INPUT_ITERATOR>,
1901 class DEFAULT_ALLOCATOR = bsl::allocator<KEY>,
1902 class = bsl::enable_if_t<bsl::is_convertible_v<ALLOC *, DEFAULT_ALLOCATOR>>
1907 typename bsl::allocator_traits<DEFAULT_ALLOCATOR>::size_type,
1920 class INPUT_ITERATOR,
1921 class KEY = BloombergLP::bslstl::IteratorUtil::IterVal_t<INPUT_ITERATOR>,
1924 class = bsl::enable_if_t<std::is_invocable_v<HASH, const KEY &>>,
1925 class = bsl::enable_if_t< bsl::IsStdAllocator_v<ALLOCATOR>>
1929 typename bsl::allocator_traits<ALLOCATOR>::size_type,
1940 class INPUT_ITERATOR,
1941 class KEY = BloombergLP::bslstl::IteratorUtil::IterVal_t<INPUT_ITERATOR>,
1944 class DEFAULT_ALLOCATOR = bsl::allocator<KEY>,
1945 class = bsl::enable_if_t<bsl::is_convertible_v<ALLOC *, DEFAULT_ALLOCATOR>>
1950 typename bsl::allocator_traits<DEFAULT_ALLOCATOR>::size_type,
1960 class INPUT_ITERATOR,
1962 class KEY = BloombergLP::bslstl::IteratorUtil::IterVal_t<INPUT_ITERATOR>,
1963 class = bsl::enable_if_t<bsl::IsStdAllocator_v<ALLOCATOR>>
1967 typename bsl::allocator_traits<ALLOCATOR>::size_type,
1976 class INPUT_ITERATOR,
1977 class KEY = BloombergLP::bslstl::IteratorUtil::IterVal_t<INPUT_ITERATOR>,
1979 class DEFAULT_ALLOCATOR = bsl::allocator<KEY>,
1980 class = bsl::enable_if_t<bsl::is_convertible_v<ALLOC *, DEFAULT_ALLOCATOR>>
1985 typename bsl::allocator_traits<DEFAULT_ALLOCATOR>::size_type,
1994 class INPUT_ITERATOR,
1996 class KEY = BloombergLP::bslstl::IteratorUtil::IterVal_t<INPUT_ITERATOR>,
1997 class = bsl::enable_if_t<bsl::IsStdAllocator_v<ALLOCATOR>>
2007 class INPUT_ITERATOR,
2008 class KEY = BloombergLP::bslstl::IteratorUtil::IterVal_t<INPUT_ITERATOR>,
2010 class DEFAULT_ALLOCATOR = bsl::allocator<KEY>,
2011 class = bsl::enable_if_t<bsl::is_convertible_v<ALLOC *, DEFAULT_ALLOCATOR>>
2025 class HASH = bsl::hash<KEY>,
2026 class EQUAL = bsl::equal_to<KEY>,
2027 class ALLOCATOR = bsl::allocator<KEY>,
2028 class = bsl::enable_if_t<std::is_invocable_v<HASH, const KEY&>>,
2029 class = bsl::enable_if_t<
2030 std::is_invocable_v<EQUAL, const KEY&, const KEY&>>,
2031 class = bsl::enable_if_t< bsl::IsStdAllocator_v<ALLOCATOR>>
2034 typename bsl::allocator_traits<ALLOCATOR>::size_type = 0,
2037 ALLOCATOR = ALLOCATOR())
2051 class DEFAULT_ALLOCATOR = bsl::allocator<KEY>,
2052 class = bsl::enable_if_t<bsl::is_convertible_v<ALLOC *, DEFAULT_ALLOCATOR>>
2055 std::initializer_list<KEY>,
2056 typename bsl::allocator_traits<DEFAULT_ALLOCATOR>::size_type,
2072 class = bsl::enable_if_t<std::is_invocable_v<HASH, const KEY &>>,
2073 class = bsl::enable_if_t< bsl::IsStdAllocator_v<ALLOCATOR>>
2076 typename bsl::allocator_traits<ALLOCATOR>::size_type,
2090 class DEFAULT_ALLOCATOR = bsl::allocator<KEY>,
2091 class = bsl::enable_if_t<bsl::is_convertible_v<ALLOC *, DEFAULT_ALLOCATOR>>
2094 std::initializer_list<KEY>,
2095 typename bsl::allocator_traits<DEFAULT_ALLOCATOR>::size_type,
2107 class = bsl::enable_if_t<bsl::IsStdAllocator_v<ALLOCATOR>>
2110 typename bsl::allocator_traits<ALLOCATOR>::size_type,
2121 class DEFAULT_ALLOCATOR = bsl::allocator<KEY>,
2122 class = bsl::enable_if_t<bsl::is_convertible_v<ALLOC *, DEFAULT_ALLOCATOR>>
2125 std::initializer_list<KEY>,
2126 typename bsl::allocator_traits<DEFAULT_ALLOCATOR>::size_type,
2137 class = bsl::enable_if_t<bsl::IsStdAllocator_v<ALLOCATOR>>
2149 class DEFAULT_ALLOCATOR = bsl::allocator<KEY>,
2150 class = bsl::enable_if_t<bsl::is_convertible_v<ALLOC *, DEFAULT_ALLOCATOR>>
2166template <class KEY, class HASH, class EQUAL, class ALLOCATOR>
2167bool operator==(const unordered_multiset<KEY, HASH, EQUAL, ALLOCATOR>& lhs,
2168 const unordered_multiset<KEY, HASH, EQUAL, ALLOCATOR>& rhs);
2170#ifndef BSLS_COMPILERFEATURES_SUPPORT_THREE_WAY_COMPARISON
2171template <class KEY, class HASH, class EQUAL, class ALLOCATOR>
2172bool operator!=(const unordered_multiset<KEY, HASH, EQUAL, ALLOCATOR>& lhs,
2173 const unordered_multiset<KEY, HASH, EQUAL, ALLOCATOR>& rhs);
2188template <class KEY, class HASH, class EQUAL, class ALLOCATOR, class PREDICATE>
2190erase_if(unordered_multiset<KEY, HASH, EQUAL, ALLOCATOR>& ms,
2191 PREDICATE predicate);
2193template <class KEY, class HASH, class EQUAL, class ALLOCATOR>
2194void swap(unordered_multiset<KEY, HASH, EQUAL, ALLOCATOR>& a,
2195 unordered_multiset<KEY, HASH, EQUAL, ALLOCATOR>& b)
2197 BSLS_KEYWORD_NOEXCEPT_OPERATOR(a.swap(b)));
2220template <class KEY, class HASH, class EQUAL, class ALLOCATOR>
2221template <class INPUT_ITERATOR, class SENTINEL>
2224 INPUT_ITERATOR first,
2234 if (first == last) {
2239 BloombergLP::bslstl::IteratorUtil::
2240 canCalculateInsertDistance<INPUT_ITERATOR,SENTINEL>()) {
2242 BloombergLP::bslstl::IteratorUtil::insertDistance(first, last));
2245 while (first != last) {
2246 d_impl.insert(*first);
2251#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS) \
2252 && defined(BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES)
2254template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2255template <
class INPUT_ITERATOR,
class SENTINEL>
2257void unordered_multiset<KEY, HASH, EQUAL, ALLOCATOR>::constructFromRange(
2258 INPUT_ITERATOR first,
2263 !BloombergLP::bslstl::IteratorUtil
2264 ::canCalculateInsertDistance<INPUT_ITERATOR, SENTINEL>()
2265 || numElements ==
static_cast<size_t>(
2266 BloombergLP::bslstl::IteratorUtil::insertDistance(first, last))));
2268 if (0 < numElements) {
2272 while (first != last) {
2273 d_impl.insert(*first);
2280template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2281template <
class INPUT_ITERATOR,
class SENTINEL>
2283void unordered_multiset<KEY, HASH, EQUAL, ALLOCATOR>::insertFromRange(
2284 INPUT_ITERATOR first,
2295 ::canCalculateInsertDistance<INPUT_ITERATOR, SENTINEL>()) {
2297 + BloombergLP::bslstl::IteratorUtil::insertDistance(first, last));
2300 while (first != last) {
2301 d_impl.insert(*first);
2306#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS) \
2307 && defined(BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES)
2309template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2310template <
class INPUT_ITERATOR,
class SENTINEL>
2312void unordered_multiset<KEY, HASH, EQUAL, ALLOCATOR>::insertFromRange(
2313 INPUT_ITERATOR first,
2318 !BloombergLP::bslstl::IteratorUtil
2319 ::canCalculateInsertDistance<INPUT_ITERATOR, SENTINEL>()
2320 || numElements ==
static_cast<size_t>(
2321 BloombergLP::bslstl::IteratorUtil::insertDistance(first, last))));
2325 while (first != last) {
2326 d_impl.insert(*first);
2334template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2337: d_impl(HASH(), EQUAL(), 0, 1.0f, ALLOCATOR())
2341template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2345 const HASH& hashFunction,
2346 const EQUAL& keyEqual,
2347 const ALLOCATOR& basicAllocator)
2348: d_impl(hashFunction, keyEqual, initialNumBuckets, 1.0f, basicAllocator)
2352template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2356 const HASH& hashFunction,
2357 const ALLOCATOR& basicAllocator)
2358: d_impl(hashFunction, EQUAL(), initialNumBuckets, 1.0f, basicAllocator)
2362template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2366 const ALLOCATOR& basicAllocator)
2367: d_impl(HASH(), EQUAL(), initialNumBuckets, 1.0f, basicAllocator)
2371template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2374 const ALLOCATOR& basicAllocator)
2375: d_impl(basicAllocator)
2379template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2383: d_impl(original.d_impl,
2385 original.get_allocator()))
2389template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2392 BloombergLP::bslmf::MovableRef<unordered_multiset> original)
2393: d_impl(MoveUtil::move(MoveUtil::access(original).d_impl))
2397template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2401 const typename type_identity<ALLOCATOR>::type& basicAllocator)
2402: d_impl(original.d_impl, basicAllocator)
2406template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2409 BloombergLP::bslmf::MovableRef<unordered_multiset> original,
2410 const typename type_identity<ALLOCATOR>::type& basicAllocator)
2411: d_impl(MoveUtil::move(MoveUtil::access(original).d_impl), basicAllocator)
2415template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2416template <
class INPUT_ITERATOR>
2419 INPUT_ITERATOR first,
2420 INPUT_ITERATOR last,
2422 const HASH& hashFunction,
2423 const EQUAL& keyEqual,
2424 const ALLOCATOR& basicAllocator)
2425: d_impl(hashFunction, keyEqual, initialNumBuckets, 1.0f, basicAllocator)
2427 constructFromRange(first, last);
2430template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2431template <
class INPUT_ITERATOR>
2434 INPUT_ITERATOR first,
2435 INPUT_ITERATOR last,
2437 const HASH& hashFunction,
2438 const ALLOCATOR& basicAllocator)
2439: d_impl(hashFunction, EQUAL(), initialNumBuckets, 1.0f, basicAllocator)
2441 this->
insert(first, last);
2444template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2445template <
class INPUT_ITERATOR>
2448 INPUT_ITERATOR first,
2449 INPUT_ITERATOR last,
2451 const ALLOCATOR& basicAllocator)
2452: d_impl(HASH(), EQUAL(), initialNumBuckets, 1.0f, basicAllocator)
2454 this->
insert(first, last);
2457template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2458template <
class INPUT_ITERATOR>
2461 INPUT_ITERATOR first,
2462 INPUT_ITERATOR last,
2463 const ALLOCATOR& basicAllocator)
2464: d_impl(HASH(), EQUAL(), 0, 1.0f, basicAllocator)
2466 this->
insert(first, last);
2469#if defined(BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS)
2470template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2471#ifdef BSLS_COMPILERFEATURES_SUPPORT_CTAD
2472template <
class,
class,
class>
2476 std::initializer_list<KEY> values,
2477 size_type initialNumBuckets,
2478 const hasher& hashFunction,
2479 const key_equal& keyEqual,
2480 const ALLOCATOR& basicAllocator)
2490template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2491#ifdef BSLS_COMPILERFEATURES_SUPPORT_CTAD
2492template <
class,
class>
2496 std::initializer_list<KEY> values,
2497 size_type initialNumBuckets,
2498 const HASH& hashFunction,
2499 const ALLOCATOR& basicAllocator)
2500: unordered_multiset(values.begin(),
2509template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2510#ifdef BSLS_COMPILERFEATURES_SUPPORT_CTAD
2515 std::initializer_list<KEY> values,
2516 size_type initialNumBuckets,
2517 const ALLOCATOR& basicAllocator)
2518: unordered_multiset(values.
begin(),
2527template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2528#ifdef BSLS_COMPILERFEATURES_SUPPORT_CTAD
2533 std::initializer_list<KEY> values,
2534 const ALLOCATOR& basicAllocator)
2535: unordered_multiset(values.
begin(),
2545template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2553template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2562 d_impl =
rhs.d_impl;
2567template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2571 BloombergLP::bslmf::MovableRef<unordered_multiset>
rhs)
2573 AllocatorTraits::is_always_equal::value
2574 && std::is_nothrow_move_assignable<HASH>::value
2575 && std::is_nothrow_move_assignable<EQUAL>::value)
2582 d_impl = MoveUtil::move(lvalue.d_impl);
2587#if defined(BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS)
2588template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2590unordered_multiset<KEY, HASH, EQUAL, ALLOCATOR>&
2592 std::initializer_list<KEY> values)
2594 unordered_multiset tmp(values, d_impl.allocator());
2596 d_impl.swap(tmp.d_impl);
2602#if !BSLS_COMPILERFEATURES_SIMULATE_CPP11_FEATURES
2603template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2604template <
class... Args>
2614template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2615template <
class... Args>
2620 Args&&... arguments)
2622 return iterator(d_impl.emplaceWithHint(hint.node(),
2627template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2632 return iterator(d_impl.elementListRoot());
2635template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2643template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2653template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2663template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2671template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2678template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2685 HashTableLink *first;
2686 HashTableLink *last;
2687 d_impl.findRange(&first, &last, key);
2691template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2698 return iterator(d_impl.remove(position.node()));
2701template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2705 typedef ::BloombergLP::bslalg::BidirectionalNode<value_type> BNode;
2707 HashTableLink *target = d_impl.find(key);
2709 target = d_impl.remove(target);
2712 this->key_eq()(key, ListConfiguration::extractKey(
2713 static_cast<BNode *
>(target)->value()))) {
2714 target = d_impl.remove(target);
2723template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2729#if defined BDE_BUILD_TARGET_SAFE_2
2730 if (first != last) {
2733 for (; it != first; ++it) {
2737 for (; it != last; ++it) {
2743 while (first != last) {
2744 first = this->
erase(first);
2750template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2756 return iterator(d_impl.insert(value));
2759template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2763 BloombergLP::bslmf::MovableRef<value_type> value)
2765 return iterator(d_impl.insert(MoveUtil::move(value)));
2768template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2775 return iterator(d_impl.insert(value, hint.node()));
2778template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2783 BloombergLP::bslmf::MovableRef<value_type> value)
2785 return iterator(d_impl.insert(MoveUtil::move(value), hint.node()));
2788template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2789template <
class INPUT_ITERATOR>
2792 INPUT_ITERATOR last)
2794 insertFromRange(first, last);
2797#if defined(BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS)
2798template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2801 std::initializer_list<KEY> values)
2803 insert(values.begin(), values.end());
2807template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2810 float newLoadFactor)
2812 d_impl.setMaxLoadFactor(newLoadFactor);
2815template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2820 d_impl.rehashForNumBuckets(numBuckets);
2823template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2828 d_impl.reserveForNumElements(numElements);
2831template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2837 AllocatorTraits::is_always_equal::value
2838 && bsl::is_nothrow_swappable<HASH>::value
2839 && bsl::is_nothrow_swappable<EQUAL>::value)
2841 d_impl.swap(other.d_impl);
2845template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2851 return d_impl.allocator();
2854template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2863template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2872template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2881template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2890template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2900template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2911template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2922template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2932template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2938 return d_impl.bucketIndexForKey(key);
2941template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2947 return d_impl.numBuckets();
2950template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2958 return d_impl.countElementsInBucket(index);
2961template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2966 typedef ::BloombergLP::bslalg::BidirectionalNode<value_type> BNode;
2969 for (HashTableLink *cursor = d_impl.find(key);
2971 ++result, cursor = cursor->nextLink()) {
2973 BNode *cursorNode =
static_cast<BNode *
>(cursor);
2974 if (!this->key_eq()(
2976 ListConfiguration::extractKey(cursorNode->value()))) {
2983template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2992template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
2997 return find(key) !=
end();
3000template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
3006 return 0 == d_impl.size();
3009template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
3015 return d_impl.size();
3018template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
3024 return AllocatorTraits::max_size(get_allocator());
3027template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
3032 return d_impl.hasher();
3035template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
3040 return d_impl.comparator();
3043template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
3051 HashTableLink *first;
3052 HashTableLink *last;
3053 d_impl.findRange(&first, &last, key);
3058template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
3064 return d_impl.maxNumBuckets();
3067template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
3072 return d_impl.loadFactor();
3075template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
3080 return d_impl.maxLoadFactor();
3086template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
3088bool bsl::operator==(
3092 return lhs.d_impl == rhs.d_impl;
3095#ifndef BSLS_COMPILERFEATURES_SUPPORT_THREE_WAY_COMPARISON
3096template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
3107template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR,
class PREDICATE>
3110bsl::erase_if(unordered_multiset<KEY, HASH, EQUAL, ALLOCATOR>& ms,
3111 PREDICATE predicate)
3113 return BloombergLP::bslstl::AlgorithmUtil::containerEraseIf(ms, predicate);
3116template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
3143template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
3152template <
class KEY,
class HASH,
class EQUAL,
class ALLOCATOR>
Definition bslma_bslallocator.h:588
Definition bslstl_pair.h:1280
Definition bslstl_unorderedmultiset.h:801
void clear() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_unorderedmultiset.h:2666
void reserve(size_type numElements)
Definition bslstl_unorderedmultiset.h:2826
size_type bucket_count() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_unorderedmultiset.h:2944
const value_type & const_reference
Definition bslstl_unorderedmultiset.h:854
friend bool operator==(const unordered_multiset< KEY2, HASH2, EQUAL2, ALLOCATOR2 > &, const unordered_multiset< KEY2, HASH2, EQUAL2, ALLOCATOR2 > &)
BSLSTL_UNORDEREDMULTISET_REQUIRES_CONTAINER_COMPATIBLE_RANGE(RANGE, value_type) unordered_multiset(bsl
Definition bslstl_unorderedmultiset.h:1138
::BloombergLP::bslstl::HashTableIterator< const value_type, difference_type > iterator
Definition bslstl_unorderedmultiset.h:862
KEY value_type
Definition bslstl_unorderedmultiset.h:849
AllocatorTraits::const_pointer const_pointer
Definition bslstl_unorderedmultiset.h:859
size_type bucket_size(size_type index) const
Definition bslstl_unorderedmultiset.h:2953
size_type bucket(const key_type &key) const
Definition bslstl_unorderedmultiset.h:2935
AllocatorTraits::difference_type difference_type
Definition bslstl_unorderedmultiset.h:857
size_type max_bucket_count() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_unorderedmultiset.h:3061
iterator const_iterator
Definition bslstl_unorderedmultiset.h:867
local_iterator const_local_iterator
Definition bslstl_unorderedmultiset.h:868
EQUAL key_eq() const
Definition bslstl_unorderedmultiset.h:3038
HASH hash_function() const
Definition bslstl_unorderedmultiset.h:3030
enable_if< BloombergLP::bslmf::IsTransparentPredicate< HASH, LOOKUP_KEY >::value &&BloombergLP::bslmf::IsTransparentPredicate< EQUAL, LOOKUP_KEY >::value, iterator >::type find(const LOOKUP_KEY &key)
Definition bslstl_unorderedmultiset.h:1380
iterator end() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_unorderedmultiset.h:2638
size_type max_size() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_unorderedmultiset.h:3021
unordered_multiset &operator=(BloombergLP::bslmf::MovableRef< unordered_multiset > rhs) BSLS_KEYWORD_NOEXCEPT_SPECIFICATION(AllocatorTraits iterator begin() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_unorderedmultiset.h:2630
bool empty() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_unorderedmultiset.h:3003
enable_if< BloombergLP::bslmf::IsTransparentPredicate< HASH, LOOKUP_KEY >::value &&BloombergLP::bslmf::IsTransparentPredicate< EQUAL, LOOKUP_KEY >::value, pair< iterator, iterator > >::type equal_range(const LOOKUP_KEY &key)
Definition bslstl_unorderedmultiset.h:1292
size_type erase(const key_type &key)
Definition bslstl_unorderedmultiset.h:2703
iterator insert(const value_type &value)
Definition bslstl_unorderedmultiset.h:2753
AllocatorTraits::size_type size_type
Definition bslstl_unorderedmultiset.h:856
iterator emplace_hint(const_iterator hint, Args &&... args)
Definition bslstl_unorderedmultiset.h:2618
AllocatorTraits::pointer pointer
Definition bslstl_unorderedmultiset.h:858
void rehash(size_type numBuckets)
Definition bslstl_unorderedmultiset.h:2818
iterator emplace(Args &&... args)
Definition bslstl_unorderedmultiset.h:2607
unordered_multiset & operator=(const unordered_multiset &rhs)
Definition bslstl_unorderedmultiset.h:2556
bool contains(const key_type &key) const
Definition bslstl_unorderedmultiset.h:2994
enable_if< BloombergLP::bslmf::IsTransparentPredicate< HASH, LOOKUP_KEY >::value &&BloombergLP::bslmf::IsTransparentPredicate< EQUAL, LOOKUP_KEY >::value, pair< const_iterator, const_iterator > >::type equal_range(const LOOKUP_KEY &key) const
Definition bslstl_unorderedmultiset.h:1766
float load_factor() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_unorderedmultiset.h:3069
value_type & reference
Definition bslstl_unorderedmultiset.h:853
float max_load_factor() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_unorderedmultiset.h:3077
enable_if< BloombergLP::bslmf::IsTransparentPredicate< HASH, t_KEY >::value &&BloombergLP::bslmf::IsTransparentPredicate< EQUAL, t_KEY >::value &&!is_convertible< BSLS_COMPILERFEATURES_FORWARD_REF(t_KEY), iterator >::value &&!is_convertible< BSLS_COMPILERFEATURES_FORWARD_REF(t_KEY), const_iterator >::value, size_type >::type erase(BSLS_COMPILERFEATURES_FORWARD_REF(t_KEY) key)
Definition bslstl_unorderedmultiset.h:1327
HASH hasher
Definition bslstl_unorderedmultiset.h:850
const_iterator cend() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_unorderedmultiset.h:2884
::BloombergLP::bslstl::HashTableBucketIterator< const value_type, difference_type > local_iterator
Definition bslstl_unorderedmultiset.h:865
size_type size() const BSLS_KEYWORD_NOEXCEPT
Return the number of elements in this unordered multiset.
Definition bslstl_unorderedmultiset.h:3012
EQUAL key_equal
Definition bslstl_unorderedmultiset.h:851
~unordered_multiset()
Destroy this object.
Definition bslstl_unorderedmultiset.h:2547
ALLOCATOR allocator_type
Definition bslstl_unorderedmultiset.h:852
BSLMF_NESTED_TRAIT_DECLARATION_IF(unordered_multiset, ::BloombergLP::bslmf::IsBitwiseMoveable, ::BloombergLP::bslmf::IsBitwiseMoveable< HashTable >::value)
ALLOCATOR get_allocator() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_unorderedmultiset.h:2848
enable_if< BloombergLP::bslmf::IsTransparentPredicate< HASH, LOOKUP_KEY >::value &&BloombergLP::bslmf::IsTransparentPredicate< EQUAL, LOOKUP_KEY >::value, size_type >::type count(const LOOKUP_KEY &key) const
Definition bslstl_unorderedmultiset.h:1727
KEY key_type
Definition bslstl_unorderedmultiset.h:848
unordered_multiset()
Definition bslstl_unorderedmultiset.h:2336
enable_if< BloombergLP::bslmf::IsTransparentPredicate< HASH, LOOKUP_KEY >::value &&BloombergLP::bslmf::IsTransparentPredicate< EQUAL, LOOKUP_KEY >::value, size_type >::type bucket(const LOOKUP_KEY &key) const
Definition bslstl_unorderedmultiset.h:1822
BSLSTL_UNORDEREDMULTISET_REQUIRES_CONTAINER_COMPATIBLE_RANGE(RANGE, value_type) void insert_range(BSLS_COMPILERFEATURES_FORWARD_REF(RANGE) range)
Definition bslstl_unorderedmultiset.h:1485
const_iterator cbegin() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_unorderedmultiset.h:2875
#define BSLS_ASSERT(X)
Definition bsls_assert.h:1976
#define BSLS_ASSERT_SAFE(X)
Definition bsls_assert.h:1917
#define BSLS_COMPILERFEATURES_FORWARD_REF(T)
Definition bsls_compilerfeatures.h:2343
#define BSLS_COMPILERFEATURES_FORWARD(T, V)
Definition bsls_compilerfeatures.h:2349
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
#define BSLS_KEYWORD_CONSTEXPR_CPP17
Definition bsls_keyword.h:639
#define BSLS_KEYWORD_NOEXCEPT_OPERATOR(...)
Definition bsls_keyword.h:677
#define BSLS_KEYWORD_NOEXCEPT
Definition bsls_keyword.h:674
#define BSLS_KEYWORD_NOEXCEPT_SPECIFICATION(...)
Definition bsls_keyword.h:676
#define BSLSTL_UNORDEREDMULTISET_REQUIRES_CONTAINER_COMPATIBLE_RANGE(R, T)
Definition bslstl_unorderedmultiset.h:764
Definition bdlat_valuetypefunctions.h:939
void swap(array< VALUE_TYPE, SIZE > &lhs, array< VALUE_TYPE, SIZE > &rhs)
ALLOCATOR const STRING_VIEW_LIKE_TYPE & rhs
Definition bslstl_string.h:3918
deque< VALUE_TYPE, ALLOCATOR >::size_type erase(deque< VALUE_TYPE, ALLOCATOR > &deq, const BDE_OTHER_TYPE &value)
Definition bslstl_deque.h:4424
T::iterator begin(T &container)
Definition bslstl_iterator.h:1593
const from_range_t from_range
ALLOCATOR & lhs
Definition bslstl_string.h:3917
T::iterator end(T &container)
Definition bslstl_iterator.h:1621
deque< VALUE_TYPE, ALLOCATOR >::size_type erase_if(deque< VALUE_TYPE, ALLOCATOR > &deq, PREDICATE predicate)
Definition bslstl_deque.h:4433
bool operator!=(const memory_resource &a, const memory_resource &b)
Definition bdlc_flathashmap.h:2218
Definition baljsn_encoder_testtypes.h:76
Definition bdlbb_blob.h:579
Definition bdldfp_decimal.h:5549
Definition bslma_allocatortraits.h:1089
BloombergLP::bslma::AllocatorTraits_ConstPointerType< ALLOCATOR >::type const_pointer
Definition bslma_allocatortraits.h:1183
BloombergLP::bslma::AllocatorTraits_SizeType< ALLOCATOR >::type size_type
Definition bslma_allocatortraits.h:1196
BloombergLP::bslma::AllocatorTraits_PointerType< ALLOCATOR >::type pointer
Definition bslma_allocatortraits.h:1180
BloombergLP::bslma::AllocatorTraits_DifferenceType< ALLOCATOR >::type difference_type
Definition bslma_allocatortraits.h:1193
Definition bslmf_enableif.h:530
Definition bslstl_equalto.h:316
Definition bslstl_ranges.h:301
Definition bslstl_hash.h:495
Definition bslmf_isconvertible.h:875
Definition bslalg_hasstliterators.h:99
Definition bslma_usesbslmaallocator.h:344