8#ifndef INCLUDED_BSLSTL_UNORDEREDMULTIMAP
9#define INCLUDED_BSLSTL_UNORDEREDMULTIMAP
649#include <bslscm_version.h>
687#if defined(BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS)
688# include <initializer_list>
691#ifdef BSLS_COMPILERFEATURES_SUPPORT_TRAITS_HEADER
692#include <type_traits>
693 #ifndef BSLS_COMPILERFEATURES_SUPPORT_RVALUE_REFERENCES
694 #error Rvalue references curiously absent despite native 'type_traits'.
698#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS) \
699 && defined(BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES)
700# define BSLSTL_UNORDEREDMULTIMAP_REQUIRES_CONTAINER_COMPATIBLE_RANGE(R, T) \
701 requires ::BloombergLP::bslmf::ContainerCompatibleRange<R, T>
703# define BSLSTL_UNORDEREDMULTIMAP_REQUIRES_CONTAINER_COMPATIBLE_RANGE(R, T)
706#if BSLS_COMPILERFEATURES_SIMULATE_CPP11_FEATURES
712# define COMPILING_BSLSTL_UNORDEREDMULTIMAP_H
714# undef COMPILING_BSLSTL_UNORDEREDMULTIMAP_H
756 typedef ::BloombergLP::bslstl::UnorderedMapKeyConfiguration<
const KEY,
763 typedef ::BloombergLP::bslstl::HashTable<ListConfiguration,
770 typedef ::BloombergLP::bslalg::BidirectionalLink HashTableLink;
774 typedef BloombergLP::bslmf::MovableRefUtil MoveUtil;
777 template <
class KEY2,
803 typedef ::BloombergLP::bslstl::HashTableIterator<
806 typedef ::BloombergLP::bslstl::HashTableIterator<
809 typedef ::BloombergLP::bslstl::HashTableBucketIterator<
812 typedef ::BloombergLP::bslstl::HashTableBucketIterator<
842 const HASH& hashFunction = HASH(),
843 const EQUAL& keyEqual = EQUAL(),
844 const ALLOCATOR& basicAllocator = ALLOCATOR());
846 const HASH& hashFunction,
847 const ALLOCATOR& basicAllocator);
849 const ALLOCATOR& basicAllocator);
874 BloombergLP::bslmf::MovableRef<unordered_multimap> original);
890 const typename type_identity<ALLOCATOR>::type& basicAllocator);
909 BloombergLP::bslmf::MovableRef<unordered_multimap> original,
910 const typename type_identity<ALLOCATOR>::type& basicAllocator);
944 template <
class INPUT_ITERATOR>
948 const HASH& hashFunction = HASH(),
949 const EQUAL& keyEqual = EQUAL(),
950 const ALLOCATOR& basicAllocator = ALLOCATOR());
951 template <
class INPUT_ITERATOR>
955 const HASH& hashFunction,
956 const ALLOCATOR& basicAllocator);
957 template <
class INPUT_ITERATOR>
961 const ALLOCATOR& basicAllocator);
962 template <
class INPUT_ITERATOR>
965 const ALLOCATOR& basicAllocator);
967#if defined(BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS)
968# ifdef BSLS_COMPILERFEATURES_SUPPORT_CTAD
970 class = bsl::enable_if_t<std::is_invocable_v<HASH, const KEY &>>,
971 class = bsl::enable_if_t<
972 std::is_invocable_v<EQUAL, const KEY &, const KEY &>>,
973 class = bsl::enable_if_t< bsl::IsStdAllocator_v<ALLOCATOR>>
977 std::initializer_list<value_type> values,
978 size_type initialNumBuckets = 0,
979 const HASH& hashFunction = HASH(),
980 const EQUAL& keyEqual = EQUAL(),
981 const ALLOCATOR& basicAllocator = ALLOCATOR());
982# ifdef BSLS_COMPILERFEATURES_SUPPORT_CTAD
984 class = bsl::enable_if_t<std::is_invocable_v<HASH, const KEY &>>,
985 class = bsl::enable_if_t< bsl::IsStdAllocator_v<ALLOCATOR>>
989 size_type initialNumBuckets,
990 const HASH& hashFunction,
991 const ALLOCATOR& basicAllocator);
992# ifdef BSLS_COMPILERFEATURES_SUPPORT_CTAD
994 class = bsl::enable_if_t< bsl::IsStdAllocator_v<ALLOCATOR>>
998 size_type initialNumBuckets,
999 const ALLOCATOR& basicAllocator);
1000# ifdef BSLS_COMPILERFEATURES_SUPPORT_CTAD
1026 class = bsl::enable_if_t< bsl::IsStdAllocator_v<ALLOCATOR>>
1030 const ALLOCATOR& basicAllocator);
1057 template <class RANGE>
1062 BSLS_COMPILERFEATURES_FORWARD_REF(RANGE) range,
1063 size_type initialNumBuckets = 0,
1064 const HASH& hashFunction = HASH(),
1065 const EQUAL& keyEqual = EQUAL(),
1066 const ALLOCATOR& basicAllocator = ALLOCATOR())
1067 : d_impl(hashFunction,
1074#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS) \
1075 && defined(BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES)
1076 if constexpr (ranges::sized_range<RANGE>) {
1077 constructFromRange(bsl::ranges::begin(range),
1078 bsl::ranges::end (range),
1079 bsl::ranges::size (range));
1083 constructFromRange(bsl::ranges::begin(range),
1084 bsl::ranges::end (range));
1088 template <
class RANGE>
1094 const HASH& hashFunction,
1095 const ALLOCATOR& basicAllocator)
1096 : d_impl(hashFunction, EQUAL(), initialNumBuckets, 1.0f, basicAllocator)
1109 template <
class RANGE>
1115 const ALLOCATOR& basicAllocator)
1116 : d_impl(HASH(), EQUAL(), initialNumBuckets, 1.0f, basicAllocator)
1129 template <
class RANGE>
1134 const ALLOCATOR& basicAllocator)
1135 : d_impl(HASH(), EQUAL(), 0, 1.0f, basicAllocator)
1181 operator=(BloombergLP::bslmf::MovableRef<unordered_multimap>
rhs)
1183 AllocatorTraits::is_always_equal::value &&
1184 std::is_nothrow_move_assignable<HASH>::value &&
1185 std::is_nothrow_move_assignable<EQUAL>::value);
1187#if defined(BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS)
1243 template <class LOOKUP_KEY>
1245 BloombergLP::
bslmf::IsTransparentPredicate<HASH, LOOKUP_KEY>::value
1246 && BloombergLP::
bslmf::IsTransparentPredicate<EQUAL,LOOKUP_KEY>::value,
1248 equal_range(const LOOKUP_KEY& key)
1252 HashTableLink *first;
1253 HashTableLink *last;
1254 d_impl.findRange(&first, &last, key);
1276 template <
class t_KEY>
1278 BloombergLP::bslmf::IsTransparentPredicate<HASH, t_KEY>::value &&
1279 BloombergLP::bslmf::IsTransparentPredicate<EQUAL,t_KEY>::value &&
1294 }
while (it !=
end() &&
key_eq()(it->first, key));
1334 template <
class LOOKUP_KEY>
1336 BloombergLP::bslmf::IsTransparentPredicate<HASH, LOOKUP_KEY>::value
1337 && BloombergLP::bslmf::IsTransparentPredicate<EQUAL,LOOKUP_KEY>::value,
1359#if defined(BSLS_PLATFORM_CMP_SUN) && BSLS_PLATFORM_CMP_VERSION < 0x5130
1360 template <
class ALT_VALUE_TYPE>
1362#elif !defined(BSLS_COMPILERFEATURES_SUPPORT_TRAITS_HEADER)
1363 template <
class ALT_VALUE_TYPE>
1374 template <
class ALT_VALUE_TYPE>
1376 ALT_VALUE_TYPE&&>::value,
1403#if defined(BSLS_PLATFORM_CMP_SUN) && BSLS_PLATFORM_CMP_VERSION < 0x5130
1404 template <
class ALT_VALUE_TYPE>
1406#elif !defined(BSLS_COMPILERFEATURES_SUPPORT_TRAITS_HEADER)
1407 template <
class ALT_VALUE_TYPE>
1427 template <
class ALT_VALUE_TYPE>
1429 ALT_VALUE_TYPE&&>::value,
1455 template <
class INPUT_ITERATOR>
1456 void insert(INPUT_ITERATOR first, INPUT_ITERATOR last);
1463 template <
class RANGE>
1469#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS) \
1470 && defined(BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES)
1471 if constexpr (ranges::sized_range<RANGE>) {
1472 insertFromRange(bsl::ranges::begin(range),
1473 bsl::ranges::end (range),
1474 bsl::ranges::size (range));
1478 insertFromRange(bsl::ranges::begin(range),
1479 bsl::ranges::end (range));
1483#if defined(BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS)
1489 void insert(std::initializer_list<value_type> values);
1492#if !BSLS_COMPILERFEATURES_SIMULATE_CPP11_FEATURES
1502 template <
class... Args>
1522 template <
class... Args>
1565 AllocatorTraits::is_always_equal::value &&
1566 bsl::is_nothrow_swappable<HASH>::value &&
1567 bsl::is_nothrow_swappable<EQUAL>::value);
1596 template <class LOOKUP_KEY>
1598 BloombergLP::
bslmf::IsTransparentPredicate<HASH, LOOKUP_KEY>::value &&
1599 BloombergLP::
bslmf::IsTransparentPredicate<EQUAL,
1640 template <class LOOKUP_KEY>
1642 BloombergLP::
bslmf::IsTransparentPredicate<HASH, LOOKUP_KEY>::value
1643 && BloombergLP::
bslmf::IsTransparentPredicate<EQUAL,LOOKUP_KEY>::value,
1645 find(const LOOKUP_KEY& key)
const
1662 template <
class LOOKUP_KEY>
1664 BloombergLP::bslmf::IsTransparentPredicate<HASH, LOOKUP_KEY>::value
1665 && BloombergLP::bslmf::IsTransparentPredicate<EQUAL,LOOKUP_KEY>::value,
1670 typedef ::BloombergLP::bslalg::BidirectionalNode<value_type> BNode;
1673 for (HashTableLink *cursor = d_impl.find(key);
1675 ++result, cursor = cursor->nextLink())
1677 BNode *cursorNode =
static_cast<BNode *
>(cursor);
1680 ListConfiguration::extractKey(cursorNode->value()))) {
1703 template <
class LOOKUP_KEY>
1705 BloombergLP::bslmf::IsTransparentPredicate<HASH, LOOKUP_KEY>::value
1706 && BloombergLP::bslmf::IsTransparentPredicate<EQUAL,LOOKUP_KEY>::value,
1712 HashTableLink *first;
1713 HashTableLink *last;
1714 d_impl.findRange(&first, &last, key);
1759 template <
class LOOKUP_KEY>
1761 BloombergLP::bslmf::IsTransparentPredicate<HASH, LOOKUP_KEY>::value
1762 && BloombergLP::bslmf::IsTransparentPredicate<EQUAL,LOOKUP_KEY>::value,
1766 return d_impl.bucketIndexForKey(key);
1811 template <class INPUT_ITERATOR, class SENTINEL>
1812 void constructFromRange(INPUT_ITERATOR first, SENTINEL last);
1814#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS) \
1815 && defined(BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES)
1816 template <
class INPUT_ITERATOR,
class SENTINEL>
1817 void constructFromRange(INPUT_ITERATOR first,
1819 size_t numElements);
1827 template <
class INPUT_ITERATOR,
class SENTINEL>
1828 void insertFromRange(INPUT_ITERATOR first, SENTINEL last);
1830#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS) \
1831 && defined(BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES)
1832 template <
class INPUT_ITERATOR,
class SENTINEL>
1833 void insertFromRange(INPUT_ITERATOR first,
1835 size_t numElements);
1839#ifdef BSLS_COMPILERFEATURES_SUPPORT_CTAD
1849 class INPUT_ITERATOR,
1850 class KEY = BloombergLP::bslstl::IteratorUtil::IterKey_t<INPUT_ITERATOR>,
1852 BloombergLP::bslstl::IteratorUtil::IterMapped_t<INPUT_ITERATOR>,
1856 class = bsl::enable_if_t<
std::is_invocable_v<HASH, const KEY &>>,
1857 class = bsl::enable_if_t<
1858 std::is_invocable_v<EQUAL, const KEY &, const KEY &>>,
1859 class = bsl::enable_if_t<bsl::IsStdAllocator_v<ALLOCATOR>>
1861unordered_multimap(INPUT_ITERATOR,
1863 typename bsl::allocator_traits<ALLOCATOR>::size_type = 0,
1866 ALLOCATOR = ALLOCATOR())
1867-> unordered_multimap<KEY, VALUE, HASH, EQUAL, ALLOCATOR>;
1876 class INPUT_ITERATOR,
1880 class KEY = BloombergLP::bslstl::IteratorUtil::IterKey_t<INPUT_ITERATOR>,
1882 BloombergLP::bslstl::IteratorUtil::IterMapped_t<INPUT_ITERATOR>,
1883 class DEFAULT_ALLOCATOR = bsl::allocator<pair<const KEY, VALUE>>,
1884 class = bsl::enable_if_t<bsl::is_convertible_v<ALLOC *, DEFAULT_ALLOCATOR>>
1889 typename bsl::allocator_traits<DEFAULT_ALLOCATOR>::size_type,
1893-> unordered_multimap<KEY, VALUE, HASH, EQUAL>;
1903 class INPUT_ITERATOR,
1906 class KEY = BloombergLP::bslstl::IteratorUtil::IterKey_t<INPUT_ITERATOR>,
1908 BloombergLP::bslstl::IteratorUtil::IterMapped_t<INPUT_ITERATOR>,
1909 class = bsl::enable_if_t<std::is_invocable_v<HASH, const KEY &>>,
1910 class = bsl::enable_if_t<bsl::IsStdAllocator_v<ALLOCATOR>>
1912unordered_multimap(INPUT_ITERATOR,
1914 typename bsl::allocator_traits<ALLOCATOR>::size_type,
1917-> unordered_multimap<KEY, VALUE, HASH, bsl::equal_to<KEY>, ALLOCATOR>;
1926 class INPUT_ITERATOR,
1929 class KEY = BloombergLP::bslstl::IteratorUtil::IterKey_t<INPUT_ITERATOR>,
1931 BloombergLP::bslstl::IteratorUtil::IterMapped_t<INPUT_ITERATOR>,
1932 class DEFAULT_ALLOCATOR = bsl::allocator<bsl::pair<const KEY, VALUE>>,
1933 class = bsl::enable_if_t<bsl::is_convertible_v<ALLOC *, DEFAULT_ALLOCATOR>>
1938 typename bsl::allocator_traits<DEFAULT_ALLOCATOR>::size_type,
1941-> unordered_multimap<KEY, VALUE, HASH>;
1948 class INPUT_ITERATOR,
1950 class KEY = BloombergLP::bslstl::IteratorUtil::IterKey_t<INPUT_ITERATOR>,
1952 BloombergLP::bslstl::IteratorUtil::IterMapped_t<INPUT_ITERATOR>,
1953 class = bsl::enable_if_t<bsl::IsStdAllocator_v<ALLOCATOR>>
1955unordered_multimap(INPUT_ITERATOR,
1957 typename bsl::allocator_traits<ALLOCATOR>::size_type,
1959-> unordered_multimap<KEY,
1971 class INPUT_ITERATOR,
1973 class KEY = BloombergLP::bslstl::IteratorUtil::IterKey_t<INPUT_ITERATOR>,
1975 BloombergLP::bslstl::IteratorUtil::IterMapped_t<INPUT_ITERATOR>,
1976 class DEFAULT_ALLOCATOR = bsl::allocator<bsl::pair<const KEY, VALUE>>,
1977 class = bsl::enable_if_t<bsl::is_convertible_v<ALLOC *, DEFAULT_ALLOCATOR>>
1982 typename bsl::allocator_traits<DEFAULT_ALLOCATOR>::size_type,
1984-> unordered_multimap<KEY, VALUE>;
1993 class INPUT_ITERATOR,
1995 class KEY = BloombergLP::bslstl::IteratorUtil::IterKey_t<INPUT_ITERATOR>,
1997 BloombergLP::bslstl::IteratorUtil::IterMapped_t<INPUT_ITERATOR>,
1998 class = bsl::enable_if_t<bsl::IsStdAllocator_v<ALLOCATOR>>
2000unordered_multimap(INPUT_ITERATOR, INPUT_ITERATOR, ALLOCATOR)
2001-> unordered_multimap<KEY,
2012 class INPUT_ITERATOR,
2014 class KEY = BloombergLP::bslstl::IteratorUtil::IterKey_t<INPUT_ITERATOR>,
2016 BloombergLP::bslstl::IteratorUtil::IterMapped_t<INPUT_ITERATOR>,
2017 class DEFAULT_ALLOCATOR = bsl::allocator<bsl::pair<const KEY, VALUE>>,
2018 class = bsl::enable_if_t<bsl::is_convertible_v<ALLOC *, DEFAULT_ALLOCATOR>>
2020unordered_multimap(INPUT_ITERATOR, INPUT_ITERATOR, ALLOC *)
2021-> unordered_multimap<KEY, VALUE>;
2034 class HASH = bsl::hash<KEY>,
2035 class EQUAL = bsl::equal_to<KEY>,
2036 class ALLOCATOR = bsl::allocator<bsl::pair<const KEY, VALUE>>,
2037 class = bsl::enable_if_t<std::is_invocable_v<HASH, const KEY &>>,
2038 class = bsl::enable_if_t<
2039 std::is_invocable_v<EQUAL, const KEY &, const KEY &>>,
2040 class = bsl::enable_if_t<bsl::IsStdAllocator_v<ALLOCATOR>>
2042unordered_multimap(std::initializer_list<bsl::pair<const KEY, VALUE>>,
2043 typename bsl::allocator_traits<ALLOCATOR>::size_type = 0,
2046 ALLOCATOR = ALLOCATOR())
2047-> unordered_multimap<KEY, VALUE, HASH, EQUAL, ALLOCATOR>;
2062 class DEFAULT_ALLOCATOR = bsl::allocator<bsl::pair<const KEY, VALUE>>,
2063 class = bsl::enable_if_t<bsl::is_convertible_v<ALLOC *, DEFAULT_ALLOCATOR>>
2066 std::initializer_list<bsl::pair<const KEY, VALUE>>,
2067 typename bsl::allocator_traits<DEFAULT_ALLOCATOR>::size_type,
2071-> unordered_multimap<KEY, VALUE, HASH, EQUAL>;
2085 class = bsl::enable_if_t<std::is_invocable_v<HASH, const KEY &>>,
2086 class = bsl::enable_if_t<bsl::IsStdAllocator_v<ALLOCATOR>>
2088unordered_multimap(std::initializer_list<bsl::pair<const KEY, VALUE>>,
2089 typename bsl::allocator_traits<ALLOCATOR>::size_type,
2092-> unordered_multimap<KEY, VALUE, HASH, bsl::equal_to<KEY>, ALLOCATOR>;
2105 class DEFAULT_ALLOCATOR = bsl::allocator<bsl::pair<const KEY, VALUE>>,
2106 class = bsl::enable_if_t<bsl::is_convertible_v<ALLOC *, DEFAULT_ALLOCATOR>>
2109 std::initializer_list<bsl::pair<const KEY, VALUE>>,
2110 typename bsl::allocator_traits<DEFAULT_ALLOCATOR>::size_type,
2113-> unordered_multimap<KEY, VALUE, HASH>;
2123 class = bsl::enable_if_t<bsl::IsStdAllocator_v<ALLOCATOR>>
2125unordered_multimap(std::initializer_list<bsl::pair<const KEY, VALUE>>,
2126 typename bsl::allocator_traits<ALLOCATOR>::size_type,
2128-> unordered_multimap<KEY,
2143 class DEFAULT_ALLOCATOR = bsl::allocator<bsl::pair<const KEY, VALUE>>,
2144 class = bsl::enable_if_t<bsl::is_convertible_v<ALLOC *, DEFAULT_ALLOCATOR>>
2147 std::initializer_list<bsl::pair<const KEY, VALUE>>,
2148 typename bsl::allocator_traits<DEFAULT_ALLOCATOR>::size_type,
2150-> unordered_multimap<KEY, VALUE>;
2162 class = bsl::enable_if_t<bsl::IsStdAllocator_v<ALLOCATOR>>
2164unordered_multimap(std::initializer_list<bsl::pair<const KEY, VALUE>>,
2166-> unordered_multimap<KEY,
2181 class DEFAULT_ALLOCATOR = bsl::allocator<bsl::pair<const KEY, VALUE>>,
2182 class = bsl::enable_if_t<bsl::is_convertible_v<ALLOC *, DEFAULT_ALLOCATOR>>
2184unordered_multimap(std::initializer_list<bsl::pair<const KEY, VALUE>>, ALLOC *)
2185-> unordered_multimap<KEY, VALUE>;
2197template <class KEY, class VALUE, class HASH, class EQUAL, class ALLOCATOR>
2199 const unordered_multimap<KEY, VALUE, HASH, EQUAL, ALLOCATOR>& lhs,
2200 const unordered_multimap<KEY, VALUE, HASH, EQUAL, ALLOCATOR>& rhs);
2202#ifndef BSLS_COMPILERFEATURES_SUPPORT_THREE_WAY_COMPARISON
2203template <class KEY, class VALUE, class HASH, class EQUAL, class ALLOCATOR>
2205 const unordered_multimap<KEY, VALUE, HASH, EQUAL, ALLOCATOR>& lhs,
2206 const unordered_multimap<KEY, VALUE, HASH, EQUAL, ALLOCATOR>& rhs);
2228erase_if(unordered_multimap<KEY, VALUE, HASH, EQUAL, ALLOCATOR>& m,
2229 PREDICATE predicate);
2244template <class KEY, class VALUE, class HASH, class EQUAL, class ALLOCATOR>
2245void swap(unordered_multimap<KEY, VALUE, HASH, EQUAL, ALLOCATOR>& a,
2246 unordered_multimap<KEY, VALUE, HASH, EQUAL, ALLOCATOR>& b)
2259template <class KEY, class VALUE, class HASH, class EQUAL, class ALLOCATOR>
2260template <class INPUT_ITERATOR, class SENTINEL>
2262 constructFromRange(INPUT_ITERATOR first,
2267 const difference_type maxInsertions =
2268 ::BloombergLP::bslstl::IteratorUtil::insertDistance(first, last);
2269 if (0 < maxInsertions) {
2276 while (first != last) {
2277 d_impl.emplace(*first);
2282#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS) \
2283 && defined(BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES)
2284template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2285template <
class INPUT_ITERATOR,
class SENTINEL>
2286void unordered_multimap<KEY, VALUE, HASH, EQUAL, ALLOCATOR>::
2287 constructFromRange(INPUT_ITERATOR first,
2293 if (0 < numElements) {
2294 this->reserve(numElements);
2297 while (first != last) {
2298 d_impl.emplace(*first);
2304template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2305template <
class INPUT_ITERATOR,
class SENTINEL>
2306void unordered_multimap<KEY, VALUE, HASH, EQUAL, ALLOCATOR>::
2307 insertFromRange(INPUT_ITERATOR first,
2310 const difference_type maxInsertions =
2311 ::BloombergLP::bslstl::IteratorUtil::insertDistance(first, last);
2312 if (0 < maxInsertions) {
2319 while (first != last) {
2320 d_impl.emplace(*first);
2325#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS) \
2326 && defined(BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES)
2327template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2328template <
class INPUT_ITERATOR,
class SENTINEL>
2329void unordered_multimap<KEY, VALUE, HASH, EQUAL, ALLOCATOR>::
2330 insertFromRange(INPUT_ITERATOR first,
2334 if (0 < numElements) {
2338 while (first != last) {
2339 d_impl.emplace(*first);
2346template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2349: d_impl(HASH(), EQUAL(), 0, 1.0f, ALLOCATOR())
2353template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2357 const HASH& hashFunction,
2358 const EQUAL& keyEqual,
2359 const ALLOCATOR& basicAllocator)
2360: d_impl(hashFunction, keyEqual, initialNumBuckets, 1.0f, basicAllocator)
2364template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2368 const HASH& hashFunction,
2369 const ALLOCATOR& basicAllocator)
2370: d_impl(hashFunction, EQUAL(), initialNumBuckets, 1.0f, basicAllocator)
2374template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2378 const ALLOCATOR& basicAllocator)
2379: d_impl(HASH(), EQUAL(), initialNumBuckets, 1.0f, basicAllocator)
2383template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2386 const ALLOCATOR& basicAllocator)
2387: d_impl(basicAllocator)
2391template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2395: d_impl(original.d_impl,
2397 original.get_allocator()))
2401template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2404 BloombergLP::bslmf::MovableRef<unordered_multimap> original)
2405: d_impl(MoveUtil::move(MoveUtil::access(original).d_impl))
2409template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2413 const typename type_identity<ALLOCATOR>::type& basicAllocator)
2414: d_impl(original.d_impl, basicAllocator)
2418template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2421 BloombergLP::bslmf::MovableRef<unordered_multimap> original,
2422 const typename type_identity<ALLOCATOR>::type& basicAllocator)
2423: d_impl(MoveUtil::move(MoveUtil::access(original).d_impl), basicAllocator)
2427template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2428template <
class INPUT_ITERATOR>
2431 INPUT_ITERATOR first,
2432 INPUT_ITERATOR last,
2434 const HASH& hashFunction,
2435 const EQUAL& keyEqual,
2436 const ALLOCATOR& basicAllocator)
2437: d_impl(hashFunction, keyEqual, initialNumBuckets, 1.0f, basicAllocator)
2439 constructFromRange(first, last);
2442template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2443template <
class INPUT_ITERATOR>
2446 INPUT_ITERATOR first,
2447 INPUT_ITERATOR last,
2449 const HASH& hashFunction,
2450 const ALLOCATOR& basicAllocator)
2451: d_impl(hashFunction, EQUAL(), initialNumBuckets, 1.0f, basicAllocator)
2453 this->
insert(first, last);
2456template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2457template <
class INPUT_ITERATOR>
2460 INPUT_ITERATOR first,
2461 INPUT_ITERATOR last,
2463 const ALLOCATOR& basicAllocator)
2464: d_impl(HASH(), EQUAL(), initialNumBuckets, 1.0f, basicAllocator)
2466 this->
insert(first, last);
2469template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2470template <
class INPUT_ITERATOR>
2473 INPUT_ITERATOR first,
2474 INPUT_ITERATOR last,
2475 const ALLOCATOR& basicAllocator)
2476: d_impl(HASH(), EQUAL(), 0, 1.0f, basicAllocator)
2478 this->
insert(first, last);
2481#if defined(BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS)
2482template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2483# ifdef BSLS_COMPILERFEATURES_SUPPORT_CTAD
2484template <
class,
class,
class>
2488 std::initializer_list<value_type> values,
2489 size_type initialNumBuckets,
2490 const HASH& hashFunction,
2491 const EQUAL& keyEqual,
2492 const ALLOCATOR& basicAllocator)
2502template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2503# ifdef BSLS_COMPILERFEATURES_SUPPORT_CTAD
2504template <
class,
class>
2508 std::initializer_list<value_type> values,
2509 size_type initialNumBuckets,
2510 const HASH& hashFunction,
2511 const ALLOCATOR& basicAllocator)
2512: unordered_multimap(values.begin(),
2521template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2522# ifdef BSLS_COMPILERFEATURES_SUPPORT_CTAD
2527 std::initializer_list<value_type> values,
2528 size_type initialNumBuckets,
2529 const ALLOCATOR& basicAllocator)
2530: unordered_multimap(values.
begin(),
2539template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2540# ifdef BSLS_COMPILERFEATURES_SUPPORT_CTAD
2545 std::initializer_list<value_type> values,
2546 const ALLOCATOR& basicAllocator)
2547: unordered_multimap(values.
begin(),
2557template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2564template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2572 d_impl =
rhs.d_impl;
2577template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2581 BloombergLP::bslmf::MovableRef<unordered_multimap>
rhs)
2583 AllocatorTraits::is_always_equal::value &&
2584 std::is_nothrow_move_assignable<HASH>::value &&
2585 std::is_nothrow_move_assignable<EQUAL>::value)
2592 d_impl = MoveUtil::move(lvalue.d_impl);
2597#if defined(BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS)
2598template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2600unordered_multimap<KEY, VALUE, HASH, EQUAL, ALLOCATOR>&
2602 std::initializer_list<value_type> values)
2604 unordered_multimap tmp(values.begin(), values.end(), d_impl.allocator());
2606 d_impl.swap(tmp.d_impl);
2612#if !BSLS_COMPILERFEATURES_SIMULATE_CPP11_FEATURES
2613template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2614template <
class... Args>
2624template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2625template <
class... Args>
2632 return iterator(d_impl.emplaceWithHint(hint.node(),
2637template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2643 return iterator(d_impl.elementListRoot());
2646template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2655template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2665template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2675template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2683template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2688 return find(key) !=
end();
2691template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2700template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2707 HashTableLink *first;
2708 HashTableLink *last;
2709 d_impl.findRange(&first, &last, key);
2713template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2721 return iterator(d_impl.remove(position.node()));
2724template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2733template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2742 typedef ::BloombergLP::bslalg::BidirectionalNode<value_type> BNode;
2744 if (HashTableLink *target = d_impl.find(key)) {
2745 target = d_impl.remove(target);
2748 this->key_eq()(key, ListConfiguration::extractKey(
2749 static_cast<BNode *
>(target)->value()))) {
2750 target = d_impl.remove(target);
2759template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2765#if defined BDE_BUILD_TARGET_SAFE_2
2766 if (first != last) {
2769 for (; it != first; ++it) {
2773 for (; it != last; ++it) {
2779 while (first != last) {
2780 first = this->
erase(first);
2786template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2792 return iterator(d_impl.insert(value));
2795template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2802 return iterator(d_impl.insert(value, hint.node()));
2805template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2806template <
class INPUT_ITERATOR>
2808 INPUT_ITERATOR first,
2809 INPUT_ITERATOR last)
2811 insertFromRange(first, last);
2814#if defined(BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS)
2815template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2818 std::initializer_list<value_type> values)
2820 insert(values.begin(), values.end());
2824template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2827 float newLoadFactor)
2829 d_impl.setMaxLoadFactor(newLoadFactor);
2832template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2837 d_impl.rehashForNumBuckets(numBuckets);
2840template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2845 d_impl.reserveForNumElements(numElements);
2848template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2853 AllocatorTraits::is_always_equal::value &&
2854 bsl::is_nothrow_swappable<HASH>::value &&
2855 bsl::is_nothrow_swappable<EQUAL>::value)
2857 d_impl.swap(other.d_impl);
2861template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2867 return d_impl.allocator();
2870template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2878template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2887template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2895template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2904template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2907 const_local_iterator
2916template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2928template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2940template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2943 const_local_iterator
2952template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2958 return d_impl.bucketIndexForKey(key);
2961template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2967 return d_impl.numBuckets();
2970template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2978 return d_impl.countElementsInBucket(index);
2981template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
2986 typedef ::BloombergLP::bslalg::BidirectionalNode<value_type> BNode;
2989 for (HashTableLink *cursor = d_impl.find(key);
2991 ++result, cursor = cursor->nextLink())
2993 BNode *cursorNode =
static_cast<BNode *
>(cursor);
2994 if (!this->key_eq()(key,
2995 ListConfiguration::extractKey(cursorNode->value()))) {
3003template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
3012template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
3017 return 0 == d_impl.size();
3020template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
3026 return d_impl.size();
3029template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
3035 return AllocatorTraits::max_size(get_allocator());
3038template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
3043 return d_impl.hasher();
3046template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
3051 return d_impl.comparator();
3054template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
3059 ALLOCATOR>::const_iterator,
3064 ALLOCATOR>::const_iterator>
3068 HashTableLink *first;
3069 HashTableLink *last;
3070 d_impl.findRange(&first, &last, key);
3075template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
3082 return d_impl.maxNumBuckets();
3085template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
3091 return d_impl.loadFactor();
3094template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
3100 return d_impl.maxLoadFactor();
3106template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
3108bool bsl::operator==(
3112 return lhs.d_impl == rhs.d_impl;
3115#ifndef BSLS_COMPILERFEATURES_SUPPORT_THREE_WAY_COMPARISON
3116template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
3135bsl::erase_if(unordered_multimap<KEY, VALUE, HASH, EQUAL, ALLOCATOR>& m,
3136 PREDICATE predicate)
3138 return BloombergLP::bslstl::AlgorithmUtil::containerEraseIf(m, predicate);
3141template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
3166template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
3167struct HasStlIterators<
bsl::unordered_multimap<KEY,
3179template <
class KEY,
class VALUE,
class HASH,
class EQUAL,
class ALLOCATOR>
3180struct UsesBslmaAllocator<
bsl::unordered_multimap<KEY,
3192template <
class KEY,
class MAPPED,
class HASH,
class EQUAL,
class ALLOCATOR>
3193struct IsBitwiseMoveable<
3194 bsl::unordered_multimap<KEY, MAPPED, HASH, EQUAL, ALLOCATOR> >
3195 : ::BloombergLP::bslmf::IsBitwiseMoveable<BloombergLP::bslstl::HashTable<
3196 ::BloombergLP::bslstl::
3197 UnorderedMapKeyConfiguration<KEY, bsl::pair<const KEY, MAPPED> >,
Definition bslma_bslallocator.h:588
Definition bslstl_pair.h:1280
Definition bslstl_unorderedmultimap.h:740
float max_load_factor() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_unorderedmultimap.h:3096
friend bool operator==(const unordered_multimap< KEY2, VALUE2, HASH2, EQUAL2, ALLOCATOR2 > &, const unordered_multimap< KEY2, VALUE2, HASH2, EQUAL2, ALLOCATOR2 > &)
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_unorderedmultimap.h:1248
unordered_multimap()
Definition bslstl_unorderedmultimap.h:2348
bool empty() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_unorderedmultimap.h:3014
const value_type & const_reference
Definition bslstl_unorderedmultimap.h:796
EQUAL key_eq() const
Definition bslstl_unorderedmultimap.h:3049
float load_factor() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_unorderedmultimap.h:3087
KEY key_type
Definition bslstl_unorderedmultimap.h:788
ALLOCATOR allocator_type
Definition bslstl_unorderedmultimap.h:793
AllocatorTraits::const_pointer const_pointer
Definition bslstl_unorderedmultimap.h:801
iterator end() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_unorderedmultimap.h:2649
size_type max_size() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_unorderedmultimap.h:3032
void reserve(size_type numElements)
Definition bslstl_unorderedmultimap.h:2842
HASH hash_function() const
Definition bslstl_unorderedmultimap.h:3041
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_unorderedmultimap.h:1708
::BloombergLP::bslstl::HashTableIterator< value_type, difference_type > iterator
Definition bslstl_unorderedmultimap.h:804
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_unorderedmultimap.h:1339
unordered_multimap &operator=(BloombergLP::bslmf::MovableRef< unordered_multimap > rhs) BSLS_KEYWORD_NOEXCEPT_SPECIFICATION(AllocatorTraits iterator begin() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_unorderedmultimap.h:2640
BSLSTL_UNORDEREDMULTIMAP_REQUIRES_CONTAINER_COMPATIBLE_RANGE(RANGE, value_type) unordered_multimap(bsl
Definition bslstl_unorderedmultimap.h:1089
size_type bucket(const key_type &key) const
Definition bslstl_unorderedmultimap.h:2955
value_type & reference
Definition bslstl_unorderedmultimap.h:795
HASH hasher
Definition bslstl_unorderedmultimap.h:791
const_iterator cbegin() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_unorderedmultimap.h:2889
void swap(unordered_multimap &other) BSLS_KEYWORD_NOEXCEPT_SPECIFICATION(AllocatorTraits allocator_type get_allocator() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_unorderedmultimap.h:1573
const_iterator cend() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_unorderedmultimap.h:2898
enable_if< is_convertible< ALT_VALUE_TYPE, value_type >::value, iterator >::type insert(BSLS_COMPILERFEATURES_FORWARD_REF(ALT_VALUE_TYPE) value)
Definition bslstl_unorderedmultimap.h:1379
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_unorderedmultimap.h:1284
unordered_multimap & operator=(const unordered_multimap &rhs)
Definition bslstl_unorderedmultimap.h:2566
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_unorderedmultimap.h:1667
::BloombergLP::bslstl::HashTableIterator< const value_type, difference_type > const_iterator
Definition bslstl_unorderedmultimap.h:807
EQUAL key_equal
Definition bslstl_unorderedmultimap.h:792
size_type max_bucket_count() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_unorderedmultimap.h:3078
size_type bucket_count() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_unorderedmultimap.h:2964
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_unorderedmultimap.h:1764
iterator insert(const value_type &value)
Definition bslstl_unorderedmultimap.h:2789
size_type size() const BSLS_KEYWORD_NOEXCEPT
Return the number of elements in this unordered multimap.
Definition bslstl_unorderedmultimap.h:3023
size_type erase(const key_type &key)
Definition bslstl_unorderedmultimap.h:2735
bool contains(const key_type &key) const
Definition bslstl_unorderedmultimap.h:2685
::BloombergLP::bslstl::HashTableBucketIterator< const value_type, difference_type > const_local_iterator
Definition bslstl_unorderedmultimap.h:813
AllocatorTraits::difference_type difference_type
Definition bslstl_unorderedmultimap.h:799
iterator emplace_hint(const_iterator hint, Args &&... args)
Definition bslstl_unorderedmultimap.h:2628
::BloombergLP::bslstl::HashTableBucketIterator< value_type, difference_type > local_iterator
Definition bslstl_unorderedmultimap.h:810
AllocatorTraits::pointer pointer
Definition bslstl_unorderedmultimap.h:800
bsl::pair< const KEY, VALUE > value_type
Definition bslstl_unorderedmultimap.h:790
AllocatorTraits::size_type size_type
Definition bslstl_unorderedmultimap.h:798
void rehash(size_type numBuckets)
Definition bslstl_unorderedmultimap.h:2834
iterator emplace(Args &&... args)
Definition bslstl_unorderedmultimap.h:2617
size_type bucket_size(size_type index) const
Definition bslstl_unorderedmultimap.h:2973
void clear() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_unorderedmultimap.h:2677
~unordered_multimap()
Destroy this object.
Definition bslstl_unorderedmultimap.h:2558
VALUE mapped_type
Definition bslstl_unorderedmultimap.h:789
enable_if< is_convertible< ALT_VALUE_TYPE, value_type >::value, iterator >::type insert(const_iterator hint, BSLS_COMPILERFEATURES_FORWARD_REF(ALT_VALUE_TYPE) value)
Definition bslstl_unorderedmultimap.h:1432
BSLSTL_UNORDEREDMULTIMAP_REQUIRES_CONTAINER_COMPATIBLE_RANGE(RANGE, value_type) void insert_range(BSLS_COMPILERFEATURES_FORWARD_REF(RANGE) range)
Definition bslstl_unorderedmultimap.h:1464
#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_NOEXCEPT
Definition bsls_keyword.h:674
#define BSLS_KEYWORD_NOEXCEPT_SPECIFICATION(...)
Definition bsls_keyword.h:676
#define BSLSTL_UNORDEREDMULTIMAP_REQUIRES_CONTAINER_COMPATIBLE_RANGE(R, T)
Definition bslstl_unorderedmultimap.h:703
bsl::size_t size(const TYPE &array)
Return the number of elements in the specified array.
int reserve(TYPE *array, int numElements)
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