8#ifndef INCLUDED_BSLSTL_MULTISET
9#define INCLUDED_BSLSTL_MULTISET
545#include <bslscm_version.h>
589#if defined(BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS)
590# include <initializer_list>
593#ifndef BDE_DONT_ALLOW_TRANSITIVE_INCLUDES
597#ifdef BSLS_COMPILERFEATURES_SUPPORT_TRAITS_HEADER
598#include <type_traits>
601#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS) \
602 && defined(BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES)
603# define BSLSTL_MULTISET_REQUIRES_CONTAINER_COMPATIBLE_RANGE(R, T) \
604 requires ::BloombergLP::bslmf::ContainerCompatibleRange<R, T>
606# define BSLSTL_MULTISET_REQUIRES_CONTAINER_COMPATIBLE_RANGE(R, T)
609#if BSLS_COMPILERFEATURES_SIMULATE_CPP11_FEATURES
615# define COMPILING_BSLSTL_MULTISET_H
617# undef COMPILING_BSLSTL_MULTISET_H
642 class COMPARATOR = std::less<KEY>,
650 typedef const KEY ValueType;
654 typedef BloombergLP::bslstl::SetComparator<KEY, COMPARATOR> Comparator;
658 typedef BloombergLP::bslstl::TreeNode<KEY> Node;
662 typedef BloombergLP::bslstl::TreeNodePool<KEY, ALLOCATOR> NodeFactory;
670 typedef BloombergLP::bslmf::MovableRefUtil MoveUtil;
681 class DataWrapper :
public Comparator {
688 DataWrapper(
const DataWrapper&);
689 DataWrapper& operator=(
const DataWrapper&);
697 explicit DataWrapper(
const COMPARATOR& comparator,
698 const ALLOCATOR& basicAllocator);
705 DataWrapper(BloombergLP::bslmf::MovableRef<DataWrapper> original);
711 NodeFactory& nodeFactory();
717 const NodeFactory& nodeFactory()
const;
721 DataWrapper d_compAndAlloc;
725 BloombergLP::bslalg::RbTreeAnchor d_tree;
743 typedef BloombergLP::bslstl::TreeIterator<
const value_type,
746 typedef BloombergLP::bslstl::TreeIterator<
const value_type,
757 Comparator& comparator();
761 NodeFactory& nodeFactory();
768 void quickSwapExchangeAllocators(
multiset& other);
777 void quickSwapRetainAllocators(
multiset& other);
783 template <
class INPUT_ITERATOR,
class SENTINEL>
784 void constructFromRange(INPUT_ITERATOR first, SENTINEL last);
786#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS) \
787 && defined(BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES)
797 template <
class INPUT_ITERATOR,
class SENTINEL>
798 void constructFromRange(INPUT_ITERATOR first,
804 template <
class INPUT_ITERATOR,
class SENTINEL>
805 void insertFromRange(INPUT_ITERATOR first,
808#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS) \
809 && defined(BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES)
817 template <
class INPUT_ITERATOR,
class SENTINEL>
818 void insertFromRange(INPUT_ITERATOR first,
827 const Comparator& comparator()
const;
831 const NodeFactory& nodeFactory()
const;
849 const ALLOCATOR& basicAllocator = ALLOCATOR())
850 : d_compAndAlloc(comparator, basicAllocator)
867 explicit multiset(
const ALLOCATOR& basicAllocator);
886 multiset(BloombergLP::bslmf::MovableRef<multiset> original);
898 const typename type_identity<ALLOCATOR>::type& basicAllocator);
913 multiset(BloombergLP::bslmf::MovableRef<multiset> original,
914 const typename type_identity<ALLOCATOR>::type& basicAllocator);
943 template <
class INPUT_ITERATOR>
946 const COMPARATOR& comparator = COMPARATOR(),
947 const ALLOCATOR& basicAllocator = ALLOCATOR());
948 template <
class INPUT_ITERATOR>
951 const ALLOCATOR& basicAllocator);
972 template <
class RANGE>
977 const COMPARATOR& comparator = COMPARATOR(),
978 const ALLOCATOR& basicAllocator = ALLOCATOR())
979 : d_compAndAlloc(comparator, basicAllocator)
984#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS) \
985 && defined(BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES)
986 if constexpr (ranges::sized_range<RANGE>) {
987 constructFromRange(bsl::ranges::begin(range),
988 bsl::ranges::end (range),
989 bsl::ranges::size (range));
993 constructFromRange(bsl::ranges::begin(range),
994 bsl::ranges::end (range));
998 template <
class RANGE>
1002 const ALLOCATOR& basicAllocator)
1003 : d_compAndAlloc(COMPARATOR(), basicAllocator)
1012 quickSwapRetainAllocators(other);
1015#if defined(BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS)
1035 multiset(std::initializer_list<KEY> values,
1036 const COMPARATOR& comparator = COMPARATOR(),
1037 const ALLOCATOR& basicAllocator = ALLOCATOR());
1038 multiset(std::initializer_list<KEY> values,
1039 const ALLOCATOR& basicAllocator);
1059 AllocatorTraits::is_always_equal::value
1060 && std::is_nothrow_move_assignable<COMPARATOR>::value);
1075#if defined(BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS)
1164 template <class INPUT_ITERATOR>
1165 void insert(INPUT_ITERATOR first, INPUT_ITERATOR last);
1167#if defined(BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS)
1172 void insert(std::initializer_list<KEY> values);
1184 template <
class RANGE>
1190#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS) \
1191 && defined(BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES)
1192 if constexpr (ranges::sized_range<RANGE>) {
1193 insertFromRange(bsl::ranges::begin(range),
1194 bsl::ranges::end (range),
1195 bsl::ranges::size (range));
1199 insertFromRange(bsl::ranges::begin(range),
1200 bsl::ranges::end (range));
1204#if !BSLS_COMPILERFEATURES_SIMULATE_CPP11_FEATURES
1212 template <
class... Args>
1230 template <
class... Args>
1253 template <
class t_KEY>
1255 BloombergLP::bslmf::IsTransparentPredicate<COMPARATOR,
1286 AllocatorTraits::is_always_equal::value
1287 && bsl::is_nothrow_swappable<COMPARATOR>::value);
1324 return iterator(BloombergLP::bslalg::RbTreeUtil::find(
1325 d_tree, this->comparator(), key));
1334 template <
class LOOKUP_KEY>
1336 BloombergLP::bslmf::IsTransparentPredicate<COMPARATOR,
1341 return iterator(BloombergLP::bslalg::RbTreeUtil::find(
1342 d_tree, this->comparator(), key));
1358 return iterator(BloombergLP::bslalg::RbTreeUtil::lowerBound(
1359 d_tree, this->comparator(), key));
1373 template <
class LOOKUP_KEY>
1375 BloombergLP::bslmf::IsTransparentPredicate<COMPARATOR,
1380 return iterator(BloombergLP::bslalg::RbTreeUtil::lowerBound(
1381 d_tree, this->comparator(), key));
1397 return iterator(BloombergLP::bslalg::RbTreeUtil::upperBound(
1398 d_tree, this->comparator(), key));
1412 template <
class LOOKUP_KEY>
1414 BloombergLP::bslmf::IsTransparentPredicate<COMPARATOR,
1419 return iterator(BloombergLP::bslalg::RbTreeUtil::upperBound(
1420 d_tree, this->comparator(), key));
1438 if (endIt !=
end() && !comparator()(key, *endIt.node())) {
1454 template <
class LOOKUP_KEY>
1456 BloombergLP::bslmf::IsTransparentPredicate<COMPARATOR,
1463 if (endIt !=
end() && !comparator()(key, *endIt.node())) {
1529 template <class LOOKUP_KEY>
1531 BloombergLP::
bslmf::IsTransparentPredicate<COMPARATOR,
1580 d_tree, this->comparator(), key));
1589 template <
class LOOKUP_KEY>
1591 BloombergLP::bslmf::IsTransparentPredicate<COMPARATOR,
1597 d_tree, this->comparator(), key));
1609 while (it !=
end() && !comparator()(key, *it.node())) {
1620 template <
class LOOKUP_KEY>
1622 BloombergLP::bslmf::IsTransparentPredicate<COMPARATOR,
1630 while (it !=
end() && !comparator()(key, *it.node())) {
1650 return iterator(BloombergLP::bslalg::RbTreeUtil::lowerBound(
1651 d_tree, this->comparator(), key));
1665 template <
class LOOKUP_KEY>
1667 BloombergLP::bslmf::IsTransparentPredicate<COMPARATOR,
1672 return const_iterator(BloombergLP::bslalg::RbTreeUtil::lowerBound(
1673 d_tree, this->comparator(), key));
1689 return const_iterator(BloombergLP::bslalg::RbTreeUtil::upperBound(
1690 d_tree, this->comparator(), key));
1704 template <
class LOOKUP_KEY>
1706 BloombergLP::bslmf::IsTransparentPredicate<COMPARATOR,
1711 return const_iterator(BloombergLP::bslalg::RbTreeUtil::upperBound(
1712 d_tree, this->comparator(), key));
1731 if (endIt !=
end() && !comparator()(key, *endIt.node())) {
1748 template <
class LOOKUP_KEY>
1750 BloombergLP::bslmf::IsTransparentPredicate<COMPARATOR,
1757 if (endIt !=
end() && !comparator()(key, *endIt.node())) {
1766#ifdef BSLS_COMPILERFEATURES_SUPPORT_CTAD
1776 class INPUT_ITERATOR,
1778 typename BloombergLP::bslstl::IteratorUtil::IterVal_t<INPUT_ITERATOR>,
1779 class COMPARATOR = std::less<KEY>,
1781 class = bsl::enable_if_t<!bsl::IsStdAllocator_v<COMPARATOR>>,
1782 class = bsl::enable_if_t<
bsl::IsStdAllocator_v<ALLOCATOR>>
1784multiset(INPUT_ITERATOR,
1786 COMPARATOR = COMPARATOR(),
1787 ALLOCATOR = ALLOCATOR())
1788-> multiset<KEY, COMPARATOR, ALLOCATOR>;
1796 class INPUT_ITERATOR,
1800 typename BloombergLP::bslstl::IteratorUtil::IterVal_t<INPUT_ITERATOR>,
1801 class DEFAULT_ALLOCATOR = bsl::allocator<KEY>,
1802 class = bsl::enable_if_t<bsl::is_convertible_v<ALLOC *, DEFAULT_ALLOCATOR>>
1804multiset(INPUT_ITERATOR, INPUT_ITERATOR, COMPARATOR, ALLOC *)
1805-> multiset<KEY, COMPARATOR>;
1813 class INPUT_ITERATOR,
1816 typename BloombergLP::bslstl::IteratorUtil::IterVal_t<INPUT_ITERATOR>,
1817 class = bsl::enable_if_t<bsl::IsStdAllocator_v<ALLOCATOR>>
1819multiset(INPUT_ITERATOR, INPUT_ITERATOR, ALLOCATOR)
1820-> multiset<KEY, std::less<KEY>, ALLOCATOR>;
1827 class INPUT_ITERATOR,
1830 typename BloombergLP::bslstl::IteratorUtil::IterVal_t<INPUT_ITERATOR>,
1831 class DEFAULT_ALLOCATOR = bsl::allocator<KEY>,
1832 class = bsl::enable_if_t<bsl::is_convertible_v<ALLOC *, DEFAULT_ALLOCATOR>>
1834multiset(INPUT_ITERATOR, INPUT_ITERATOR, ALLOC *)
1843 class COMPARATOR = std::less<KEY>,
1844 class ALLOCATOR = bsl::allocator<KEY>,
1845 class = bsl::enable_if_t<!bsl::IsStdAllocator_v<COMPARATOR>>,
1846 class = bsl::enable_if_t<bsl::IsStdAllocator_v<ALLOCATOR>>
1848multiset(std::initializer_list<KEY>,
1849 COMPARATOR = COMPARATOR(),
1850 ALLOCATOR = ALLOCATOR())
1851-> multiset<KEY, COMPARATOR, ALLOCATOR>;
1862 class DEFAULT_ALLOCATOR = bsl::allocator<KEY>,
1863 class = bsl::enable_if_t<bsl::is_convertible_v<ALLOC *, DEFAULT_ALLOCATOR>>
1865multiset(std::initializer_list<KEY>, COMPARATOR, ALLOC *)
1866-> multiset<KEY, COMPARATOR>;
1875 class = bsl::enable_if_t<bsl::IsStdAllocator_v<ALLOCATOR>>
1877multiset(std::initializer_list<KEY>, ALLOCATOR)
1878-> multiset<KEY, std::less<KEY>, ALLOCATOR>;
1887 class DEFAULT_ALLOCATOR = bsl::allocator<KEY>,
1888 class = bsl::enable_if_t<bsl::is_convertible_v<ALLOC *, DEFAULT_ALLOCATOR>>
1890multiset(std::initializer_list<KEY>, ALLOC *)
1904template <class KEY, class COMPARATOR, class ALLOCATOR>
1905bool operator==(const multiset<KEY, COMPARATOR, ALLOCATOR>& lhs,
1906 const multiset<KEY, COMPARATOR, ALLOCATOR>& rhs);
1908#ifndef BSLS_COMPILERFEATURES_SUPPORT_THREE_WAY_COMPARISON
1909template <class KEY, class COMPARATOR, class ALLOCATOR>
1910bool operator!=(const multiset<KEY, COMPARATOR, ALLOCATOR>& lhs,
1911 const multiset<KEY, COMPARATOR, ALLOCATOR>& rhs);
1921#ifdef BSLALG_SYNTHTHREEWAYUTIL_AVAILABLE
1926template <class KEY, class COMPARATOR, class ALLOCATOR>
1927BloombergLP::bslalg::SynthThreeWayUtil::Result<KEY>
1928operator<=>(const multiset<KEY, COMPARATOR, ALLOCATOR>& lhs,
1929 const multiset<KEY, COMPARATOR, ALLOCATOR>& rhs);
1933template <class KEY, class COMPARATOR, class ALLOCATOR>
1934bool operator< (const multiset<KEY, COMPARATOR, ALLOCATOR>& lhs,
1935 const multiset<KEY, COMPARATOR, ALLOCATOR>& rhs);
1948template <class KEY, class COMPARATOR, class ALLOCATOR>
1949bool operator> (const multiset<KEY, COMPARATOR, ALLOCATOR>& lhs,
1950 const multiset<KEY, COMPARATOR, ALLOCATOR>& rhs);
1959template <class KEY, class COMPARATOR, class ALLOCATOR>
1960bool operator<=(const multiset<KEY, COMPARATOR, ALLOCATOR>& lhs,
1961 const multiset<KEY, COMPARATOR, ALLOCATOR>& rhs);
1970template <class KEY, class COMPARATOR, class ALLOCATOR>
1971bool operator>=(const multiset<KEY, COMPARATOR, ALLOCATOR>& lhs,
1972 const multiset<KEY, COMPARATOR, ALLOCATOR>& rhs);
1987template <class KEY, class COMPARATOR, class ALLOCATOR, class PREDICATE>
1988typename
multiset<KEY, COMPARATOR, ALLOCATOR>::size_type
1989erase_if(multiset<KEY, COMPARATOR, ALLOCATOR>& ms, PREDICATE predicate);
1991template <class KEY, class COMPARATOR, class ALLOCATOR>
1992void swap(multiset<KEY, COMPARATOR, ALLOCATOR>& a,
1993 multiset<KEY, COMPARATOR, ALLOCATOR>& b)
1995 BSLS_KEYWORD_NOEXCEPT_OPERATOR(a.swap(b)));
2023template <class KEY, class COMPARATOR, class ALLOCATOR>
2025multiset<KEY, COMPARATOR, ALLOCATOR>::DataWrapper::DataWrapper(
2026 const COMPARATOR& comparator,
2027 const ALLOCATOR& basicAllocator)
2029, d_pool(basicAllocator)
2033template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2035multiset<KEY, COMPARATOR, ALLOCATOR>::DataWrapper::DataWrapper(
2036 BloombergLP::bslmf::MovableRef<DataWrapper> original)
2037: ::
bsl::multiset<KEY, COMPARATOR, ALLOCATOR>::Comparator(
2038 MoveUtil::access(original).keyComparator())
2039, d_pool(MoveUtil::move(MoveUtil::access(original).d_pool))
2044template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2046typename multiset<KEY, COMPARATOR, ALLOCATOR>::NodeFactory&
2047multiset<KEY, COMPARATOR, ALLOCATOR>::DataWrapper::nodeFactory()
2053template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2055const typename multiset<KEY, COMPARATOR, ALLOCATOR>::NodeFactory&
2056multiset<KEY, COMPARATOR, ALLOCATOR>::DataWrapper::nodeFactory()
const
2065template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2067typename multiset<KEY, COMPARATOR, ALLOCATOR>::Comparator&
2068multiset<KEY, COMPARATOR, ALLOCATOR>::comparator()
2070 return d_compAndAlloc;
2073template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2075typename multiset<KEY, COMPARATOR, ALLOCATOR>::NodeFactory&
2076multiset<KEY, COMPARATOR, ALLOCATOR>::nodeFactory()
2078 return d_compAndAlloc.nodeFactory();
2081template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2083void multiset<KEY, COMPARATOR, ALLOCATOR>::quickSwapExchangeAllocators(
2086 BloombergLP::bslalg::RbTreeUtil::swap(&d_tree, &other.d_tree);
2087 nodeFactory().swapExchangeAllocators(other.nodeFactory());
2095 if (
sizeof(NodeFactory) !=
sizeof(DataWrapper)) {
2096 comparator().swap(other.comparator());
2100template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2102void multiset<KEY, COMPARATOR, ALLOCATOR>::quickSwapRetainAllocators(
2105 BloombergLP::bslalg::RbTreeUtil::swap(&d_tree, &other.d_tree);
2106 nodeFactory().swapRetainAllocators(other.nodeFactory());
2110 if (
sizeof(NodeFactory) !=
sizeof(DataWrapper)) {
2111 comparator().swap(other.comparator());
2115template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2116template <
class INPUT_ITERATOR,
class SENTINEL>
2119multiset<KEY, COMPARATOR, ALLOCATOR>::constructFromRange(INPUT_ITERATOR first,
2122 if (first == last) {
2127 BloombergLP::bslstl::IteratorUtil::
2128 canCalculateInsertDistance<INPUT_ITERATOR, SENTINEL>()) {
2129 const size_type numElements =
static_cast<size_type
>(
2130 BloombergLP::bslstl::IteratorUtil::insertDistance(first, last));
2131 nodeFactory().reserveNodes(numElements);
2134 BloombergLP::bslalg::RbTreeUtilTreeProctor<NodeFactory> proctor(
2145 BloombergLP::bslalg::RbTreeNode *prevNode = d_tree.rootNode();
2147 while (++first != last) {
2149 const value_type& value = *first;
2150 if (this->comparator()(value, *prevNode)) {
2153 insertFromRange(++first, last);
2157 if (this->comparator()(*prevNode, value)) {
2158 BloombergLP::bslalg::RbTreeNode *node =
2159 nodeFactory().emplaceIntoNewNode(value);
2160 BloombergLP::bslalg::RbTreeUtil::insertAt(&d_tree,
2171#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS) \
2172 && defined(BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES)
2174template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2175template <
class INPUT_ITERATOR,
class SENTINEL>
2177void multiset<KEY, COMPARATOR, ALLOCATOR>::constructFromRange(
2178 INPUT_ITERATOR first,
2184 !BloombergLP::bslstl::IteratorUtil
2185 ::canCalculateInsertDistance<INPUT_ITERATOR, SENTINEL>()
2186 || numElements ==
static_cast<size_type
>(
2187 BloombergLP::bslstl::IteratorUtil::insertDistance(first, last))));
2189 if (first == last) {
2193 if (0 < numElements) {
2194 nodeFactory().reserveNodes(numElements);
2197 BloombergLP::bslalg::RbTreeUtilTreeProctor<NodeFactory> proctor(
2207 insert(*first); --numElements;
2208 BloombergLP::bslalg::RbTreeNode *prevNode = d_tree.rootNode();
2210 while (++first != last) {
2212 const value_type& value = *first;
2213 if (this->comparator()(value, *prevNode)) {
2215 insert(value); --numElements;
2216 insertFromRange(++first, last, numElements);
2220 if (this->comparator()(*prevNode, value)) {
2221 BloombergLP::bslalg::RbTreeNode *node =
2222 nodeFactory().emplaceIntoNewNode(value);
2223 BloombergLP::bslalg::RbTreeUtil::insertAt(&d_tree,
2237template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2238template <
class INPUT_ITERATOR,
class SENTINEL>
2241multiset<KEY, COMPARATOR, ALLOCATOR>::insertFromRange(INPUT_ITERATOR first,
2260 while (first != last) {
2262 if (BloombergLP::bslstl::IteratorUtil
2263 ::canCalculateInsertDistance<INPUT_ITERATOR, SENTINEL>()
2265 !nodeFactory().hasFreeNodes())) {
2266 nodeFactory().reserveNodes(
2267 BloombergLP::bslstl::IteratorUtil::insertDistance(first, last));
2275#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS) \
2276 && defined(BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES)
2278template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2279template <
class INPUT_ITERATOR,
class SENTINEL>
2281void multiset<KEY, COMPARATOR, ALLOCATOR>::insertFromRange(
2282 INPUT_ITERATOR first,
2287 !BloombergLP::bslstl::IteratorUtil
2288 ::canCalculateInsertDistance<INPUT_ITERATOR, SENTINEL>()
2289 || numElements ==
static_cast<size_type
>(
2290 BloombergLP::bslstl::IteratorUtil::insertDistance(first, last))));
2292 while (first != last) {
2295 !nodeFactory().hasFreeNodes())) {
2296 nodeFactory().reserveNodes(numElements);
2308template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2310const typename multiset<KEY, COMPARATOR, ALLOCATOR>::Comparator&
2311multiset<KEY, COMPARATOR, ALLOCATOR>::comparator()
const
2313 return d_compAndAlloc;
2316template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2318const typename multiset<KEY, COMPARATOR, ALLOCATOR>::NodeFactory&
2319multiset<KEY, COMPARATOR, ALLOCATOR>::nodeFactory()
const
2321 return d_compAndAlloc.nodeFactory();
2325template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2328: d_compAndAlloc(COMPARATOR(), ALLOCATOR())
2333template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2336: d_compAndAlloc(COMPARATOR(), basicAllocator)
2341template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2344: d_compAndAlloc(original.comparator().keyComparator(),
2349 if (0 < original.
size()) {
2350 nodeFactory().reserveNodes(original.
size());
2351 BloombergLP::bslalg::RbTreeUtil::copyTree(&d_tree,
2357template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2360 BloombergLP::bslmf::MovableRef<multiset> original)
2361: d_compAndAlloc(MoveUtil::move(MoveUtil::access(original).d_compAndAlloc))
2365 BloombergLP::bslalg::RbTreeUtil::swap(&d_tree, &lvalue.d_tree);
2368template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2371 const typename type_identity<ALLOCATOR>::type& basicAllocator)
2372: d_compAndAlloc(original.comparator().keyComparator(), basicAllocator)
2375 if (0 < original.
size()) {
2376 nodeFactory().reserveNodes(original.
size());
2377 BloombergLP::bslalg::RbTreeUtil::copyTree(&d_tree,
2383template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2386 BloombergLP::bslmf::MovableRef<multiset> original,
2387 const typename type_identity<ALLOCATOR>::type& basicAllocator)
2388: d_compAndAlloc(MoveUtil::access(original).comparator().keyComparator(),
2395 nodeFactory().
allocator() == lvalue.nodeFactory().allocator())) {
2396 d_compAndAlloc.nodeFactory().adopt(
2397 MoveUtil::move(lvalue.d_compAndAlloc.nodeFactory()));
2398 BloombergLP::bslalg::RbTreeUtil::swap(&d_tree, &lvalue.d_tree);
2401 if (0 < lvalue.
size()) {
2402 nodeFactory().reserveNodes(lvalue.
size());
2403 BloombergLP::bslalg::RbTreeUtil::moveTree(&d_tree,
2406 &lvalue.nodeFactory());
2411template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2412template <
class INPUT_ITERATOR>
2415 INPUT_ITERATOR first,
2416 INPUT_ITERATOR last,
2417 const COMPARATOR& comparator,
2418 const ALLOCATOR& basicAllocator)
2419: d_compAndAlloc(comparator, basicAllocator)
2422 if (first != last) {
2425 BloombergLP::bslstl::IteratorUtil::insertDistance(first, last));
2427 if (0 < numElements) {
2428 nodeFactory().reserveNodes(numElements);
2431 BloombergLP::bslalg::RbTreeUtilTreeProctor<NodeFactory> proctor(
2442 BloombergLP::bslalg::RbTreeNode *prevNode = d_tree.rootNode();
2443 while (++first != last) {
2447 if (this->comparator()(value, *prevNode)) {
2452 BloombergLP::bslalg::RbTreeNode *node =
2453 nodeFactory().emplaceIntoNewNode(value);
2454 BloombergLP::bslalg::RbTreeUtil::insertAt(&d_tree,
2465template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2466template <
class INPUT_ITERATOR>
2469 INPUT_ITERATOR first,
2470 INPUT_ITERATOR last,
2471 const ALLOCATOR& basicAllocator)
2472: d_compAndAlloc(COMPARATOR(), basicAllocator)
2475 if (first != last) {
2478 BloombergLP::bslstl::IteratorUtil::insertDistance(first, last));
2480 if (0 < numElements) {
2481 nodeFactory().reserveNodes(numElements);
2484 BloombergLP::bslalg::RbTreeUtilTreeProctor<NodeFactory> proctor(
2495 BloombergLP::bslalg::RbTreeNode *prevNode = d_tree.rootNode();
2496 while (++first != last) {
2500 if (this->comparator()(value, *prevNode)) {
2505 BloombergLP::bslalg::RbTreeNode *node =
2506 nodeFactory().emplaceIntoNewNode(value);
2507 BloombergLP::bslalg::RbTreeUtil::insertAt(&d_tree,
2518#if defined(BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS)
2519template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2522 std::initializer_list<KEY> values,
2523 const COMPARATOR& comparator,
2524 const ALLOCATOR& basicAllocator)
2529template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2532 std::initializer_list<KEY> values,
2533 const ALLOCATOR& basicAllocator)
2534: multiset(values.begin(), values.end(), COMPARATOR(), basicAllocator)
2539template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2547template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2553 if (AllocatorTraits::propagate_on_container_copy_assignment::value) {
2555 quickSwapExchangeAllocators(other);
2559 quickSwapRetainAllocators(other);
2565template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2569 BloombergLP::bslmf::MovableRef<multiset>
rhs)
2571 AllocatorTraits::is_always_equal::value
2572 && std::is_nothrow_move_assignable<COMPARATOR>::value)
2577 if (nodeFactory().
allocator() == lvalue.nodeFactory().allocator()) {
2578 multiset other(MoveUtil::move(lvalue));
2579 quickSwapRetainAllocators(other);
2582 AllocatorTraits::propagate_on_container_move_assignment::value) {
2583 multiset other(MoveUtil::move(lvalue));
2584 quickSwapExchangeAllocators(other);
2587 multiset other(MoveUtil::move(lvalue), nodeFactory().allocator());
2588 quickSwapRetainAllocators(other);
2594#if defined(BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS)
2595template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2597multiset<KEY, COMPARATOR, ALLOCATOR>&
2599 std::initializer_list<KEY> values)
2602 insert(values.begin(), values.end());
2607template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2612 return iterator(d_tree.firstNode());
2615template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2620 return iterator(d_tree.sentinel());
2623template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2631template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2639template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2646 BloombergLP::bslalg::RbTreeNode *insertLocation =
2647 BloombergLP::bslalg::RbTreeUtil::findInsertLocation(&leftChild,
2652 BloombergLP::bslalg::RbTreeNode *node =
2653 nodeFactory().emplaceIntoNewNode(value);
2655 BloombergLP::bslalg::RbTreeUtil::insertAt(&d_tree,
2662template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2666 BloombergLP::bslmf::MovableRef<value_type> value)
2671 BloombergLP::bslalg::RbTreeNode *insertLocation =
2672 BloombergLP::bslalg::RbTreeUtil::findInsertLocation(&leftChild,
2677 BloombergLP::bslalg::RbTreeNode *node =
2678 nodeFactory().emplaceIntoNewNode(MoveUtil::move(lvalue));
2680 BloombergLP::bslalg::RbTreeUtil::insertAt(&d_tree,
2687template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2695 BloombergLP::bslalg::RbTreeNode *hintNode =
2696 const_cast<BloombergLP::bslalg::RbTreeNode *
>(hint.node());
2698 BloombergLP::bslalg::RbTreeNode *insertLocation =
2699 BloombergLP::bslalg::RbTreeUtil::findInsertLocation(&leftChild,
2705 BloombergLP::bslalg::RbTreeNode *node =
2706 nodeFactory().emplaceIntoNewNode(value);
2708 BloombergLP::bslalg::RbTreeUtil::insertAt(&d_tree,
2715template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2720 BloombergLP::bslmf::MovableRef<value_type> value)
2725 BloombergLP::bslalg::RbTreeNode *hintNode =
2726 const_cast<BloombergLP::bslalg::RbTreeNode *
>(hint.node());
2728 BloombergLP::bslalg::RbTreeNode *insertLocation =
2729 BloombergLP::bslalg::RbTreeUtil::findInsertLocation(&leftChild,
2735 BloombergLP::bslalg::RbTreeNode *node =
2736 nodeFactory().emplaceIntoNewNode(MoveUtil::move(lvalue));
2738 BloombergLP::bslalg::RbTreeUtil::insertAt(&d_tree,
2745template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2746template <
class INPUT_ITERATOR>
2749 INPUT_ITERATOR last)
2759 while (first != last) {
2760 if (BloombergLP::bslstl::IteratorUtil::
2761 canCalculateInsertDistance<INPUT_ITERATOR,INPUT_ITERATOR>()
2763 !nodeFactory().hasFreeNodes())) {
2765 BloombergLP::bslstl::IteratorUtil::insertDistance(first, last));
2767 nodeFactory().reserveNodes(numElements);
2774#if defined(BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS)
2775template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2778 std::initializer_list<KEY> values)
2780 insert(values.begin(), values.end());
2784#if !BSLS_COMPILERFEATURES_SIMULATE_CPP11_FEATURES
2785template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2786template <
class... Args>
2793 BloombergLP::bslalg::RbTreeNode *node = nodeFactory().emplaceIntoNewNode(
2796 BloombergLP::bslalg::RbTreeNode *insertLocation =
2797 BloombergLP::bslalg::RbTreeUtil::findInsertLocation(&leftChild,
2800 static_cast<const Node *
>(node)->value());
2802 BloombergLP::bslalg::RbTreeUtil::insertAt(&d_tree,
2809template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2810template <
class... Args>
2818 BloombergLP::bslalg::RbTreeNode *node = nodeFactory().emplaceIntoNewNode(
2821 BloombergLP::bslalg::RbTreeNode *hintNode =
2822 const_cast<BloombergLP::bslalg::RbTreeNode *
>(hint.node());
2824 BloombergLP::bslalg::RbTreeNode *insertLocation =
2825 BloombergLP::bslalg::RbTreeUtil::findInsertLocation(&leftChild,
2828 static_cast<const Node *
>(node)->value(),
2831 BloombergLP::bslalg::RbTreeUtil::insertAt(&d_tree,
2839template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2846 BloombergLP::bslalg::RbTreeNode *node =
2847 const_cast<BloombergLP::bslalg::RbTreeNode *
>(position.node());
2848 BloombergLP::bslalg::RbTreeNode *result =
2849 BloombergLP::bslalg::RbTreeUtil::next(node);
2850 BloombergLP::bslalg::RbTreeUtil::remove(&d_tree, node);
2851 nodeFactory().deleteNode(node);
2855template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2862 if (first !=
end()) {
2864 while (first != last) {
2865 first =
erase(first);
2872template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2878 while (first != last) {
2879 first =
erase(first);
2884template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2888 AllocatorTraits::is_always_equal::value
2889 && bsl::is_nothrow_swappable<COMPARATOR>::value)
2891 if (AllocatorTraits::propagate_on_container_swap::value) {
2892 quickSwapExchangeAllocators(other);
2899 nodeFactory().allocator() == other.nodeFactory().allocator())) {
2900 quickSwapRetainAllocators(other);
2905 multiset toOtherCopy(MoveUtil::move(*
this),
2906 other.nodeFactory().allocator());
2907 multiset toThisCopy(MoveUtil::move(other),
2908 nodeFactory().allocator());
2910 other.quickSwapRetainAllocators(toOtherCopy);
2911 this->quickSwapRetainAllocators(toThisCopy);
2916template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2922 if (d_tree.rootNode()) {
2926 BloombergLP::bslalg::RbTreeUtil::deleteTree(&d_tree, &nodeFactory());
2928#if defined(BSLS_ASSERT_SAFE_IS_USED)
2937template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2943 return nodeFactory().allocator();
2946template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2954template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2962template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2970template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2978template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2986template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2994template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3002template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3010template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3014 return find(key) !=
end();
3018template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3022 return 0 == d_tree.numNodes();
3025template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3030 return d_tree.numNodes();
3033template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3038 return AllocatorTraits::max_size(get_allocator());
3041template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3046 return comparator().keyComparator();
3049template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3060template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3065 return BloombergLP::bslalg::RangeCompare::equal(lhs.begin(),
3073#ifndef BSLS_COMPILERFEATURES_SUPPORT_THREE_WAY_COMPARISON
3074template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3083#ifdef BSLALG_SYNTHTHREEWAYUTIL_AVAILABLE
3085template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3087BloombergLP::bslalg::SynthThreeWayUtil::Result<KEY>
3088bsl::operator<=>(
const multiset<KEY, COMPARATOR, ALLOCATOR>& lhs,
3089 const multiset<KEY, COMPARATOR, ALLOCATOR>& rhs)
3091 return bsl::lexicographical_compare_three_way(
3096 BloombergLP::bslalg::SynthThreeWayUtil::compare);
3101template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3106 return 0 > BloombergLP::bslalg::RangeCompare::lexicographical(
lhs.begin(),
3114template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3122template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3130template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3141template <
class KEY,
class COMPARATOR,
class ALLOCATOR,
class PREDICATE>
3144bsl::erase_if(multiset<KEY, COMPARATOR, ALLOCATOR>& ms, PREDICATE predicate)
3146 return BloombergLP::bslstl::AlgorithmUtil::containerEraseIf(ms, predicate);
3149template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3172template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3181template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
Definition bslma_bslallocator.h:588
Definition bslstl_multiset.h:644
multiset(const COMPARATOR &comparator, const ALLOCATOR &basicAllocator=ALLOCATOR())
Definition bslstl_multiset.h:848
const_reverse_iterator crbegin() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_multiset.h:2997
multiset &operator=(BloombergLP::bslmf::MovableRef< multiset > rhs) BSLS_KEYWORD_NOEXCEPT_SPECIFICATION(AllocatorTraits iterator begin() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_multiset.h:2610
bool empty() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_multiset.h:3020
void swap(multiset &other) BSLS_KEYWORD_NOEXCEPT_SPECIFICATION(AllocatorTraits void clear() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_multiset.h:1310
size_type max_size() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_multiset.h:3036
BloombergLP::bslstl::TreeIterator< const value_type, Node, difference_type > const_iterator
Definition bslstl_multiset.h:748
value_type & reference
Definition bslstl_multiset.h:735
bsl::reverse_iterator< const_iterator > const_reverse_iterator
Definition bslstl_multiset.h:750
const_reverse_iterator crend() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_multiset.h:3005
COMPARATOR key_compare
Definition bslstl_multiset.h:732
BloombergLP::bslstl::TreeIterator< const value_type, Node, difference_type > iterator
Definition bslstl_multiset.h:745
const_iterator cend() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_multiset.h:2989
COMPARATOR value_compare
Definition bslstl_multiset.h:733
bsl::enable_if< BloombergLP::bslmf::IsTransparentPredicate< COMPARATOR, LOOKUP_KEY >::value, pair< iterator, iterator > >::type equal_range(const LOOKUP_KEY &key)
Definition bslstl_multiset.h:1459
iterator erase(const_iterator position)
Definition bslstl_multiset.h:2842
iterator end() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_multiset.h:2618
iterator find(const key_type &key)
Definition bslstl_multiset.h:1322
key_compare key_comp() const
Definition bslstl_multiset.h:3044
size_type size() const BSLS_KEYWORD_NOEXCEPT
Return the number of elements in this multiset.
Definition bslstl_multiset.h:3028
bsl::enable_if< BloombergLP::bslmf::IsTransparentPredicate< COMPARATOR, LOOKUP_KEY >::value, size_type >::type count(const LOOKUP_KEY &key) const
Definition bslstl_multiset.h:1625
allocator_type get_allocator() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_multiset.h:2940
multiset()
Definition bslstl_multiset.h:2327
iterator insert(const value_type &value)
Definition bslstl_multiset.h:2642
iterator lower_bound(const key_type &key)
Definition bslstl_multiset.h:1356
KEY value_type
Definition bslstl_multiset.h:731
void insert_range(BSLS_COMPILERFEATURES_FORWARD_REF(RANGE) range)
Definition bslstl_multiset.h:1186
~multiset()
Destroy this object.
Definition bslstl_multiset.h:2541
const_iterator cbegin() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_multiset.h:2981
bool contains(const key_type &key) const
Definition bslstl_multiset.h:3012
pair< iterator, iterator > equal_range(const key_type &key)
Definition bslstl_multiset.h:1433
const_iterator upper_bound(const key_type &key) const
Definition bslstl_multiset.h:1687
iterator emplace(Args &&... args)
Definition bslstl_multiset.h:2789
value_compare value_comp() const
Definition bslstl_multiset.h:3052
multiset & operator=(const multiset &rhs)
Definition bslstl_multiset.h:2550
KEY key_type
Definition bslstl_multiset.h:730
reverse_iterator rend() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_multiset.h:2634
bsl::enable_if< BloombergLP::bslmf::IsTransparentPredicate< COMPARATOR, LOOKUP_KEY >::value, iterator >::type find(const LOOKUP_KEY &key)
Definition bslstl_multiset.h:1339
iterator upper_bound(const key_type &key)
Definition bslstl_multiset.h:1395
bsl::enable_if< BloombergLP::bslmf::IsTransparentPredicate< COMPARATOR, LOOKUP_KEY >::value, pair< const_iterator, const_iterator > >::type equal_range(const LOOKUP_KEY &key) const
Definition bslstl_multiset.h:1753
iterator emplace_hint(const_iterator hint, Args &&... args)
Definition bslstl_multiset.h:2813
enable_if< BloombergLP::bslmf::IsTransparentPredicate< COMPARATOR, 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_multiset.h:1261
bsl::enable_if< BloombergLP::bslmf::IsTransparentPredicate< COMPARATOR, LOOKUP_KEY >::value, iterator >::type upper_bound(const LOOKUP_KEY &key)
Definition bslstl_multiset.h:1417
AllocatorTraits::const_pointer const_pointer
Definition bslstl_multiset.h:741
AllocatorTraits::difference_type difference_type
Definition bslstl_multiset.h:739
size_type count(const key_type &key) const
Definition bslstl_multiset.h:1604
const_iterator lower_bound(const key_type &key) const
Definition bslstl_multiset.h:1648
AllocatorTraits::pointer pointer
Definition bslstl_multiset.h:740
bsl::enable_if< BloombergLP::bslmf::IsTransparentPredicate< COMPARATOR, LOOKUP_KEY >::value, iterator >::type lower_bound(const LOOKUP_KEY &key)
Definition bslstl_multiset.h:1378
ALLOCATOR allocator_type
Definition bslstl_multiset.h:734
bsl::enable_if< BloombergLP::bslmf::IsTransparentPredicate< COMPARATOR, LOOKUP_KEY >::value, const_iterator >::type upper_bound(const LOOKUP_KEY &key) const
Definition bslstl_multiset.h:1709
reverse_iterator rbegin() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_multiset.h:2626
bsl::reverse_iterator< iterator > reverse_iterator
Definition bslstl_multiset.h:749
const value_type & const_reference
Definition bslstl_multiset.h:736
bsl::enable_if< BloombergLP::bslmf::IsTransparentPredicate< COMPARATOR, LOOKUP_KEY >::value, const_iterator >::type lower_bound(const LOOKUP_KEY &key) const
Definition bslstl_multiset.h:1670
pair< const_iterator, const_iterator > equal_range(const key_type &key) const
Definition bslstl_multiset.h:1726
bsl::enable_if< BloombergLP::bslmf::IsTransparentPredicate< COMPARATOR, LOOKUP_KEY >::value, const_iterator >::type find(const LOOKUP_KEY &key) const
Definition bslstl_multiset.h:1594
AllocatorTraits::size_type size_type
Definition bslstl_multiset.h:738
Definition bslstl_pair.h:1280
#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_MULTISET_REQUIRES_CONTAINER_COMPATIBLE_RANGE(R, T)
Definition bslstl_multiset.h:606
Definition bdlat_valuetypefunctions.h:939
void swap(array< VALUE_TYPE, SIZE > &lhs, array< VALUE_TYPE, SIZE > &rhs)
T::const_iterator cend(const T &container)
Definition bslstl_iterator.h:1709
bool operator<(const array< VALUE_TYPE, SIZE > &lhs, const array< VALUE_TYPE, SIZE > &rhs)
T::const_reverse_iterator crbegin(const T &container)
Definition bslstl_iterator.h:1695
bool operator>(const array< VALUE_TYPE, SIZE > &lhs, const array< VALUE_TYPE, SIZE > &rhs)
bool operator>=(const array< VALUE_TYPE, SIZE > &lhs, const array< VALUE_TYPE, SIZE > &rhs)
bool operator<=(const array< VALUE_TYPE, SIZE > &lhs, const 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
T::const_iterator cbegin(const T &container)
Definition bslstl_iterator.h:1651
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)
T::const_reverse_iterator crend(const T &container)
Definition bslstl_iterator.h:1752
Definition bdlc_flathashmap.h:2218
Definition baljsn_encoder_testtypes.h:76
Definition bdlbb_blob.h:579
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_ranges.h:301
Definition bslmf_isconvertible.h:875
Definition bslalg_hasstliterators.h:99
Definition bslma_usesbslmaallocator.h:344