1757 d_tree, this->comparator(), key));
1766 template <
class LOOKUP_KEY>
1768 BloombergLP::bslmf::IsTransparentPredicate<COMPARATOR,
1774 d_tree, this->comparator(), key));
1785 return (
find(key) !=
end()) ? 1 : 0;
1797 template <
class LOOKUP_KEY>
1799 BloombergLP::bslmf::IsTransparentPredicate<COMPARATOR,
1807 while (it !=
end() && !comparator()(key, *it.node())) {
1827 return const_iterator(BloombergLP::bslalg::RbTreeUtil::lowerBound(
1828 d_tree, this->comparator(), key));
1842 template <
class LOOKUP_KEY>
1844 BloombergLP::bslmf::IsTransparentPredicate<COMPARATOR,
1849 return const_iterator(BloombergLP::bslalg::RbTreeUtil::lowerBound(
1850 d_tree, this->comparator(), key));
1866 return const_iterator(BloombergLP::bslalg::RbTreeUtil::upperBound(
1867 d_tree, this->comparator(), key));
1881 template <
class LOOKUP_KEY>
1883 BloombergLP::bslmf::IsTransparentPredicate<COMPARATOR,
1888 return const_iterator(BloombergLP::bslalg::RbTreeUtil::upperBound(
1889 d_tree, this->comparator(), key));
1909 if (endIt !=
end() && !comparator()(key, *endIt.node())) {
1931 template <
class LOOKUP_KEY>
1933 BloombergLP::bslmf::IsTransparentPredicate<COMPARATOR,
1940 if (endIt !=
end() && !comparator()(key, *endIt.node())) {
1948 if (endIt !=
end() && !comparator()(key, *endIt.node())) {
1958#ifdef BSLS_COMPILERFEATURES_SUPPORT_CTAD
1968 class INPUT_ITERATOR,
1969 class KEY =
typename bsl::iterator_traits<INPUT_ITERATOR>::value_type,
1970 class COMPARATOR = std::less<KEY>,
1972 class = bsl::enable_if_t<!bsl::IsStdAllocator_v<COMPARATOR>>,
1973 class = bsl::enable_if_t<
bsl::IsStdAllocator_v<ALLOCATOR>>
1977 COMPARATOR = COMPARATOR(),
1978 ALLOCATOR = ALLOCATOR())
1979-> set<KEY, COMPARATOR, ALLOCATOR>;
1987 class INPUT_ITERATOR,
1991 typename BloombergLP::bslstl::IteratorUtil::IterVal_t<INPUT_ITERATOR>,
1992 class DEFAULT_ALLOCATOR = bsl::allocator<KEY>,
1993 class = bsl::enable_if_t<bsl::is_convertible_v<ALLOC *, DEFAULT_ALLOCATOR>>
1995set(INPUT_ITERATOR, INPUT_ITERATOR, COMPARATOR, ALLOC *)
1996-> set<KEY, COMPARATOR>;
2004 class INPUT_ITERATOR,
2007 typename BloombergLP::bslstl::IteratorUtil::IterVal_t<INPUT_ITERATOR>,
2008 class = bsl::enable_if_t<bsl::IsStdAllocator_v<ALLOCATOR>>
2010set(INPUT_ITERATOR, INPUT_ITERATOR, ALLOCATOR)
2011-> set<KEY, std::less<KEY>, ALLOCATOR>;
2018 class INPUT_ITERATOR,
2021 typename BloombergLP::bslstl::IteratorUtil::IterVal_t<INPUT_ITERATOR>,
2022 class DEFAULT_ALLOCATOR = bsl::allocator<KEY>,
2023 class = bsl::enable_if_t<bsl::is_convertible_v<ALLOC *, DEFAULT_ALLOCATOR>>
2025set(INPUT_ITERATOR, INPUT_ITERATOR, ALLOC *)
2034 class COMPARATOR = std::less<KEY>,
2035 class ALLOCATOR = bsl::allocator<KEY>,
2036 class = bsl::enable_if_t<!bsl::IsStdAllocator_v<COMPARATOR>>,
2037 class = bsl::enable_if_t<bsl::IsStdAllocator_v<ALLOCATOR>>
2039set(std::initializer_list<KEY>,
2040 COMPARATOR = COMPARATOR(),
2041 ALLOCATOR = ALLOCATOR())
2042-> set<KEY, COMPARATOR, ALLOCATOR>;
2053 class DEFAULT_ALLOCATOR = bsl::allocator<KEY>,
2054 class = bsl::enable_if_t<bsl::is_convertible_v<ALLOC *, DEFAULT_ALLOCATOR>>
2056set(std::initializer_list<KEY>, COMPARATOR, ALLOC *)
2057-> set<KEY, COMPARATOR>;
2066 class = bsl::enable_if_t<bsl::IsStdAllocator_v<ALLOCATOR>>
2068set(std::initializer_list<KEY>, ALLOCATOR)
2069-> set<KEY, std::less<KEY>, ALLOCATOR>;
2078 class DEFAULT_ALLOCATOR = bsl::allocator<KEY>,
2079 class = bsl::enable_if_t<bsl::is_convertible_v<ALLOC *, DEFAULT_ALLOCATOR>>
2081set(std::initializer_list<KEY>, ALLOC *)
2095template <class KEY, class COMPARATOR, class ALLOCATOR>
2096bool operator==(const set<KEY, COMPARATOR, ALLOCATOR>& lhs,
2097 const set<KEY, COMPARATOR, ALLOCATOR>& rhs);
2099#ifndef BSLS_COMPILERFEATURES_SUPPORT_THREE_WAY_COMPARISON
2107template <class KEY, class COMPARATOR, class ALLOCATOR>
2108bool operator!=(const set<KEY, COMPARATOR, ALLOCATOR>& lhs,
2109 const set<KEY, COMPARATOR, ALLOCATOR>& rhs);
2112#ifdef BSLALG_SYNTHTHREEWAYUTIL_AVAILABLE
2117template <class KEY, class COMPARATOR, class ALLOCATOR>
2118BloombergLP::bslalg::SynthThreeWayUtil::Result<KEY>
2119operator<=>(const set<KEY, COMPARATOR, ALLOCATOR>& lhs,
2120 const set<KEY, COMPARATOR, ALLOCATOR>& rhs);
2135template <class KEY, class COMPARATOR, class ALLOCATOR>
2136bool operator< (const set<KEY, COMPARATOR, ALLOCATOR>& lhs,
2137 const set<KEY, COMPARATOR, ALLOCATOR>& rhs);
2147template <class KEY, class COMPARATOR, class ALLOCATOR>
2148bool operator> (const set<KEY, COMPARATOR, ALLOCATOR>& lhs,
2149 const set<KEY, COMPARATOR, ALLOCATOR>& rhs);
2159template <class KEY, class COMPARATOR, class ALLOCATOR>
2160bool operator<=(const set<KEY, COMPARATOR, ALLOCATOR>& lhs,
2161 const set<KEY, COMPARATOR, ALLOCATOR>& rhs);
2171template <class KEY, class COMPARATOR, class ALLOCATOR>
2172bool operator>=(const set<KEY, COMPARATOR, ALLOCATOR>& lhs,
2173 const set<KEY, COMPARATOR, ALLOCATOR>& rhs);
2181template <class KEY, class COMPARATOR, class ALLOCATOR, class PREDICATE>
2182typename
set<KEY, COMPARATOR, ALLOCATOR>::size_type
2183erase_if(set<KEY, COMPARATOR, ALLOCATOR>& s, PREDICATE predicate);
2203template <class KEY, class COMPARATOR, class ALLOCATOR>
2204void swap(set<KEY, COMPARATOR, ALLOCATOR>& a,
2205 set<KEY, COMPARATOR, ALLOCATOR>& b)
2207 BSLS_KEYWORD_NOEXCEPT_OPERATOR(a.swap(b)));
2218template <class KEY, class COMPARATOR, class ALLOCATOR>
2220set<KEY, COMPARATOR, ALLOCATOR>::DataWrapper::DataWrapper(
2221 const COMPARATOR& comparator,
2222 const ALLOCATOR& basicAllocator)
2223:
::bsl::set<KEY, COMPARATOR, ALLOCATOR>::Comparator(comparator)
2224, d_pool(basicAllocator)
2228template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2230set<KEY, COMPARATOR, ALLOCATOR>::DataWrapper::DataWrapper(
2231 BloombergLP::bslmf::MovableRef<DataWrapper> original)
2232: ::
bsl::set<KEY, COMPARATOR, ALLOCATOR>::Comparator(
2233 MoveUtil::access(original).keyComparator())
2234, d_pool(MoveUtil::move(MoveUtil::access(original).d_pool))
2238template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2240typename set<KEY, COMPARATOR, ALLOCATOR>::NodeFactory&
2241set<KEY, COMPARATOR, ALLOCATOR>::DataWrapper::nodeFactory()
2246template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2248const typename set<KEY, COMPARATOR, ALLOCATOR>::NodeFactory&
2249set<KEY, COMPARATOR, ALLOCATOR>::DataWrapper::nodeFactory()
const
2259template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2261typename set<KEY, COMPARATOR, ALLOCATOR>::NodeFactory&
2262set<KEY, COMPARATOR, ALLOCATOR>::nodeFactory()
2264 return d_compAndAlloc.nodeFactory();
2267template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2269typename set<KEY, COMPARATOR, ALLOCATOR>::Comparator&
2270set<KEY, COMPARATOR, ALLOCATOR>::comparator()
2272 return d_compAndAlloc;
2275template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2277void set<KEY, COMPARATOR, ALLOCATOR>::quickSwapExchangeAllocators(set& other)
2279 BloombergLP::bslalg::RbTreeUtil::swap(&d_tree, &other.d_tree);
2280 nodeFactory().swapExchangeAllocators(other.nodeFactory());
2288 if (
sizeof(NodeFactory) !=
sizeof(DataWrapper)) {
2289 comparator().swap(other.comparator());
2293template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2295void set<KEY, COMPARATOR, ALLOCATOR>::quickSwapRetainAllocators(set& other)
2297 BloombergLP::bslalg::RbTreeUtil::swap(&d_tree, &other.d_tree);
2298 nodeFactory().swapRetainAllocators(other.nodeFactory());
2302 if (
sizeof(NodeFactory) !=
sizeof(DataWrapper)) {
2303 comparator().swap(other.comparator());
2307template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2308template <
class INPUT_ITERATOR,
class SENTINEL>
2310void set<KEY, COMPARATOR, ALLOCATOR>::constructFromRange(INPUT_ITERATOR first,
2313 if (first == last) {
2318 BloombergLP::bslstl::IteratorUtil::
2319 canCalculateInsertDistance<INPUT_ITERATOR, SENTINEL>()) {
2320 const size_type numElements =
static_cast<size_type
>(
2321 BloombergLP::bslstl::IteratorUtil::insertDistance(first, last));
2322 nodeFactory().reserveNodes(numElements);
2325 BloombergLP::bslalg::RbTreeUtilTreeProctor<NodeFactory> proctor(
2336 BloombergLP::bslalg::RbTreeNode *prevNode = d_tree.rootNode();
2338 while (++first != last) {
2340 const value_type& value = *first;
2341 if (this->comparator()(value, *prevNode)) {
2344 insertFromRange(++first, last);
2348 if (this->comparator()(*prevNode, value)) {
2349 BloombergLP::bslalg::RbTreeNode *node =
2350 nodeFactory().emplaceIntoNewNode(value);
2351 BloombergLP::bslalg::RbTreeUtil::insertAt(&d_tree,
2362#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS) \
2363 && defined(BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES)
2365template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2366template <
class INPUT_ITERATOR,
class SENTINEL>
2368void set<KEY, COMPARATOR, ALLOCATOR>::constructFromRange(
2369 INPUT_ITERATOR first,
2375 !BloombergLP::bslstl::IteratorUtil
2376 ::canCalculateInsertDistance<INPUT_ITERATOR, SENTINEL>()
2377 || numElements ==
static_cast<size_type
>(
2378 BloombergLP::bslstl::IteratorUtil::insertDistance(first, last))));
2380 if (first == last) {
2384 if (0 < numElements) {
2385 nodeFactory().reserveNodes(numElements);
2388 BloombergLP::bslalg::RbTreeUtilTreeProctor<NodeFactory> proctor(
2398 insert(*first); --numElements;
2399 BloombergLP::bslalg::RbTreeNode *prevNode = d_tree.rootNode();
2401 while (++first != last) {
2403 const value_type& value = *first;
2404 if (this->comparator()(value, *prevNode)) {
2406 insert(value); --numElements;
2407 insertFromRange(++first, last, numElements);
2411 if (this->comparator()(*prevNode, value)) {
2412 BloombergLP::bslalg::RbTreeNode *node =
2413 nodeFactory().emplaceIntoNewNode(value);
2414 BloombergLP::bslalg::RbTreeUtil::insertAt(&d_tree,
2428template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2429template <
class INPUT_ITERATOR,
class SENTINEL>
2431void set<KEY, COMPARATOR, ALLOCATOR>::insertFromRange(INPUT_ITERATOR first,
2450 while (first != last) {
2452 if (BloombergLP::bslstl::IteratorUtil
2453 ::canCalculateInsertDistance<INPUT_ITERATOR, SENTINEL>()
2455 !nodeFactory().hasFreeNodes())) {
2456 nodeFactory().reserveNodes(
2457 BloombergLP::bslstl::IteratorUtil::insertDistance(first, last));
2465#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS) \
2466 && defined(BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES)
2468template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2469template <
class INPUT_ITERATOR,
class SENTINEL>
2471void set<KEY, COMPARATOR, ALLOCATOR>::insertFromRange(
2472 INPUT_ITERATOR first,
2477 !BloombergLP::bslstl::IteratorUtil
2478 ::canCalculateInsertDistance<INPUT_ITERATOR, SENTINEL>()
2479 || numElements ==
static_cast<size_type
>(
2480 BloombergLP::bslstl::IteratorUtil::insertDistance(first, last))));
2482 while (first != last) {
2485 !nodeFactory().hasFreeNodes())) {
2486 nodeFactory().reserveNodes(numElements);
2498template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2500const typename set<KEY, COMPARATOR, ALLOCATOR>::NodeFactory&
2501set<KEY, COMPARATOR, ALLOCATOR>::nodeFactory()
const
2503 return d_compAndAlloc.nodeFactory();
2506template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2508const typename set<KEY, COMPARATOR, ALLOCATOR>::Comparator&
2509set<KEY, COMPARATOR, ALLOCATOR>::comparator()
const
2511 return d_compAndAlloc;
2515template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2518: d_compAndAlloc(COMPARATOR(), ALLOCATOR())
2523template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2526: d_compAndAlloc(COMPARATOR(), basicAllocator)
2531template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2534: d_compAndAlloc(original.comparator().keyComparator(),
2539 if (0 < original.
size()) {
2540 nodeFactory().reserveNodes(original.
size());
2541 BloombergLP::bslalg::RbTreeUtil::copyTree(&d_tree,
2547template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2550 BloombergLP::bslmf::MovableRef<set> original)
2551: d_compAndAlloc(MoveUtil::move(MoveUtil::access(original).d_compAndAlloc))
2554 set& lvalue = original;
2555 BloombergLP::bslalg::RbTreeUtil::swap(&d_tree, &lvalue.d_tree);
2558template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2561 const set& original,
2562 const typename type_identity<ALLOCATOR>::type& basicAllocator)
2563: d_compAndAlloc(original.comparator().keyComparator(), basicAllocator)
2566 if (0 < original.
size()) {
2567 nodeFactory().reserveNodes(original.
size());
2568 BloombergLP::bslalg::RbTreeUtil::copyTree(&d_tree,
2574template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2577 BloombergLP::bslmf::MovableRef<set> original,
2578 const typename type_identity<ALLOCATOR>::type& basicAllocator)
2579: d_compAndAlloc(MoveUtil::access(original).comparator().keyComparator(),
2583 set& lvalue = original;
2586 nodeFactory().
allocator() == lvalue.nodeFactory().allocator())) {
2587 d_compAndAlloc.nodeFactory().adopt(
2588 MoveUtil::move(lvalue.d_compAndAlloc.nodeFactory()));
2589 BloombergLP::bslalg::RbTreeUtil::swap(&d_tree, &lvalue.d_tree);
2592 if (0 < lvalue.
size()) {
2593 nodeFactory().reserveNodes(lvalue.
size());
2594 BloombergLP::bslalg::RbTreeUtil::moveTree(&d_tree,
2597 &lvalue.nodeFactory());
2602template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2603template <
class INPUT_ITERATOR>
2606 INPUT_ITERATOR last,
2607 const COMPARATOR& comparator,
2608 const ALLOCATOR& basicAllocator)
2609: d_compAndAlloc(comparator, basicAllocator)
2612 if (first != last) {
2615 BloombergLP::bslstl::IteratorUtil::insertDistance(first, last));
2617 if (0 < numElements) {
2618 nodeFactory().reserveNodes(numElements);
2621 BloombergLP::bslalg::RbTreeUtilTreeProctor<NodeFactory> proctor(
2632 BloombergLP::bslalg::RbTreeNode *prevNode = d_tree.rootNode();
2633 while (++first != last) {
2637 if (this->comparator()(value, *prevNode)) {
2643 if (this->comparator()(*prevNode, value)) {
2644 BloombergLP::bslalg::RbTreeNode *node =
2645 nodeFactory().emplaceIntoNewNode(value);
2646 BloombergLP::bslalg::RbTreeUtil::insertAt(&d_tree,
2658template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2659template <
class INPUT_ITERATOR>
2662 INPUT_ITERATOR last,
2663 const ALLOCATOR& basicAllocator)
2664: d_compAndAlloc(COMPARATOR(), basicAllocator)
2667 if (first != last) {
2670 BloombergLP::bslstl::IteratorUtil::insertDistance(first, last));
2672 if (0 < numElements) {
2673 nodeFactory().reserveNodes(numElements);
2676 BloombergLP::bslalg::RbTreeUtilTreeProctor<NodeFactory> proctor(
2687 BloombergLP::bslalg::RbTreeNode *prevNode = d_tree.rootNode();
2688 while (++first != last) {
2692 if (this->comparator()(value, *prevNode)) {
2698 if (this->comparator()(*prevNode, value)) {
2699 BloombergLP::bslalg::RbTreeNode *node =
2700 nodeFactory().emplaceIntoNewNode(value);
2701 BloombergLP::bslalg::RbTreeUtil::insertAt(&d_tree,
2713#if defined(BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS)
2714template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2717 const COMPARATOR& comparator,
2718 const ALLOCATOR& basicAllocator)
2719:
set(values.
begin(), values.
end(), comparator, basicAllocator)
2723template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2726 const ALLOCATOR& basicAllocator)
2727: set(values.begin(), values.end(), COMPARATOR(), basicAllocator)
2732template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2740template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2746 if (AllocatorTraits::propagate_on_container_copy_assignment::value) {
2747 set other(
rhs,
rhs.nodeFactory().allocator());
2748 quickSwapExchangeAllocators(other);
2752 quickSwapRetainAllocators(other);
2758template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2762 BloombergLP::bslmf::MovableRef<set>
rhs)
2764 AllocatorTraits::is_always_equal::value
2765 && std::is_nothrow_move_assignable<COMPARATOR>::value)
2770 if (nodeFactory().
allocator() == lvalue.nodeFactory().allocator()) {
2771 set other(MoveUtil::move(lvalue));
2772 quickSwapRetainAllocators(other);
2775 AllocatorTraits::propagate_on_container_move_assignment::value) {
2776 set other(MoveUtil::move(lvalue));
2777 quickSwapExchangeAllocators(other);
2780 set other(MoveUtil::move(lvalue), nodeFactory().allocator());
2781 quickSwapRetainAllocators(other);
2787#if defined(BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS)
2788template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2790set<KEY, COMPARATOR, ALLOCATOR>&
2794 insert(values.begin(), values.end());
2799template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2804 return iterator(d_tree.firstNode());
2807template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2812 return iterator(d_tree.sentinel());
2815template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2823template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2831template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2836 int comparisonResult;
2837 BloombergLP::bslalg::RbTreeNode *insertLocation =
2838 BloombergLP::bslalg::RbTreeUtil::findUniqueInsertLocation(
2843 if (!comparisonResult) {
2847 BloombergLP::bslalg::RbTreeNode *node =
2848 nodeFactory().emplaceIntoNewNode(value);
2849 BloombergLP::bslalg::RbTreeUtil::insertAt(&d_tree,
2851 comparisonResult < 0,
2856template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2860 BloombergLP::bslmf::MovableRef<value_type> value)
2863 int comparisonResult;
2864 BloombergLP::bslalg::RbTreeNode *insertLocation =
2865 BloombergLP::bslalg::RbTreeUtil::findUniqueInsertLocation(
2870 if (!comparisonResult) {
2874 BloombergLP::bslalg::RbTreeNode *node =
2875 nodeFactory().emplaceIntoNewNode(MoveUtil::move(lvalue));
2876 BloombergLP::bslalg::RbTreeUtil::insertAt(&d_tree,
2878 comparisonResult < 0,
2883template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2889 BloombergLP::bslalg::RbTreeNode *hintNode =
2890 const_cast<BloombergLP::bslalg::RbTreeNode *
>(hint.node());
2891 int comparisonResult;
2892 BloombergLP::bslalg::RbTreeNode *insertLocation =
2893 BloombergLP::bslalg::RbTreeUtil::findUniqueInsertLocation(
2899 if (!comparisonResult) {
2903 BloombergLP::bslalg::RbTreeNode *node =
2904 nodeFactory().emplaceIntoNewNode(value);
2905 BloombergLP::bslalg::RbTreeUtil::insertAt(&d_tree,
2907 comparisonResult < 0,
2912template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2916 BloombergLP::bslmf::MovableRef<value_type> value)
2919 BloombergLP::bslalg::RbTreeNode *hintNode =
2920 const_cast<BloombergLP::bslalg::RbTreeNode *
>(hint.node());
2921 int comparisonResult;
2922 BloombergLP::bslalg::RbTreeNode *insertLocation =
2923 BloombergLP::bslalg::RbTreeUtil::findUniqueInsertLocation(
2929 if (!comparisonResult) {
2933 BloombergLP::bslalg::RbTreeNode *node =
2934 nodeFactory().emplaceIntoNewNode(MoveUtil::move(lvalue));
2936 BloombergLP::bslalg::RbTreeUtil::insertAt(&d_tree,
2938 comparisonResult < 0,
2943template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2944template <
class INPUT_ITERATOR>
2947 INPUT_ITERATOR last)
2961 while (first != last) {
2962 if (BloombergLP::bslstl::IteratorUtil::
2963 canCalculateInsertDistance<INPUT_ITERATOR,INPUT_ITERATOR>()
2965 !nodeFactory().hasFreeNodes())) {
2967 BloombergLP::bslstl::IteratorUtil::insertDistance(first, last));
2968 nodeFactory().reserveNodes(numElements);
2975#if defined(BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS)
2976template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2980 insert(values.begin(), values.end());
2984#if !BSLS_COMPILERFEATURES_SIMULATE_CPP11_FEATURES
2985template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
2986template <
class... Args>
2988pair<typename set<KEY, COMPARATOR, ALLOCATOR>::iterator,
bool>
2991 BloombergLP::bslalg::RbTreeNode *node = nodeFactory().emplaceIntoNewNode(
2993 int comparisonResult;
2994 BloombergLP::bslalg::RbTreeNode *insertLocation =
2995 BloombergLP::bslalg::RbTreeUtil::findUniqueInsertLocation(
2999 static_cast<const Node *
>(node)->value());
3000 if (!comparisonResult) {
3001 nodeFactory().deleteNode(node);
3005 BloombergLP::bslalg::RbTreeUtil::insertAt(&d_tree,
3007 comparisonResult < 0,
3012template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3013template <
class... Args>
3017 Args&&... arguments)
3019 BloombergLP::bslalg::RbTreeNode *node = nodeFactory().emplaceIntoNewNode(
3021 BloombergLP::bslalg::RbTreeNode *hintNode =
3022 const_cast<BloombergLP::bslalg::RbTreeNode *
>(hint.node());
3023 int comparisonResult;
3024 BloombergLP::bslalg::RbTreeNode *insertLocation =
3025 BloombergLP::bslalg::RbTreeUtil::findUniqueInsertLocation(
3029 static_cast<const Node *
>(node)->value(),
3031 if (!comparisonResult) {
3032 nodeFactory().deleteNode(node);
3036 BloombergLP::bslalg::RbTreeUtil::insertAt(&d_tree,
3038 comparisonResult < 0,
3044template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3051 BloombergLP::bslalg::RbTreeNode *node =
3052 const_cast<BloombergLP::bslalg::RbTreeNode *
>(position.node());
3053 BloombergLP::bslalg::RbTreeNode *result =
3054 BloombergLP::bslalg::RbTreeUtil::next(node);
3055 BloombergLP::bslalg::RbTreeUtil::remove(&d_tree, node);
3056 nodeFactory().deleteNode(node);
3060template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3073template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3079 while (first != last) {
3080 first =
erase(first);
3085template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3089 AllocatorTraits::is_always_equal::value
3090 && bsl::is_nothrow_swappable<COMPARATOR>::value)
3092 if (AllocatorTraits::propagate_on_container_swap::value) {
3093 quickSwapExchangeAllocators(other);
3100 nodeFactory().allocator() == other.nodeFactory().allocator())) {
3101 quickSwapRetainAllocators(other);
3106 set toOtherCopy(MoveUtil::move(*
this),
3107 other.nodeFactory().allocator());
3108 set toThisCopy(MoveUtil::move(other), nodeFactory().allocator());
3110 this->quickSwapRetainAllocators(toThisCopy);
3111 other.quickSwapRetainAllocators(toOtherCopy);
3116template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3122 if (d_tree.rootNode()) {
3126 BloombergLP::bslalg::RbTreeUtil::deleteTree(&d_tree, &nodeFactory());
3128#if defined(BSLS_ASSERT_SAFE_IS_USED)
3137template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3142 return nodeFactory().allocator();
3145template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3153template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3161template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3169template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3177template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3185template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3193template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3201template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3209template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3213 return find(key) !=
end();
3217template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3221 return 0 == d_tree.numNodes();
3224template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3229 return d_tree.numNodes();
3232template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3237 return AllocatorTraits::max_size(get_allocator());
3240template <
class KEY,
class COMPARATOR,
class ALLOCATOR>
3245 return comparator().keyComparator();
3248template <
class KEY,
class COMPARATOR,
class ALLOCATOR>