alloc/collections/btree/
set.rs

1use core::borrow::Borrow;
2use core::cmp::Ordering::{self, Equal, Greater, Less};
3use core::cmp::{max, min};
4use core::fmt::{self, Debug};
5use core::hash::{Hash, Hasher};
6use core::iter::{FusedIterator, Peekable};
7use core::mem::ManuallyDrop;
8use core::ops::{BitAnd, BitOr, BitXor, Bound, RangeBounds, Sub};
9
10use super::map::{self, BTreeMap, Keys};
11use super::merge_iter::MergeIterInner;
12use super::set_val::SetValZST;
13use crate::alloc::{Allocator, Global};
14use crate::vec::Vec;
15
16mod entry;
17
18#[unstable(feature = "btree_set_entry", issue = "133549")]
19pub use self::entry::{Entry, OccupiedEntry, VacantEntry};
20
21/// An ordered set based on a B-Tree.
22///
23/// See [`BTreeMap`]'s documentation for a detailed discussion of this collection's performance
24/// benefits and drawbacks.
25///
26/// It is a logic error for an item to be modified in such a way that the item's ordering relative
27/// to any other item, as determined by the [`Ord`] trait, changes while it is in the set. This is
28/// normally only possible through [`Cell`], [`RefCell`], global state, I/O, or unsafe code.
29/// The behavior resulting from such a logic error is not specified, but will be encapsulated to the
30/// `BTreeSet` that observed the logic error and not result in undefined behavior. This could
31/// include panics, incorrect results, aborts, memory leaks, and non-termination.
32///
33/// Iterators returned by [`BTreeSet::iter`] and [`BTreeSet::into_iter`] produce their items in order, and take worst-case
34/// logarithmic and amortized constant time per item returned.
35///
36/// [`Cell`]: core::cell::Cell
37/// [`RefCell`]: core::cell::RefCell
38///
39/// # Examples
40///
41/// ```
42/// use std::collections::BTreeSet;
43///
44/// // Type inference lets us omit an explicit type signature (which
45/// // would be `BTreeSet<&str>` in this example).
46/// let mut books = BTreeSet::new();
47///
48/// // Add some books.
49/// books.insert("A Dance With Dragons");
50/// books.insert("To Kill a Mockingbird");
51/// books.insert("The Odyssey");
52/// books.insert("The Great Gatsby");
53///
54/// // Check for a specific one.
55/// if !books.contains("The Winds of Winter") {
56///     println!("We have {} books, but The Winds of Winter ain't one.",
57///              books.len());
58/// }
59///
60/// // Remove a book.
61/// books.remove("The Odyssey");
62///
63/// // Iterate over everything.
64/// for book in &books {
65///     println!("{book}");
66/// }
67/// ```
68///
69/// A `BTreeSet` with a known list of items can be initialized from an array:
70///
71/// ```
72/// use std::collections::BTreeSet;
73///
74/// let set = BTreeSet::from([1, 2, 3]);
75/// ```
76#[stable(feature = "rust1", since = "1.0.0")]
77#[cfg_attr(not(test), rustc_diagnostic_item = "BTreeSet")]
78pub struct BTreeSet<
79    T,
80    #[unstable(feature = "allocator_api", issue = "32838")] A: Allocator + Clone = Global,
81> {
82    map: BTreeMap<T, SetValZST, A>,
83}
84
85#[stable(feature = "rust1", since = "1.0.0")]
86impl<T: Hash, A: Allocator + Clone> Hash for BTreeSet<T, A> {
87    fn hash<H: Hasher>(&self, state: &mut H) {
88        self.map.hash(state)
89    }
90}
91
92#[stable(feature = "rust1", since = "1.0.0")]
93impl<T: PartialEq, A: Allocator + Clone> PartialEq for BTreeSet<T, A> {
94    fn eq(&self, other: &BTreeSet<T, A>) -> bool {
95        self.map.eq(&other.map)
96    }
97}
98
99#[stable(feature = "rust1", since = "1.0.0")]
100impl<T: Eq, A: Allocator + Clone> Eq for BTreeSet<T, A> {}
101
102#[stable(feature = "rust1", since = "1.0.0")]
103impl<T: PartialOrd, A: Allocator + Clone> PartialOrd for BTreeSet<T, A> {
104    fn partial_cmp(&self, other: &BTreeSet<T, A>) -> Option<Ordering> {
105        self.map.partial_cmp(&other.map)
106    }
107}
108
109#[stable(feature = "rust1", since = "1.0.0")]
110impl<T: Ord, A: Allocator + Clone> Ord for BTreeSet<T, A> {
111    fn cmp(&self, other: &BTreeSet<T, A>) -> Ordering {
112        self.map.cmp(&other.map)
113    }
114}
115
116#[stable(feature = "rust1", since = "1.0.0")]
117impl<T: Clone, A: Allocator + Clone> Clone for BTreeSet<T, A> {
118    fn clone(&self) -> Self {
119        BTreeSet { map: self.map.clone() }
120    }
121
122    fn clone_from(&mut self, source: &Self) {
123        self.map.clone_from(&source.map);
124    }
125}
126
127/// An iterator over the items of a `BTreeSet`.
128///
129/// This `struct` is created by the [`iter`] method on [`BTreeSet`].
130/// See its documentation for more.
131///
132/// [`iter`]: BTreeSet::iter
133#[must_use = "iterators are lazy and do nothing unless consumed"]
134#[stable(feature = "rust1", since = "1.0.0")]
135pub struct Iter<'a, T: 'a> {
136    iter: Keys<'a, T, SetValZST>,
137}
138
139#[stable(feature = "collection_debug", since = "1.17.0")]
140impl<T: fmt::Debug> fmt::Debug for Iter<'_, T> {
141    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
142        f.debug_tuple("Iter").field(&self.iter).finish()
143    }
144}
145
146/// An owning iterator over the items of a `BTreeSet` in ascending order.
147///
148/// This `struct` is created by the [`into_iter`] method on [`BTreeSet`]
149/// (provided by the [`IntoIterator`] trait). See its documentation for more.
150///
151/// [`into_iter`]: BTreeSet#method.into_iter
152#[stable(feature = "rust1", since = "1.0.0")]
153#[derive(Debug)]
154pub struct IntoIter<
155    T,
156    #[unstable(feature = "allocator_api", issue = "32838")] A: Allocator + Clone = Global,
157> {
158    iter: super::map::IntoIter<T, SetValZST, A>,
159}
160
161/// An iterator over a sub-range of items in a `BTreeSet`.
162///
163/// This `struct` is created by the [`range`] method on [`BTreeSet`].
164/// See its documentation for more.
165///
166/// [`range`]: BTreeSet::range
167#[must_use = "iterators are lazy and do nothing unless consumed"]
168#[derive(Debug)]
169#[stable(feature = "btree_range", since = "1.17.0")]
170pub struct Range<'a, T: 'a> {
171    iter: super::map::Range<'a, T, SetValZST>,
172}
173
174/// A lazy iterator producing elements in the difference of `BTreeSet`s.
175///
176/// This `struct` is created by the [`difference`] method on [`BTreeSet`].
177/// See its documentation for more.
178///
179/// [`difference`]: BTreeSet::difference
180#[must_use = "this returns the difference as an iterator, \
181              without modifying either input set"]
182#[stable(feature = "rust1", since = "1.0.0")]
183pub struct Difference<
184    'a,
185    T: 'a,
186    #[unstable(feature = "allocator_api", issue = "32838")] A: Allocator + Clone = Global,
187> {
188    inner: DifferenceInner<'a, T, A>,
189}
190enum DifferenceInner<'a, T: 'a, A: Allocator + Clone> {
191    Stitch {
192        // iterate all of `self` and some of `other`, spotting matches along the way
193        self_iter: Iter<'a, T>,
194        other_iter: Peekable<Iter<'a, T>>,
195    },
196    Search {
197        // iterate `self`, look up in `other`
198        self_iter: Iter<'a, T>,
199        other_set: &'a BTreeSet<T, A>,
200    },
201    Iterate(Iter<'a, T>), // simply produce all elements in `self`
202}
203
204// Explicit Debug impl necessary because of issue #26925
205impl<T: Debug, A: Allocator + Clone> Debug for DifferenceInner<'_, T, A> {
206    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
207        match self {
208            DifferenceInner::Stitch { self_iter, other_iter } => f
209                .debug_struct("Stitch")
210                .field("self_iter", self_iter)
211                .field("other_iter", other_iter)
212                .finish(),
213            DifferenceInner::Search { self_iter, other_set } => f
214                .debug_struct("Search")
215                .field("self_iter", self_iter)
216                .field("other_iter", other_set)
217                .finish(),
218            DifferenceInner::Iterate(x) => f.debug_tuple("Iterate").field(x).finish(),
219        }
220    }
221}
222
223#[stable(feature = "collection_debug", since = "1.17.0")]
224impl<T: fmt::Debug, A: Allocator + Clone> fmt::Debug for Difference<'_, T, A> {
225    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
226        f.debug_tuple("Difference").field(&self.inner).finish()
227    }
228}
229
230/// A lazy iterator producing elements in the symmetric difference of `BTreeSet`s.
231///
232/// This `struct` is created by the [`symmetric_difference`] method on
233/// [`BTreeSet`]. See its documentation for more.
234///
235/// [`symmetric_difference`]: BTreeSet::symmetric_difference
236#[must_use = "this returns the difference as an iterator, \
237              without modifying either input set"]
238#[stable(feature = "rust1", since = "1.0.0")]
239pub struct SymmetricDifference<'a, T: 'a>(MergeIterInner<Iter<'a, T>>);
240
241#[stable(feature = "collection_debug", since = "1.17.0")]
242impl<T: fmt::Debug> fmt::Debug for SymmetricDifference<'_, T> {
243    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
244        f.debug_tuple("SymmetricDifference").field(&self.0).finish()
245    }
246}
247
248/// A lazy iterator producing elements in the intersection of `BTreeSet`s.
249///
250/// This `struct` is created by the [`intersection`] method on [`BTreeSet`].
251/// See its documentation for more.
252///
253/// [`intersection`]: BTreeSet::intersection
254#[must_use = "this returns the intersection as an iterator, \
255              without modifying either input set"]
256#[stable(feature = "rust1", since = "1.0.0")]
257pub struct Intersection<
258    'a,
259    T: 'a,
260    #[unstable(feature = "allocator_api", issue = "32838")] A: Allocator + Clone = Global,
261> {
262    inner: IntersectionInner<'a, T, A>,
263}
264enum IntersectionInner<'a, T: 'a, A: Allocator + Clone> {
265    Stitch {
266        // iterate similarly sized sets jointly, spotting matches along the way
267        a: Iter<'a, T>,
268        b: Iter<'a, T>,
269    },
270    Search {
271        // iterate a small set, look up in the large set
272        small_iter: Iter<'a, T>,
273        large_set: &'a BTreeSet<T, A>,
274    },
275    Answer(Option<&'a T>), // return a specific element or emptiness
276}
277
278// Explicit Debug impl necessary because of issue #26925
279impl<T: Debug, A: Allocator + Clone> Debug for IntersectionInner<'_, T, A> {
280    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
281        match self {
282            IntersectionInner::Stitch { a, b } => {
283                f.debug_struct("Stitch").field("a", a).field("b", b).finish()
284            }
285            IntersectionInner::Search { small_iter, large_set } => f
286                .debug_struct("Search")
287                .field("small_iter", small_iter)
288                .field("large_set", large_set)
289                .finish(),
290            IntersectionInner::Answer(x) => f.debug_tuple("Answer").field(x).finish(),
291        }
292    }
293}
294
295#[stable(feature = "collection_debug", since = "1.17.0")]
296impl<T: Debug, A: Allocator + Clone> Debug for Intersection<'_, T, A> {
297    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
298        f.debug_tuple("Intersection").field(&self.inner).finish()
299    }
300}
301
302/// A lazy iterator producing elements in the union of `BTreeSet`s.
303///
304/// This `struct` is created by the [`union`] method on [`BTreeSet`].
305/// See its documentation for more.
306///
307/// [`union`]: BTreeSet::union
308#[must_use = "this returns the union as an iterator, \
309              without modifying either input set"]
310#[stable(feature = "rust1", since = "1.0.0")]
311pub struct Union<'a, T: 'a>(MergeIterInner<Iter<'a, T>>);
312
313#[stable(feature = "collection_debug", since = "1.17.0")]
314impl<T: fmt::Debug> fmt::Debug for Union<'_, T> {
315    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
316        f.debug_tuple("Union").field(&self.0).finish()
317    }
318}
319
320// This constant is used by functions that compare two sets.
321// It estimates the relative size at which searching performs better
322// than iterating, based on the benchmarks in
323// https://github.com/ssomers/rust_bench_btreeset_intersection.
324// It's used to divide rather than multiply sizes, to rule out overflow,
325// and it's a power of two to make that division cheap.
326const ITER_PERFORMANCE_TIPPING_SIZE_DIFF: usize = 16;
327
328impl<T> BTreeSet<T> {
329    /// Makes a new, empty `BTreeSet`.
330    ///
331    /// Does not allocate anything on its own.
332    ///
333    /// # Examples
334    ///
335    /// ```
336    /// # #![allow(unused_mut)]
337    /// use std::collections::BTreeSet;
338    ///
339    /// let mut set: BTreeSet<i32> = BTreeSet::new();
340    /// ```
341    #[stable(feature = "rust1", since = "1.0.0")]
342    #[rustc_const_stable(feature = "const_btree_new", since = "1.66.0")]
343    #[must_use]
344    pub const fn new() -> BTreeSet<T> {
345        BTreeSet { map: BTreeMap::new() }
346    }
347}
348
349impl<T, A: Allocator + Clone> BTreeSet<T, A> {
350    /// Makes a new `BTreeSet` with a reasonable choice of B.
351    ///
352    /// # Examples
353    ///
354    /// ```
355    /// # #![allow(unused_mut)]
356    /// # #![feature(allocator_api)]
357    /// # #![feature(btreemap_alloc)]
358    /// use std::collections::BTreeSet;
359    /// use std::alloc::Global;
360    ///
361    /// let mut set: BTreeSet<i32> = BTreeSet::new_in(Global);
362    /// ```
363    #[unstable(feature = "btreemap_alloc", issue = "32838")]
364    pub const fn new_in(alloc: A) -> BTreeSet<T, A> {
365        BTreeSet { map: BTreeMap::new_in(alloc) }
366    }
367
368    /// Constructs a double-ended iterator over a sub-range of elements in the set.
369    /// The simplest way is to use the range syntax `min..max`, thus `range(min..max)` will
370    /// yield elements from min (inclusive) to max (exclusive).
371    /// The range may also be entered as `(Bound<T>, Bound<T>)`, so for example
372    /// `range((Excluded(4), Included(10)))` will yield a left-exclusive, right-inclusive
373    /// range from 4 to 10.
374    ///
375    /// # Panics
376    ///
377    /// Panics if range `start > end`.
378    /// Panics if range `start == end` and both bounds are `Excluded`.
379    ///
380    /// # Examples
381    ///
382    /// ```
383    /// use std::collections::BTreeSet;
384    /// use std::ops::Bound::Included;
385    ///
386    /// let mut set = BTreeSet::new();
387    /// set.insert(3);
388    /// set.insert(5);
389    /// set.insert(8);
390    /// for &elem in set.range((Included(&4), Included(&8))) {
391    ///     println!("{elem}");
392    /// }
393    /// assert_eq!(Some(&5), set.range(4..).next());
394    /// ```
395    #[stable(feature = "btree_range", since = "1.17.0")]
396    pub fn range<K: ?Sized, R>(&self, range: R) -> Range<'_, T>
397    where
398        K: Ord,
399        T: Borrow<K> + Ord,
400        R: RangeBounds<K>,
401    {
402        Range { iter: self.map.range(range) }
403    }
404
405    /// Visits the elements representing the difference,
406    /// i.e., the elements that are in `self` but not in `other`,
407    /// in ascending order.
408    ///
409    /// # Examples
410    ///
411    /// ```
412    /// use std::collections::BTreeSet;
413    ///
414    /// let mut a = BTreeSet::new();
415    /// a.insert(1);
416    /// a.insert(2);
417    ///
418    /// let mut b = BTreeSet::new();
419    /// b.insert(2);
420    /// b.insert(3);
421    ///
422    /// let diff: Vec<_> = a.difference(&b).cloned().collect();
423    /// assert_eq!(diff, [1]);
424    /// ```
425    #[stable(feature = "rust1", since = "1.0.0")]
426    pub fn difference<'a>(&'a self, other: &'a BTreeSet<T, A>) -> Difference<'a, T, A>
427    where
428        T: Ord,
429    {
430        let (self_min, self_max) =
431            if let (Some(self_min), Some(self_max)) = (self.first(), self.last()) {
432                (self_min, self_max)
433            } else {
434                return Difference { inner: DifferenceInner::Iterate(self.iter()) };
435            };
436        let (other_min, other_max) =
437            if let (Some(other_min), Some(other_max)) = (other.first(), other.last()) {
438                (other_min, other_max)
439            } else {
440                return Difference { inner: DifferenceInner::Iterate(self.iter()) };
441            };
442        Difference {
443            inner: match (self_min.cmp(other_max), self_max.cmp(other_min)) {
444                (Greater, _) | (_, Less) => DifferenceInner::Iterate(self.iter()),
445                (Equal, _) => {
446                    let mut self_iter = self.iter();
447                    self_iter.next();
448                    DifferenceInner::Iterate(self_iter)
449                }
450                (_, Equal) => {
451                    let mut self_iter = self.iter();
452                    self_iter.next_back();
453                    DifferenceInner::Iterate(self_iter)
454                }
455                _ if self.len() <= other.len() / ITER_PERFORMANCE_TIPPING_SIZE_DIFF => {
456                    DifferenceInner::Search { self_iter: self.iter(), other_set: other }
457                }
458                _ => DifferenceInner::Stitch {
459                    self_iter: self.iter(),
460                    other_iter: other.iter().peekable(),
461                },
462            },
463        }
464    }
465
466    /// Visits the elements representing the symmetric difference,
467    /// i.e., the elements that are in `self` or in `other` but not in both,
468    /// in ascending order.
469    ///
470    /// # Examples
471    ///
472    /// ```
473    /// use std::collections::BTreeSet;
474    ///
475    /// let mut a = BTreeSet::new();
476    /// a.insert(1);
477    /// a.insert(2);
478    ///
479    /// let mut b = BTreeSet::new();
480    /// b.insert(2);
481    /// b.insert(3);
482    ///
483    /// let sym_diff: Vec<_> = a.symmetric_difference(&b).cloned().collect();
484    /// assert_eq!(sym_diff, [1, 3]);
485    /// ```
486    #[stable(feature = "rust1", since = "1.0.0")]
487    pub fn symmetric_difference<'a>(
488        &'a self,
489        other: &'a BTreeSet<T, A>,
490    ) -> SymmetricDifference<'a, T>
491    where
492        T: Ord,
493    {
494        SymmetricDifference(MergeIterInner::new(self.iter(), other.iter()))
495    }
496
497    /// Visits the elements representing the intersection,
498    /// i.e., the elements that are both in `self` and `other`,
499    /// in ascending order.
500    ///
501    /// # Examples
502    ///
503    /// ```
504    /// use std::collections::BTreeSet;
505    ///
506    /// let mut a = BTreeSet::new();
507    /// a.insert(1);
508    /// a.insert(2);
509    ///
510    /// let mut b = BTreeSet::new();
511    /// b.insert(2);
512    /// b.insert(3);
513    ///
514    /// let intersection: Vec<_> = a.intersection(&b).cloned().collect();
515    /// assert_eq!(intersection, [2]);
516    /// ```
517    #[stable(feature = "rust1", since = "1.0.0")]
518    pub fn intersection<'a>(&'a self, other: &'a BTreeSet<T, A>) -> Intersection<'a, T, A>
519    where
520        T: Ord,
521    {
522        let (self_min, self_max) =
523            if let (Some(self_min), Some(self_max)) = (self.first(), self.last()) {
524                (self_min, self_max)
525            } else {
526                return Intersection { inner: IntersectionInner::Answer(None) };
527            };
528        let (other_min, other_max) =
529            if let (Some(other_min), Some(other_max)) = (other.first(), other.last()) {
530                (other_min, other_max)
531            } else {
532                return Intersection { inner: IntersectionInner::Answer(None) };
533            };
534        Intersection {
535            inner: match (self_min.cmp(other_max), self_max.cmp(other_min)) {
536                (Greater, _) | (_, Less) => IntersectionInner::Answer(None),
537                (Equal, _) => IntersectionInner::Answer(Some(self_min)),
538                (_, Equal) => IntersectionInner::Answer(Some(self_max)),
539                _ if self.len() <= other.len() / ITER_PERFORMANCE_TIPPING_SIZE_DIFF => {
540                    IntersectionInner::Search { small_iter: self.iter(), large_set: other }
541                }
542                _ if other.len() <= self.len() / ITER_PERFORMANCE_TIPPING_SIZE_DIFF => {
543                    IntersectionInner::Search { small_iter: other.iter(), large_set: self }
544                }
545                _ => IntersectionInner::Stitch { a: self.iter(), b: other.iter() },
546            },
547        }
548    }
549
550    /// Visits the elements representing the union,
551    /// i.e., all the elements in `self` or `other`, without duplicates,
552    /// in ascending order.
553    ///
554    /// # Examples
555    ///
556    /// ```
557    /// use std::collections::BTreeSet;
558    ///
559    /// let mut a = BTreeSet::new();
560    /// a.insert(1);
561    ///
562    /// let mut b = BTreeSet::new();
563    /// b.insert(2);
564    ///
565    /// let union: Vec<_> = a.union(&b).cloned().collect();
566    /// assert_eq!(union, [1, 2]);
567    /// ```
568    #[stable(feature = "rust1", since = "1.0.0")]
569    pub fn union<'a>(&'a self, other: &'a BTreeSet<T, A>) -> Union<'a, T>
570    where
571        T: Ord,
572    {
573        Union(MergeIterInner::new(self.iter(), other.iter()))
574    }
575
576    /// Clears the set, removing all elements.
577    ///
578    /// # Examples
579    ///
580    /// ```
581    /// use std::collections::BTreeSet;
582    ///
583    /// let mut v = BTreeSet::new();
584    /// v.insert(1);
585    /// v.clear();
586    /// assert!(v.is_empty());
587    /// ```
588    #[stable(feature = "rust1", since = "1.0.0")]
589    pub fn clear(&mut self)
590    where
591        A: Clone,
592    {
593        self.map.clear()
594    }
595
596    /// Returns `true` if the set contains an element equal to the value.
597    ///
598    /// The value may be any borrowed form of the set's element type,
599    /// but the ordering on the borrowed form *must* match the
600    /// ordering on the element type.
601    ///
602    /// # Examples
603    ///
604    /// ```
605    /// use std::collections::BTreeSet;
606    ///
607    /// let set = BTreeSet::from([1, 2, 3]);
608    /// assert_eq!(set.contains(&1), true);
609    /// assert_eq!(set.contains(&4), false);
610    /// ```
611    #[stable(feature = "rust1", since = "1.0.0")]
612    pub fn contains<Q: ?Sized>(&self, value: &Q) -> bool
613    where
614        T: Borrow<Q> + Ord,
615        Q: Ord,
616    {
617        self.map.contains_key(value)
618    }
619
620    /// Returns a reference to the element in the set, if any, that is equal to
621    /// the value.
622    ///
623    /// The value may be any borrowed form of the set's element type,
624    /// but the ordering on the borrowed form *must* match the
625    /// ordering on the element type.
626    ///
627    /// # Examples
628    ///
629    /// ```
630    /// use std::collections::BTreeSet;
631    ///
632    /// let set = BTreeSet::from([1, 2, 3]);
633    /// assert_eq!(set.get(&2), Some(&2));
634    /// assert_eq!(set.get(&4), None);
635    /// ```
636    #[stable(feature = "set_recovery", since = "1.9.0")]
637    pub fn get<Q: ?Sized>(&self, value: &Q) -> Option<&T>
638    where
639        T: Borrow<Q> + Ord,
640        Q: Ord,
641    {
642        self.map.get_key_value(value).map(|(k, _)| k)
643    }
644
645    /// Returns `true` if `self` has no elements in common with `other`.
646    /// This is equivalent to checking for an empty intersection.
647    ///
648    /// # Examples
649    ///
650    /// ```
651    /// use std::collections::BTreeSet;
652    ///
653    /// let a = BTreeSet::from([1, 2, 3]);
654    /// let mut b = BTreeSet::new();
655    ///
656    /// assert_eq!(a.is_disjoint(&b), true);
657    /// b.insert(4);
658    /// assert_eq!(a.is_disjoint(&b), true);
659    /// b.insert(1);
660    /// assert_eq!(a.is_disjoint(&b), false);
661    /// ```
662    #[must_use]
663    #[stable(feature = "rust1", since = "1.0.0")]
664    pub fn is_disjoint(&self, other: &BTreeSet<T, A>) -> bool
665    where
666        T: Ord,
667    {
668        self.intersection(other).next().is_none()
669    }
670
671    /// Returns `true` if the set is a subset of another,
672    /// i.e., `other` contains at least all the elements in `self`.
673    ///
674    /// # Examples
675    ///
676    /// ```
677    /// use std::collections::BTreeSet;
678    ///
679    /// let sup = BTreeSet::from([1, 2, 3]);
680    /// let mut set = BTreeSet::new();
681    ///
682    /// assert_eq!(set.is_subset(&sup), true);
683    /// set.insert(2);
684    /// assert_eq!(set.is_subset(&sup), true);
685    /// set.insert(4);
686    /// assert_eq!(set.is_subset(&sup), false);
687    /// ```
688    #[must_use]
689    #[stable(feature = "rust1", since = "1.0.0")]
690    pub fn is_subset(&self, other: &BTreeSet<T, A>) -> bool
691    where
692        T: Ord,
693    {
694        // Same result as self.difference(other).next().is_none()
695        // but the code below is faster (hugely in some cases).
696        if self.len() > other.len() {
697            return false;
698        }
699        let (self_min, self_max) =
700            if let (Some(self_min), Some(self_max)) = (self.first(), self.last()) {
701                (self_min, self_max)
702            } else {
703                return true; // self is empty
704            };
705        let (other_min, other_max) =
706            if let (Some(other_min), Some(other_max)) = (other.first(), other.last()) {
707                (other_min, other_max)
708            } else {
709                return false; // other is empty
710            };
711        let mut self_iter = self.iter();
712        match self_min.cmp(other_min) {
713            Less => return false,
714            Equal => {
715                self_iter.next();
716            }
717            Greater => (),
718        }
719        match self_max.cmp(other_max) {
720            Greater => return false,
721            Equal => {
722                self_iter.next_back();
723            }
724            Less => (),
725        }
726        if self_iter.len() <= other.len() / ITER_PERFORMANCE_TIPPING_SIZE_DIFF {
727            for next in self_iter {
728                if !other.contains(next) {
729                    return false;
730                }
731            }
732        } else {
733            let mut other_iter = other.iter();
734            other_iter.next();
735            other_iter.next_back();
736            let mut self_next = self_iter.next();
737            while let Some(self1) = self_next {
738                match other_iter.next().map_or(Less, |other1| self1.cmp(other1)) {
739                    Less => return false,
740                    Equal => self_next = self_iter.next(),
741                    Greater => (),
742                }
743            }
744        }
745        true
746    }
747
748    /// Returns `true` if the set is a superset of another,
749    /// i.e., `self` contains at least all the elements in `other`.
750    ///
751    /// # Examples
752    ///
753    /// ```
754    /// use std::collections::BTreeSet;
755    ///
756    /// let sub = BTreeSet::from([1, 2]);
757    /// let mut set = BTreeSet::new();
758    ///
759    /// assert_eq!(set.is_superset(&sub), false);
760    ///
761    /// set.insert(0);
762    /// set.insert(1);
763    /// assert_eq!(set.is_superset(&sub), false);
764    ///
765    /// set.insert(2);
766    /// assert_eq!(set.is_superset(&sub), true);
767    /// ```
768    #[must_use]
769    #[stable(feature = "rust1", since = "1.0.0")]
770    pub fn is_superset(&self, other: &BTreeSet<T, A>) -> bool
771    where
772        T: Ord,
773    {
774        other.is_subset(self)
775    }
776
777    /// Returns a reference to the first element in the set, if any.
778    /// This element is always the minimum of all elements in the set.
779    ///
780    /// # Examples
781    ///
782    /// Basic usage:
783    ///
784    /// ```
785    /// use std::collections::BTreeSet;
786    ///
787    /// let mut set = BTreeSet::new();
788    /// assert_eq!(set.first(), None);
789    /// set.insert(1);
790    /// assert_eq!(set.first(), Some(&1));
791    /// set.insert(2);
792    /// assert_eq!(set.first(), Some(&1));
793    /// ```
794    #[must_use]
795    #[stable(feature = "map_first_last", since = "1.66.0")]
796    #[rustc_confusables("front")]
797    pub fn first(&self) -> Option<&T>
798    where
799        T: Ord,
800    {
801        self.map.first_key_value().map(|(k, _)| k)
802    }
803
804    /// Returns a reference to the last element in the set, if any.
805    /// This element is always the maximum of all elements in the set.
806    ///
807    /// # Examples
808    ///
809    /// Basic usage:
810    ///
811    /// ```
812    /// use std::collections::BTreeSet;
813    ///
814    /// let mut set = BTreeSet::new();
815    /// assert_eq!(set.last(), None);
816    /// set.insert(1);
817    /// assert_eq!(set.last(), Some(&1));
818    /// set.insert(2);
819    /// assert_eq!(set.last(), Some(&2));
820    /// ```
821    #[must_use]
822    #[stable(feature = "map_first_last", since = "1.66.0")]
823    #[rustc_confusables("back")]
824    pub fn last(&self) -> Option<&T>
825    where
826        T: Ord,
827    {
828        self.map.last_key_value().map(|(k, _)| k)
829    }
830
831    /// Removes the first element from the set and returns it, if any.
832    /// The first element is always the minimum element in the set.
833    ///
834    /// # Examples
835    ///
836    /// ```
837    /// use std::collections::BTreeSet;
838    ///
839    /// let mut set = BTreeSet::new();
840    ///
841    /// set.insert(1);
842    /// while let Some(n) = set.pop_first() {
843    ///     assert_eq!(n, 1);
844    /// }
845    /// assert!(set.is_empty());
846    /// ```
847    #[stable(feature = "map_first_last", since = "1.66.0")]
848    pub fn pop_first(&mut self) -> Option<T>
849    where
850        T: Ord,
851    {
852        self.map.pop_first().map(|kv| kv.0)
853    }
854
855    /// Removes the last element from the set and returns it, if any.
856    /// The last element is always the maximum element in the set.
857    ///
858    /// # Examples
859    ///
860    /// ```
861    /// use std::collections::BTreeSet;
862    ///
863    /// let mut set = BTreeSet::new();
864    ///
865    /// set.insert(1);
866    /// while let Some(n) = set.pop_last() {
867    ///     assert_eq!(n, 1);
868    /// }
869    /// assert!(set.is_empty());
870    /// ```
871    #[stable(feature = "map_first_last", since = "1.66.0")]
872    pub fn pop_last(&mut self) -> Option<T>
873    where
874        T: Ord,
875    {
876        self.map.pop_last().map(|kv| kv.0)
877    }
878
879    /// Adds a value to the set.
880    ///
881    /// Returns whether the value was newly inserted. That is:
882    ///
883    /// - If the set did not previously contain an equal value, `true` is
884    ///   returned.
885    /// - If the set already contained an equal value, `false` is returned, and
886    ///   the entry is not updated.
887    ///
888    /// See the [module-level documentation] for more.
889    ///
890    /// [module-level documentation]: index.html#insert-and-complex-keys
891    ///
892    /// # Examples
893    ///
894    /// ```
895    /// use std::collections::BTreeSet;
896    ///
897    /// let mut set = BTreeSet::new();
898    ///
899    /// assert_eq!(set.insert(2), true);
900    /// assert_eq!(set.insert(2), false);
901    /// assert_eq!(set.len(), 1);
902    /// ```
903    #[stable(feature = "rust1", since = "1.0.0")]
904    #[rustc_confusables("push", "put")]
905    pub fn insert(&mut self, value: T) -> bool
906    where
907        T: Ord,
908    {
909        self.map.insert(value, SetValZST::default()).is_none()
910    }
911
912    /// Adds a value to the set, replacing the existing element, if any, that is
913    /// equal to the value. Returns the replaced element.
914    ///
915    /// # Examples
916    ///
917    /// ```
918    /// use std::collections::BTreeSet;
919    ///
920    /// let mut set = BTreeSet::new();
921    /// set.insert(Vec::<i32>::new());
922    ///
923    /// assert_eq!(set.get(&[][..]).unwrap().capacity(), 0);
924    /// set.replace(Vec::with_capacity(10));
925    /// assert_eq!(set.get(&[][..]).unwrap().capacity(), 10);
926    /// ```
927    #[stable(feature = "set_recovery", since = "1.9.0")]
928    #[rustc_confusables("swap")]
929    pub fn replace(&mut self, value: T) -> Option<T>
930    where
931        T: Ord,
932    {
933        self.map.replace(value)
934    }
935
936    /// Inserts the given `value` into the set if it is not present, then
937    /// returns a reference to the value in the set.
938    ///
939    /// # Examples
940    ///
941    /// ```
942    /// #![feature(btree_set_entry)]
943    ///
944    /// use std::collections::BTreeSet;
945    ///
946    /// let mut set = BTreeSet::from([1, 2, 3]);
947    /// assert_eq!(set.len(), 3);
948    /// assert_eq!(set.get_or_insert(2), &2);
949    /// assert_eq!(set.get_or_insert(100), &100);
950    /// assert_eq!(set.len(), 4); // 100 was inserted
951    /// ```
952    #[inline]
953    #[unstable(feature = "btree_set_entry", issue = "133549")]
954    pub fn get_or_insert(&mut self, value: T) -> &T
955    where
956        T: Ord,
957    {
958        self.map.entry(value).insert_entry(SetValZST).into_key()
959    }
960
961    /// Inserts a value computed from `f` into the set if the given `value` is
962    /// not present, then returns a reference to the value in the set.
963    ///
964    /// # Examples
965    ///
966    /// ```
967    /// #![feature(btree_set_entry)]
968    ///
969    /// use std::collections::BTreeSet;
970    ///
971    /// let mut set: BTreeSet<String> = ["cat", "dog", "horse"]
972    ///     .iter().map(|&pet| pet.to_owned()).collect();
973    ///
974    /// assert_eq!(set.len(), 3);
975    /// for &pet in &["cat", "dog", "fish"] {
976    ///     let value = set.get_or_insert_with(pet, str::to_owned);
977    ///     assert_eq!(value, pet);
978    /// }
979    /// assert_eq!(set.len(), 4); // a new "fish" was inserted
980    /// ```
981    #[inline]
982    #[unstable(feature = "btree_set_entry", issue = "133549")]
983    pub fn get_or_insert_with<Q: ?Sized, F>(&mut self, value: &Q, f: F) -> &T
984    where
985        T: Borrow<Q> + Ord,
986        Q: Ord,
987        F: FnOnce(&Q) -> T,
988    {
989        self.map.get_or_insert_with(value, f)
990    }
991
992    /// Gets the given value's corresponding entry in the set for in-place manipulation.
993    ///
994    /// # Examples
995    ///
996    /// ```
997    /// #![feature(btree_set_entry)]
998    ///
999    /// use std::collections::BTreeSet;
1000    /// use std::collections::btree_set::Entry::*;
1001    ///
1002    /// let mut singles = BTreeSet::new();
1003    /// let mut dupes = BTreeSet::new();
1004    ///
1005    /// for ch in "a short treatise on fungi".chars() {
1006    ///     if let Vacant(dupe_entry) = dupes.entry(ch) {
1007    ///         // We haven't already seen a duplicate, so
1008    ///         // check if we've at least seen it once.
1009    ///         match singles.entry(ch) {
1010    ///             Vacant(single_entry) => {
1011    ///                 // We found a new character for the first time.
1012    ///                 single_entry.insert()
1013    ///             }
1014    ///             Occupied(single_entry) => {
1015    ///                 // We've already seen this once, "move" it to dupes.
1016    ///                 single_entry.remove();
1017    ///                 dupe_entry.insert();
1018    ///             }
1019    ///         }
1020    ///     }
1021    /// }
1022    ///
1023    /// assert!(!singles.contains(&'t') && dupes.contains(&'t'));
1024    /// assert!(singles.contains(&'u') && !dupes.contains(&'u'));
1025    /// assert!(!singles.contains(&'v') && !dupes.contains(&'v'));
1026    /// ```
1027    #[inline]
1028    #[unstable(feature = "btree_set_entry", issue = "133549")]
1029    pub fn entry(&mut self, value: T) -> Entry<'_, T, A>
1030    where
1031        T: Ord,
1032    {
1033        match self.map.entry(value) {
1034            map::Entry::Occupied(entry) => Entry::Occupied(OccupiedEntry { inner: entry }),
1035            map::Entry::Vacant(entry) => Entry::Vacant(VacantEntry { inner: entry }),
1036        }
1037    }
1038
1039    /// If the set contains an element equal to the value, removes it from the
1040    /// set and drops it. Returns whether such an element was present.
1041    ///
1042    /// The value may be any borrowed form of the set's element type,
1043    /// but the ordering on the borrowed form *must* match the
1044    /// ordering on the element type.
1045    ///
1046    /// # Examples
1047    ///
1048    /// ```
1049    /// use std::collections::BTreeSet;
1050    ///
1051    /// let mut set = BTreeSet::new();
1052    ///
1053    /// set.insert(2);
1054    /// assert_eq!(set.remove(&2), true);
1055    /// assert_eq!(set.remove(&2), false);
1056    /// ```
1057    #[stable(feature = "rust1", since = "1.0.0")]
1058    pub fn remove<Q: ?Sized>(&mut self, value: &Q) -> bool
1059    where
1060        T: Borrow<Q> + Ord,
1061        Q: Ord,
1062    {
1063        self.map.remove(value).is_some()
1064    }
1065
1066    /// Removes and returns the element in the set, if any, that is equal to
1067    /// the value.
1068    ///
1069    /// The value may be any borrowed form of the set's element type,
1070    /// but the ordering on the borrowed form *must* match the
1071    /// ordering on the element type.
1072    ///
1073    /// # Examples
1074    ///
1075    /// ```
1076    /// use std::collections::BTreeSet;
1077    ///
1078    /// let mut set = BTreeSet::from([1, 2, 3]);
1079    /// assert_eq!(set.take(&2), Some(2));
1080    /// assert_eq!(set.take(&2), None);
1081    /// ```
1082    #[stable(feature = "set_recovery", since = "1.9.0")]
1083    pub fn take<Q: ?Sized>(&mut self, value: &Q) -> Option<T>
1084    where
1085        T: Borrow<Q> + Ord,
1086        Q: Ord,
1087    {
1088        self.map.remove_entry(value).map(|(k, _)| k)
1089    }
1090
1091    /// Retains only the elements specified by the predicate.
1092    ///
1093    /// In other words, remove all elements `e` for which `f(&e)` returns `false`.
1094    /// The elements are visited in ascending order.
1095    ///
1096    /// # Examples
1097    ///
1098    /// ```
1099    /// use std::collections::BTreeSet;
1100    ///
1101    /// let mut set = BTreeSet::from([1, 2, 3, 4, 5, 6]);
1102    /// // Keep only the even numbers.
1103    /// set.retain(|&k| k % 2 == 0);
1104    /// assert!(set.iter().eq([2, 4, 6].iter()));
1105    /// ```
1106    #[stable(feature = "btree_retain", since = "1.53.0")]
1107    pub fn retain<F>(&mut self, mut f: F)
1108    where
1109        T: Ord,
1110        F: FnMut(&T) -> bool,
1111    {
1112        self.extract_if(.., |v| !f(v)).for_each(drop);
1113    }
1114
1115    /// Moves all elements from `other` into `self`, leaving `other` empty.
1116    ///
1117    /// # Examples
1118    ///
1119    /// ```
1120    /// use std::collections::BTreeSet;
1121    ///
1122    /// let mut a = BTreeSet::new();
1123    /// a.insert(1);
1124    /// a.insert(2);
1125    /// a.insert(3);
1126    ///
1127    /// let mut b = BTreeSet::new();
1128    /// b.insert(3);
1129    /// b.insert(4);
1130    /// b.insert(5);
1131    ///
1132    /// a.append(&mut b);
1133    ///
1134    /// assert_eq!(a.len(), 5);
1135    /// assert_eq!(b.len(), 0);
1136    ///
1137    /// assert!(a.contains(&1));
1138    /// assert!(a.contains(&2));
1139    /// assert!(a.contains(&3));
1140    /// assert!(a.contains(&4));
1141    /// assert!(a.contains(&5));
1142    /// ```
1143    #[stable(feature = "btree_append", since = "1.11.0")]
1144    pub fn append(&mut self, other: &mut Self)
1145    where
1146        T: Ord,
1147        A: Clone,
1148    {
1149        self.map.append(&mut other.map);
1150    }
1151
1152    /// Splits the collection into two at the value. Returns a new collection
1153    /// with all elements greater than or equal to the value.
1154    ///
1155    /// # Examples
1156    ///
1157    /// Basic usage:
1158    ///
1159    /// ```
1160    /// use std::collections::BTreeSet;
1161    ///
1162    /// let mut a = BTreeSet::new();
1163    /// a.insert(1);
1164    /// a.insert(2);
1165    /// a.insert(3);
1166    /// a.insert(17);
1167    /// a.insert(41);
1168    ///
1169    /// let b = a.split_off(&3);
1170    ///
1171    /// assert_eq!(a.len(), 2);
1172    /// assert_eq!(b.len(), 3);
1173    ///
1174    /// assert!(a.contains(&1));
1175    /// assert!(a.contains(&2));
1176    ///
1177    /// assert!(b.contains(&3));
1178    /// assert!(b.contains(&17));
1179    /// assert!(b.contains(&41));
1180    /// ```
1181    #[stable(feature = "btree_split_off", since = "1.11.0")]
1182    pub fn split_off<Q: ?Sized + Ord>(&mut self, value: &Q) -> Self
1183    where
1184        T: Borrow<Q> + Ord,
1185        A: Clone,
1186    {
1187        BTreeSet { map: self.map.split_off(value) }
1188    }
1189
1190    /// Creates an iterator that visits elements in the specified range in ascending order and
1191    /// uses a closure to determine if an element should be removed.
1192    ///
1193    /// If the closure returns `true`, the element is removed from the set and
1194    /// yielded. If the closure returns `false`, or panics, the element remains
1195    /// in the set and will not be yielded.
1196    ///
1197    /// If the returned `ExtractIf` is not exhausted, e.g. because it is dropped without iterating
1198    /// or the iteration short-circuits, then the remaining elements will be retained.
1199    /// Use [`retain`] with a negated predicate if you do not need the returned iterator.
1200    ///
1201    /// [`retain`]: BTreeSet::retain
1202    /// # Examples
1203    ///
1204    /// ```
1205    /// #![feature(btree_extract_if)]
1206    /// use std::collections::BTreeSet;
1207    ///
1208    /// // Splitting a set into even and odd values, reusing the original set:
1209    /// let mut set: BTreeSet<i32> = (0..8).collect();
1210    /// let evens: BTreeSet<_> = set.extract_if(.., |v| v % 2 == 0).collect();
1211    /// let odds = set;
1212    /// assert_eq!(evens.into_iter().collect::<Vec<_>>(), vec![0, 2, 4, 6]);
1213    /// assert_eq!(odds.into_iter().collect::<Vec<_>>(), vec![1, 3, 5, 7]);
1214    ///
1215    /// // Splitting a set into low and high halves, reusing the original set:
1216    /// let mut set: BTreeSet<i32> = (0..8).collect();
1217    /// let low: BTreeSet<_> = set.extract_if(0..4, |_v| true).collect();
1218    /// let high = set;
1219    /// assert_eq!(low.into_iter().collect::<Vec<_>>(), [0, 1, 2, 3]);
1220    /// assert_eq!(high.into_iter().collect::<Vec<_>>(), [4, 5, 6, 7]);
1221    /// ```
1222    #[unstable(feature = "btree_extract_if", issue = "70530")]
1223    pub fn extract_if<F, R>(&mut self, range: R, pred: F) -> ExtractIf<'_, T, R, F, A>
1224    where
1225        T: Ord,
1226        R: RangeBounds<T>,
1227        F: FnMut(&T) -> bool,
1228    {
1229        let (inner, alloc) = self.map.extract_if_inner(range);
1230        ExtractIf { pred, inner, alloc }
1231    }
1232
1233    /// Gets an iterator that visits the elements in the `BTreeSet` in ascending
1234    /// order.
1235    ///
1236    /// # Examples
1237    ///
1238    /// ```
1239    /// use std::collections::BTreeSet;
1240    ///
1241    /// let set = BTreeSet::from([3, 1, 2]);
1242    /// let mut set_iter = set.iter();
1243    /// assert_eq!(set_iter.next(), Some(&1));
1244    /// assert_eq!(set_iter.next(), Some(&2));
1245    /// assert_eq!(set_iter.next(), Some(&3));
1246    /// assert_eq!(set_iter.next(), None);
1247    /// ```
1248    #[stable(feature = "rust1", since = "1.0.0")]
1249    #[cfg_attr(not(test), rustc_diagnostic_item = "btreeset_iter")]
1250    pub fn iter(&self) -> Iter<'_, T> {
1251        Iter { iter: self.map.keys() }
1252    }
1253
1254    /// Returns the number of elements in the set.
1255    ///
1256    /// # Examples
1257    ///
1258    /// ```
1259    /// use std::collections::BTreeSet;
1260    ///
1261    /// let mut v = BTreeSet::new();
1262    /// assert_eq!(v.len(), 0);
1263    /// v.insert(1);
1264    /// assert_eq!(v.len(), 1);
1265    /// ```
1266    #[must_use]
1267    #[stable(feature = "rust1", since = "1.0.0")]
1268    #[rustc_const_unstable(
1269        feature = "const_btree_len",
1270        issue = "71835",
1271        implied_by = "const_btree_new"
1272    )]
1273    #[rustc_confusables("length", "size")]
1274    pub const fn len(&self) -> usize {
1275        self.map.len()
1276    }
1277
1278    /// Returns `true` if the set contains no elements.
1279    ///
1280    /// # Examples
1281    ///
1282    /// ```
1283    /// use std::collections::BTreeSet;
1284    ///
1285    /// let mut v = BTreeSet::new();
1286    /// assert!(v.is_empty());
1287    /// v.insert(1);
1288    /// assert!(!v.is_empty());
1289    /// ```
1290    #[must_use]
1291    #[stable(feature = "rust1", since = "1.0.0")]
1292    #[rustc_const_unstable(
1293        feature = "const_btree_len",
1294        issue = "71835",
1295        implied_by = "const_btree_new"
1296    )]
1297    pub const fn is_empty(&self) -> bool {
1298        self.len() == 0
1299    }
1300
1301    /// Returns a [`Cursor`] pointing at the gap before the smallest element
1302    /// greater than the given bound.
1303    ///
1304    /// Passing `Bound::Included(x)` will return a cursor pointing to the
1305    /// gap before the smallest element greater than or equal to `x`.
1306    ///
1307    /// Passing `Bound::Excluded(x)` will return a cursor pointing to the
1308    /// gap before the smallest element greater than `x`.
1309    ///
1310    /// Passing `Bound::Unbounded` will return a cursor pointing to the
1311    /// gap before the smallest element in the set.
1312    ///
1313    /// # Examples
1314    ///
1315    /// ```
1316    /// #![feature(btree_cursors)]
1317    ///
1318    /// use std::collections::BTreeSet;
1319    /// use std::ops::Bound;
1320    ///
1321    /// let set = BTreeSet::from([1, 2, 3, 4]);
1322    ///
1323    /// let cursor = set.lower_bound(Bound::Included(&2));
1324    /// assert_eq!(cursor.peek_prev(), Some(&1));
1325    /// assert_eq!(cursor.peek_next(), Some(&2));
1326    ///
1327    /// let cursor = set.lower_bound(Bound::Excluded(&2));
1328    /// assert_eq!(cursor.peek_prev(), Some(&2));
1329    /// assert_eq!(cursor.peek_next(), Some(&3));
1330    ///
1331    /// let cursor = set.lower_bound(Bound::Unbounded);
1332    /// assert_eq!(cursor.peek_prev(), None);
1333    /// assert_eq!(cursor.peek_next(), Some(&1));
1334    /// ```
1335    #[unstable(feature = "btree_cursors", issue = "107540")]
1336    pub fn lower_bound<Q: ?Sized>(&self, bound: Bound<&Q>) -> Cursor<'_, T>
1337    where
1338        T: Borrow<Q> + Ord,
1339        Q: Ord,
1340    {
1341        Cursor { inner: self.map.lower_bound(bound) }
1342    }
1343
1344    /// Returns a [`CursorMut`] pointing at the gap before the smallest element
1345    /// greater than the given bound.
1346    ///
1347    /// Passing `Bound::Included(x)` will return a cursor pointing to the
1348    /// gap before the smallest element greater than or equal to `x`.
1349    ///
1350    /// Passing `Bound::Excluded(x)` will return a cursor pointing to the
1351    /// gap before the smallest element greater than `x`.
1352    ///
1353    /// Passing `Bound::Unbounded` will return a cursor pointing to the
1354    /// gap before the smallest element in the set.
1355    ///
1356    /// # Examples
1357    ///
1358    /// ```
1359    /// #![feature(btree_cursors)]
1360    ///
1361    /// use std::collections::BTreeSet;
1362    /// use std::ops::Bound;
1363    ///
1364    /// let mut set = BTreeSet::from([1, 2, 3, 4]);
1365    ///
1366    /// let mut cursor = set.lower_bound_mut(Bound::Included(&2));
1367    /// assert_eq!(cursor.peek_prev(), Some(&1));
1368    /// assert_eq!(cursor.peek_next(), Some(&2));
1369    ///
1370    /// let mut cursor = set.lower_bound_mut(Bound::Excluded(&2));
1371    /// assert_eq!(cursor.peek_prev(), Some(&2));
1372    /// assert_eq!(cursor.peek_next(), Some(&3));
1373    ///
1374    /// let mut cursor = set.lower_bound_mut(Bound::Unbounded);
1375    /// assert_eq!(cursor.peek_prev(), None);
1376    /// assert_eq!(cursor.peek_next(), Some(&1));
1377    /// ```
1378    #[unstable(feature = "btree_cursors", issue = "107540")]
1379    pub fn lower_bound_mut<Q: ?Sized>(&mut self, bound: Bound<&Q>) -> CursorMut<'_, T, A>
1380    where
1381        T: Borrow<Q> + Ord,
1382        Q: Ord,
1383    {
1384        CursorMut { inner: self.map.lower_bound_mut(bound) }
1385    }
1386
1387    /// Returns a [`Cursor`] pointing at the gap after the greatest element
1388    /// smaller than the given bound.
1389    ///
1390    /// Passing `Bound::Included(x)` will return a cursor pointing to the
1391    /// gap after the greatest element smaller than or equal to `x`.
1392    ///
1393    /// Passing `Bound::Excluded(x)` will return a cursor pointing to the
1394    /// gap after the greatest element smaller than `x`.
1395    ///
1396    /// Passing `Bound::Unbounded` will return a cursor pointing to the
1397    /// gap after the greatest element in the set.
1398    ///
1399    /// # Examples
1400    ///
1401    /// ```
1402    /// #![feature(btree_cursors)]
1403    ///
1404    /// use std::collections::BTreeSet;
1405    /// use std::ops::Bound;
1406    ///
1407    /// let set = BTreeSet::from([1, 2, 3, 4]);
1408    ///
1409    /// let cursor = set.upper_bound(Bound::Included(&3));
1410    /// assert_eq!(cursor.peek_prev(), Some(&3));
1411    /// assert_eq!(cursor.peek_next(), Some(&4));
1412    ///
1413    /// let cursor = set.upper_bound(Bound::Excluded(&3));
1414    /// assert_eq!(cursor.peek_prev(), Some(&2));
1415    /// assert_eq!(cursor.peek_next(), Some(&3));
1416    ///
1417    /// let cursor = set.upper_bound(Bound::Unbounded);
1418    /// assert_eq!(cursor.peek_prev(), Some(&4));
1419    /// assert_eq!(cursor.peek_next(), None);
1420    /// ```
1421    #[unstable(feature = "btree_cursors", issue = "107540")]
1422    pub fn upper_bound<Q: ?Sized>(&self, bound: Bound<&Q>) -> Cursor<'_, T>
1423    where
1424        T: Borrow<Q> + Ord,
1425        Q: Ord,
1426    {
1427        Cursor { inner: self.map.upper_bound(bound) }
1428    }
1429
1430    /// Returns a [`CursorMut`] pointing at the gap after the greatest element
1431    /// smaller than the given bound.
1432    ///
1433    /// Passing `Bound::Included(x)` will return a cursor pointing to the
1434    /// gap after the greatest element smaller than or equal to `x`.
1435    ///
1436    /// Passing `Bound::Excluded(x)` will return a cursor pointing to the
1437    /// gap after the greatest element smaller than `x`.
1438    ///
1439    /// Passing `Bound::Unbounded` will return a cursor pointing to the
1440    /// gap after the greatest element in the set.
1441    ///
1442    /// # Examples
1443    ///
1444    /// ```
1445    /// #![feature(btree_cursors)]
1446    ///
1447    /// use std::collections::BTreeSet;
1448    /// use std::ops::Bound;
1449    ///
1450    /// let mut set = BTreeSet::from([1, 2, 3, 4]);
1451    ///
1452    /// let mut cursor = set.upper_bound_mut(Bound::Included(&3));
1453    /// assert_eq!(cursor.peek_prev(), Some(&3));
1454    /// assert_eq!(cursor.peek_next(), Some(&4));
1455    ///
1456    /// let mut cursor = set.upper_bound_mut(Bound::Excluded(&3));
1457    /// assert_eq!(cursor.peek_prev(), Some(&2));
1458    /// assert_eq!(cursor.peek_next(), Some(&3));
1459    ///
1460    /// let mut cursor = set.upper_bound_mut(Bound::Unbounded);
1461    /// assert_eq!(cursor.peek_prev(), Some(&4));
1462    /// assert_eq!(cursor.peek_next(), None);
1463    /// ```
1464    #[unstable(feature = "btree_cursors", issue = "107540")]
1465    pub fn upper_bound_mut<Q: ?Sized>(&mut self, bound: Bound<&Q>) -> CursorMut<'_, T, A>
1466    where
1467        T: Borrow<Q> + Ord,
1468        Q: Ord,
1469    {
1470        CursorMut { inner: self.map.upper_bound_mut(bound) }
1471    }
1472}
1473
1474#[stable(feature = "rust1", since = "1.0.0")]
1475impl<T: Ord> FromIterator<T> for BTreeSet<T> {
1476    fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> BTreeSet<T> {
1477        let mut inputs: Vec<_> = iter.into_iter().collect();
1478
1479        if inputs.is_empty() {
1480            return BTreeSet::new();
1481        }
1482
1483        // use stable sort to preserve the insertion order.
1484        inputs.sort();
1485        BTreeSet::from_sorted_iter(inputs.into_iter(), Global)
1486    }
1487}
1488
1489impl<T: Ord, A: Allocator + Clone> BTreeSet<T, A> {
1490    fn from_sorted_iter<I: Iterator<Item = T>>(iter: I, alloc: A) -> BTreeSet<T, A> {
1491        let iter = iter.map(|k| (k, SetValZST::default()));
1492        let map = BTreeMap::bulk_build_from_sorted_iter(iter, alloc);
1493        BTreeSet { map }
1494    }
1495}
1496
1497#[stable(feature = "std_collections_from_array", since = "1.56.0")]
1498impl<T: Ord, const N: usize> From<[T; N]> for BTreeSet<T> {
1499    /// Converts a `[T; N]` into a `BTreeSet<T>`.
1500    ///
1501    /// If the array contains any equal values,
1502    /// all but one will be dropped.
1503    ///
1504    /// # Examples
1505    ///
1506    /// ```
1507    /// use std::collections::BTreeSet;
1508    ///
1509    /// let set1 = BTreeSet::from([1, 2, 3, 4]);
1510    /// let set2: BTreeSet<_> = [1, 2, 3, 4].into();
1511    /// assert_eq!(set1, set2);
1512    /// ```
1513    fn from(mut arr: [T; N]) -> Self {
1514        if N == 0 {
1515            return BTreeSet::new();
1516        }
1517
1518        // use stable sort to preserve the insertion order.
1519        arr.sort();
1520        BTreeSet::from_sorted_iter(IntoIterator::into_iter(arr), Global)
1521    }
1522}
1523
1524#[stable(feature = "rust1", since = "1.0.0")]
1525impl<T, A: Allocator + Clone> IntoIterator for BTreeSet<T, A> {
1526    type Item = T;
1527    type IntoIter = IntoIter<T, A>;
1528
1529    /// Gets an iterator for moving out the `BTreeSet`'s contents in ascending order.
1530    ///
1531    /// # Examples
1532    ///
1533    /// ```
1534    /// use std::collections::BTreeSet;
1535    ///
1536    /// let set = BTreeSet::from([1, 2, 3, 4]);
1537    ///
1538    /// let v: Vec<_> = set.into_iter().collect();
1539    /// assert_eq!(v, [1, 2, 3, 4]);
1540    /// ```
1541    fn into_iter(self) -> IntoIter<T, A> {
1542        IntoIter { iter: self.map.into_iter() }
1543    }
1544}
1545
1546#[stable(feature = "rust1", since = "1.0.0")]
1547impl<'a, T, A: Allocator + Clone> IntoIterator for &'a BTreeSet<T, A> {
1548    type Item = &'a T;
1549    type IntoIter = Iter<'a, T>;
1550
1551    fn into_iter(self) -> Iter<'a, T> {
1552        self.iter()
1553    }
1554}
1555
1556/// An iterator produced by calling `extract_if` on BTreeSet.
1557#[unstable(feature = "btree_extract_if", issue = "70530")]
1558#[must_use = "iterators are lazy and do nothing unless consumed"]
1559pub struct ExtractIf<
1560    'a,
1561    T,
1562    R,
1563    F,
1564    #[unstable(feature = "allocator_api", issue = "32838")] A: Allocator + Clone = Global,
1565> {
1566    pred: F,
1567    inner: super::map::ExtractIfInner<'a, T, SetValZST, R>,
1568    /// The BTreeMap will outlive this IntoIter so we don't care about drop order for `alloc`.
1569    alloc: A,
1570}
1571
1572#[unstable(feature = "btree_extract_if", issue = "70530")]
1573impl<T, R, F, A> fmt::Debug for ExtractIf<'_, T, R, F, A>
1574where
1575    T: fmt::Debug,
1576    A: Allocator + Clone,
1577{
1578    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1579        f.debug_struct("ExtractIf")
1580            .field("peek", &self.inner.peek().map(|(k, _)| k))
1581            .finish_non_exhaustive()
1582    }
1583}
1584
1585#[unstable(feature = "btree_extract_if", issue = "70530")]
1586impl<T, R, F, A: Allocator + Clone> Iterator for ExtractIf<'_, T, R, F, A>
1587where
1588    T: PartialOrd,
1589    R: RangeBounds<T>,
1590    F: FnMut(&T) -> bool,
1591{
1592    type Item = T;
1593
1594    fn next(&mut self) -> Option<T> {
1595        let pred = &mut self.pred;
1596        let mut mapped_pred = |k: &T, _v: &mut SetValZST| pred(k);
1597        self.inner.next(&mut mapped_pred, self.alloc.clone()).map(|(k, _)| k)
1598    }
1599
1600    fn size_hint(&self) -> (usize, Option<usize>) {
1601        self.inner.size_hint()
1602    }
1603}
1604
1605#[unstable(feature = "btree_extract_if", issue = "70530")]
1606impl<T, R, F, A: Allocator + Clone> FusedIterator for ExtractIf<'_, T, R, F, A>
1607where
1608    T: PartialOrd,
1609    R: RangeBounds<T>,
1610    F: FnMut(&T) -> bool,
1611{
1612}
1613
1614#[stable(feature = "rust1", since = "1.0.0")]
1615impl<T: Ord, A: Allocator + Clone> Extend<T> for BTreeSet<T, A> {
1616    #[inline]
1617    fn extend<Iter: IntoIterator<Item = T>>(&mut self, iter: Iter) {
1618        iter.into_iter().for_each(move |elem| {
1619            self.insert(elem);
1620        });
1621    }
1622
1623    #[inline]
1624    fn extend_one(&mut self, elem: T) {
1625        self.insert(elem);
1626    }
1627}
1628
1629#[stable(feature = "extend_ref", since = "1.2.0")]
1630impl<'a, T: 'a + Ord + Copy, A: Allocator + Clone> Extend<&'a T> for BTreeSet<T, A> {
1631    fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I) {
1632        self.extend(iter.into_iter().cloned());
1633    }
1634
1635    #[inline]
1636    fn extend_one(&mut self, &elem: &'a T) {
1637        self.insert(elem);
1638    }
1639}
1640
1641#[stable(feature = "rust1", since = "1.0.0")]
1642impl<T> Default for BTreeSet<T> {
1643    /// Creates an empty `BTreeSet`.
1644    fn default() -> BTreeSet<T> {
1645        BTreeSet::new()
1646    }
1647}
1648
1649#[stable(feature = "rust1", since = "1.0.0")]
1650impl<T: Ord + Clone, A: Allocator + Clone> Sub<&BTreeSet<T, A>> for &BTreeSet<T, A> {
1651    type Output = BTreeSet<T, A>;
1652
1653    /// Returns the difference of `self` and `rhs` as a new `BTreeSet<T>`.
1654    ///
1655    /// # Examples
1656    ///
1657    /// ```
1658    /// use std::collections::BTreeSet;
1659    ///
1660    /// let a = BTreeSet::from([1, 2, 3]);
1661    /// let b = BTreeSet::from([3, 4, 5]);
1662    ///
1663    /// let result = &a - &b;
1664    /// assert_eq!(result, BTreeSet::from([1, 2]));
1665    /// ```
1666    fn sub(self, rhs: &BTreeSet<T, A>) -> BTreeSet<T, A> {
1667        BTreeSet::from_sorted_iter(
1668            self.difference(rhs).cloned(),
1669            ManuallyDrop::into_inner(self.map.alloc.clone()),
1670        )
1671    }
1672}
1673
1674#[stable(feature = "rust1", since = "1.0.0")]
1675impl<T: Ord + Clone, A: Allocator + Clone> BitXor<&BTreeSet<T, A>> for &BTreeSet<T, A> {
1676    type Output = BTreeSet<T, A>;
1677
1678    /// Returns the symmetric difference of `self` and `rhs` as a new `BTreeSet<T>`.
1679    ///
1680    /// # Examples
1681    ///
1682    /// ```
1683    /// use std::collections::BTreeSet;
1684    ///
1685    /// let a = BTreeSet::from([1, 2, 3]);
1686    /// let b = BTreeSet::from([2, 3, 4]);
1687    ///
1688    /// let result = &a ^ &b;
1689    /// assert_eq!(result, BTreeSet::from([1, 4]));
1690    /// ```
1691    fn bitxor(self, rhs: &BTreeSet<T, A>) -> BTreeSet<T, A> {
1692        BTreeSet::from_sorted_iter(
1693            self.symmetric_difference(rhs).cloned(),
1694            ManuallyDrop::into_inner(self.map.alloc.clone()),
1695        )
1696    }
1697}
1698
1699#[stable(feature = "rust1", since = "1.0.0")]
1700impl<T: Ord + Clone, A: Allocator + Clone> BitAnd<&BTreeSet<T, A>> for &BTreeSet<T, A> {
1701    type Output = BTreeSet<T, A>;
1702
1703    /// Returns the intersection of `self` and `rhs` as a new `BTreeSet<T>`.
1704    ///
1705    /// # Examples
1706    ///
1707    /// ```
1708    /// use std::collections::BTreeSet;
1709    ///
1710    /// let a = BTreeSet::from([1, 2, 3]);
1711    /// let b = BTreeSet::from([2, 3, 4]);
1712    ///
1713    /// let result = &a & &b;
1714    /// assert_eq!(result, BTreeSet::from([2, 3]));
1715    /// ```
1716    fn bitand(self, rhs: &BTreeSet<T, A>) -> BTreeSet<T, A> {
1717        BTreeSet::from_sorted_iter(
1718            self.intersection(rhs).cloned(),
1719            ManuallyDrop::into_inner(self.map.alloc.clone()),
1720        )
1721    }
1722}
1723
1724#[stable(feature = "rust1", since = "1.0.0")]
1725impl<T: Ord + Clone, A: Allocator + Clone> BitOr<&BTreeSet<T, A>> for &BTreeSet<T, A> {
1726    type Output = BTreeSet<T, A>;
1727
1728    /// Returns the union of `self` and `rhs` as a new `BTreeSet<T>`.
1729    ///
1730    /// # Examples
1731    ///
1732    /// ```
1733    /// use std::collections::BTreeSet;
1734    ///
1735    /// let a = BTreeSet::from([1, 2, 3]);
1736    /// let b = BTreeSet::from([3, 4, 5]);
1737    ///
1738    /// let result = &a | &b;
1739    /// assert_eq!(result, BTreeSet::from([1, 2, 3, 4, 5]));
1740    /// ```
1741    fn bitor(self, rhs: &BTreeSet<T, A>) -> BTreeSet<T, A> {
1742        BTreeSet::from_sorted_iter(
1743            self.union(rhs).cloned(),
1744            ManuallyDrop::into_inner(self.map.alloc.clone()),
1745        )
1746    }
1747}
1748
1749#[stable(feature = "rust1", since = "1.0.0")]
1750impl<T: Debug, A: Allocator + Clone> Debug for BTreeSet<T, A> {
1751    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1752        f.debug_set().entries(self.iter()).finish()
1753    }
1754}
1755
1756#[stable(feature = "rust1", since = "1.0.0")]
1757impl<T> Clone for Iter<'_, T> {
1758    fn clone(&self) -> Self {
1759        Iter { iter: self.iter.clone() }
1760    }
1761}
1762#[stable(feature = "rust1", since = "1.0.0")]
1763impl<'a, T> Iterator for Iter<'a, T> {
1764    type Item = &'a T;
1765
1766    fn next(&mut self) -> Option<&'a T> {
1767        self.iter.next()
1768    }
1769
1770    fn size_hint(&self) -> (usize, Option<usize>) {
1771        self.iter.size_hint()
1772    }
1773
1774    fn last(mut self) -> Option<&'a T> {
1775        self.next_back()
1776    }
1777
1778    fn min(mut self) -> Option<&'a T>
1779    where
1780        &'a T: Ord,
1781    {
1782        self.next()
1783    }
1784
1785    fn max(mut self) -> Option<&'a T>
1786    where
1787        &'a T: Ord,
1788    {
1789        self.next_back()
1790    }
1791}
1792#[stable(feature = "rust1", since = "1.0.0")]
1793impl<'a, T> DoubleEndedIterator for Iter<'a, T> {
1794    fn next_back(&mut self) -> Option<&'a T> {
1795        self.iter.next_back()
1796    }
1797}
1798#[stable(feature = "rust1", since = "1.0.0")]
1799impl<T> ExactSizeIterator for Iter<'_, T> {
1800    fn len(&self) -> usize {
1801        self.iter.len()
1802    }
1803}
1804
1805#[stable(feature = "fused", since = "1.26.0")]
1806impl<T> FusedIterator for Iter<'_, T> {}
1807
1808#[stable(feature = "rust1", since = "1.0.0")]
1809impl<T, A: Allocator + Clone> Iterator for IntoIter<T, A> {
1810    type Item = T;
1811
1812    fn next(&mut self) -> Option<T> {
1813        self.iter.next().map(|(k, _)| k)
1814    }
1815
1816    fn size_hint(&self) -> (usize, Option<usize>) {
1817        self.iter.size_hint()
1818    }
1819}
1820
1821#[stable(feature = "default_iters", since = "1.70.0")]
1822impl<T> Default for Iter<'_, T> {
1823    /// Creates an empty `btree_set::Iter`.
1824    ///
1825    /// ```
1826    /// # use std::collections::btree_set;
1827    /// let iter: btree_set::Iter<'_, u8> = Default::default();
1828    /// assert_eq!(iter.len(), 0);
1829    /// ```
1830    fn default() -> Self {
1831        Iter { iter: Default::default() }
1832    }
1833}
1834
1835#[stable(feature = "rust1", since = "1.0.0")]
1836impl<T, A: Allocator + Clone> DoubleEndedIterator for IntoIter<T, A> {
1837    fn next_back(&mut self) -> Option<T> {
1838        self.iter.next_back().map(|(k, _)| k)
1839    }
1840}
1841#[stable(feature = "rust1", since = "1.0.0")]
1842impl<T, A: Allocator + Clone> ExactSizeIterator for IntoIter<T, A> {
1843    fn len(&self) -> usize {
1844        self.iter.len()
1845    }
1846}
1847
1848#[stable(feature = "fused", since = "1.26.0")]
1849impl<T, A: Allocator + Clone> FusedIterator for IntoIter<T, A> {}
1850
1851#[stable(feature = "default_iters", since = "1.70.0")]
1852impl<T, A> Default for IntoIter<T, A>
1853where
1854    A: Allocator + Default + Clone,
1855{
1856    /// Creates an empty `btree_set::IntoIter`.
1857    ///
1858    /// ```
1859    /// # use std::collections::btree_set;
1860    /// let iter: btree_set::IntoIter<u8> = Default::default();
1861    /// assert_eq!(iter.len(), 0);
1862    /// ```
1863    fn default() -> Self {
1864        IntoIter { iter: Default::default() }
1865    }
1866}
1867
1868#[stable(feature = "btree_range", since = "1.17.0")]
1869impl<T> Clone for Range<'_, T> {
1870    fn clone(&self) -> Self {
1871        Range { iter: self.iter.clone() }
1872    }
1873}
1874
1875#[stable(feature = "btree_range", since = "1.17.0")]
1876impl<'a, T> Iterator for Range<'a, T> {
1877    type Item = &'a T;
1878
1879    fn next(&mut self) -> Option<&'a T> {
1880        self.iter.next().map(|(k, _)| k)
1881    }
1882
1883    fn last(mut self) -> Option<&'a T> {
1884        self.next_back()
1885    }
1886
1887    fn min(mut self) -> Option<&'a T>
1888    where
1889        &'a T: Ord,
1890    {
1891        self.next()
1892    }
1893
1894    fn max(mut self) -> Option<&'a T>
1895    where
1896        &'a T: Ord,
1897    {
1898        self.next_back()
1899    }
1900}
1901
1902#[stable(feature = "btree_range", since = "1.17.0")]
1903impl<'a, T> DoubleEndedIterator for Range<'a, T> {
1904    fn next_back(&mut self) -> Option<&'a T> {
1905        self.iter.next_back().map(|(k, _)| k)
1906    }
1907}
1908
1909#[stable(feature = "fused", since = "1.26.0")]
1910impl<T> FusedIterator for Range<'_, T> {}
1911
1912#[stable(feature = "default_iters", since = "1.70.0")]
1913impl<T> Default for Range<'_, T> {
1914    /// Creates an empty `btree_set::Range`.
1915    ///
1916    /// ```
1917    /// # use std::collections::btree_set;
1918    /// let iter: btree_set::Range<'_, u8> = Default::default();
1919    /// assert_eq!(iter.count(), 0);
1920    /// ```
1921    fn default() -> Self {
1922        Range { iter: Default::default() }
1923    }
1924}
1925
1926#[stable(feature = "rust1", since = "1.0.0")]
1927impl<T, A: Allocator + Clone> Clone for Difference<'_, T, A> {
1928    fn clone(&self) -> Self {
1929        Difference {
1930            inner: match &self.inner {
1931                DifferenceInner::Stitch { self_iter, other_iter } => DifferenceInner::Stitch {
1932                    self_iter: self_iter.clone(),
1933                    other_iter: other_iter.clone(),
1934                },
1935                DifferenceInner::Search { self_iter, other_set } => {
1936                    DifferenceInner::Search { self_iter: self_iter.clone(), other_set }
1937                }
1938                DifferenceInner::Iterate(iter) => DifferenceInner::Iterate(iter.clone()),
1939            },
1940        }
1941    }
1942}
1943#[stable(feature = "rust1", since = "1.0.0")]
1944impl<'a, T: Ord, A: Allocator + Clone> Iterator for Difference<'a, T, A> {
1945    type Item = &'a T;
1946
1947    fn next(&mut self) -> Option<&'a T> {
1948        match &mut self.inner {
1949            DifferenceInner::Stitch { self_iter, other_iter } => {
1950                let mut self_next = self_iter.next()?;
1951                loop {
1952                    match other_iter.peek().map_or(Less, |other_next| self_next.cmp(other_next)) {
1953                        Less => return Some(self_next),
1954                        Equal => {
1955                            self_next = self_iter.next()?;
1956                            other_iter.next();
1957                        }
1958                        Greater => {
1959                            other_iter.next();
1960                        }
1961                    }
1962                }
1963            }
1964            DifferenceInner::Search { self_iter, other_set } => loop {
1965                let self_next = self_iter.next()?;
1966                if !other_set.contains(&self_next) {
1967                    return Some(self_next);
1968                }
1969            },
1970            DifferenceInner::Iterate(iter) => iter.next(),
1971        }
1972    }
1973
1974    fn size_hint(&self) -> (usize, Option<usize>) {
1975        let (self_len, other_len) = match &self.inner {
1976            DifferenceInner::Stitch { self_iter, other_iter } => {
1977                (self_iter.len(), other_iter.len())
1978            }
1979            DifferenceInner::Search { self_iter, other_set } => (self_iter.len(), other_set.len()),
1980            DifferenceInner::Iterate(iter) => (iter.len(), 0),
1981        };
1982        (self_len.saturating_sub(other_len), Some(self_len))
1983    }
1984
1985    fn min(mut self) -> Option<&'a T> {
1986        self.next()
1987    }
1988}
1989
1990#[stable(feature = "fused", since = "1.26.0")]
1991impl<T: Ord, A: Allocator + Clone> FusedIterator for Difference<'_, T, A> {}
1992
1993#[stable(feature = "rust1", since = "1.0.0")]
1994impl<T> Clone for SymmetricDifference<'_, T> {
1995    fn clone(&self) -> Self {
1996        SymmetricDifference(self.0.clone())
1997    }
1998}
1999#[stable(feature = "rust1", since = "1.0.0")]
2000impl<'a, T: Ord> Iterator for SymmetricDifference<'a, T> {
2001    type Item = &'a T;
2002
2003    fn next(&mut self) -> Option<&'a T> {
2004        loop {
2005            let (a_next, b_next) = self.0.nexts(Self::Item::cmp);
2006            if a_next.and(b_next).is_none() {
2007                return a_next.or(b_next);
2008            }
2009        }
2010    }
2011
2012    fn size_hint(&self) -> (usize, Option<usize>) {
2013        let (a_len, b_len) = self.0.lens();
2014        // No checked_add, because even if a and b refer to the same set,
2015        // and T is a zero-sized type, the storage overhead of sets limits
2016        // the number of elements to less than half the range of usize.
2017        (0, Some(a_len + b_len))
2018    }
2019
2020    fn min(mut self) -> Option<&'a T> {
2021        self.next()
2022    }
2023}
2024
2025#[stable(feature = "fused", since = "1.26.0")]
2026impl<T: Ord> FusedIterator for SymmetricDifference<'_, T> {}
2027
2028#[stable(feature = "rust1", since = "1.0.0")]
2029impl<T, A: Allocator + Clone> Clone for Intersection<'_, T, A> {
2030    fn clone(&self) -> Self {
2031        Intersection {
2032            inner: match &self.inner {
2033                IntersectionInner::Stitch { a, b } => {
2034                    IntersectionInner::Stitch { a: a.clone(), b: b.clone() }
2035                }
2036                IntersectionInner::Search { small_iter, large_set } => {
2037                    IntersectionInner::Search { small_iter: small_iter.clone(), large_set }
2038                }
2039                IntersectionInner::Answer(answer) => IntersectionInner::Answer(*answer),
2040            },
2041        }
2042    }
2043}
2044#[stable(feature = "rust1", since = "1.0.0")]
2045impl<'a, T: Ord, A: Allocator + Clone> Iterator for Intersection<'a, T, A> {
2046    type Item = &'a T;
2047
2048    fn next(&mut self) -> Option<&'a T> {
2049        match &mut self.inner {
2050            IntersectionInner::Stitch { a, b } => {
2051                let mut a_next = a.next()?;
2052                let mut b_next = b.next()?;
2053                loop {
2054                    match a_next.cmp(b_next) {
2055                        Less => a_next = a.next()?,
2056                        Greater => b_next = b.next()?,
2057                        Equal => return Some(a_next),
2058                    }
2059                }
2060            }
2061            IntersectionInner::Search { small_iter, large_set } => loop {
2062                let small_next = small_iter.next()?;
2063                if large_set.contains(&small_next) {
2064                    return Some(small_next);
2065                }
2066            },
2067            IntersectionInner::Answer(answer) => answer.take(),
2068        }
2069    }
2070
2071    fn size_hint(&self) -> (usize, Option<usize>) {
2072        match &self.inner {
2073            IntersectionInner::Stitch { a, b } => (0, Some(min(a.len(), b.len()))),
2074            IntersectionInner::Search { small_iter, .. } => (0, Some(small_iter.len())),
2075            IntersectionInner::Answer(None) => (0, Some(0)),
2076            IntersectionInner::Answer(Some(_)) => (1, Some(1)),
2077        }
2078    }
2079
2080    fn min(mut self) -> Option<&'a T> {
2081        self.next()
2082    }
2083}
2084
2085#[stable(feature = "fused", since = "1.26.0")]
2086impl<T: Ord, A: Allocator + Clone> FusedIterator for Intersection<'_, T, A> {}
2087
2088#[stable(feature = "rust1", since = "1.0.0")]
2089impl<T> Clone for Union<'_, T> {
2090    fn clone(&self) -> Self {
2091        Union(self.0.clone())
2092    }
2093}
2094#[stable(feature = "rust1", since = "1.0.0")]
2095impl<'a, T: Ord> Iterator for Union<'a, T> {
2096    type Item = &'a T;
2097
2098    fn next(&mut self) -> Option<&'a T> {
2099        let (a_next, b_next) = self.0.nexts(Self::Item::cmp);
2100        a_next.or(b_next)
2101    }
2102
2103    fn size_hint(&self) -> (usize, Option<usize>) {
2104        let (a_len, b_len) = self.0.lens();
2105        // No checked_add - see SymmetricDifference::size_hint.
2106        (max(a_len, b_len), Some(a_len + b_len))
2107    }
2108
2109    fn min(mut self) -> Option<&'a T> {
2110        self.next()
2111    }
2112}
2113
2114#[stable(feature = "fused", since = "1.26.0")]
2115impl<T: Ord> FusedIterator for Union<'_, T> {}
2116
2117/// A cursor over a `BTreeSet`.
2118///
2119/// A `Cursor` is like an iterator, except that it can freely seek back-and-forth.
2120///
2121/// Cursors always point to a gap between two elements in the set, and can
2122/// operate on the two immediately adjacent elements.
2123///
2124/// A `Cursor` is created with the [`BTreeSet::lower_bound`] and [`BTreeSet::upper_bound`] methods.
2125#[derive(Clone)]
2126#[unstable(feature = "btree_cursors", issue = "107540")]
2127pub struct Cursor<'a, K: 'a> {
2128    inner: super::map::Cursor<'a, K, SetValZST>,
2129}
2130
2131#[unstable(feature = "btree_cursors", issue = "107540")]
2132impl<K: Debug> Debug for Cursor<'_, K> {
2133    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2134        f.write_str("Cursor")
2135    }
2136}
2137
2138/// A cursor over a `BTreeSet` with editing operations.
2139///
2140/// A `Cursor` is like an iterator, except that it can freely seek back-and-forth, and can
2141/// safely mutate the set during iteration. This is because the lifetime of its yielded
2142/// references is tied to its own lifetime, instead of just the underlying map. This means
2143/// cursors cannot yield multiple elements at once.
2144///
2145/// Cursors always point to a gap between two elements in the set, and can
2146/// operate on the two immediately adjacent elements.
2147///
2148/// A `CursorMut` is created with the [`BTreeSet::lower_bound_mut`] and [`BTreeSet::upper_bound_mut`]
2149/// methods.
2150#[unstable(feature = "btree_cursors", issue = "107540")]
2151pub struct CursorMut<'a, K: 'a, #[unstable(feature = "allocator_api", issue = "32838")] A = Global>
2152{
2153    inner: super::map::CursorMut<'a, K, SetValZST, A>,
2154}
2155
2156#[unstable(feature = "btree_cursors", issue = "107540")]
2157impl<K: Debug, A> Debug for CursorMut<'_, K, A> {
2158    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2159        f.write_str("CursorMut")
2160    }
2161}
2162
2163/// A cursor over a `BTreeSet` with editing operations, and which allows
2164/// mutating elements.
2165///
2166/// A `Cursor` is like an iterator, except that it can freely seek back-and-forth, and can
2167/// safely mutate the set during iteration. This is because the lifetime of its yielded
2168/// references is tied to its own lifetime, instead of just the underlying set. This means
2169/// cursors cannot yield multiple elements at once.
2170///
2171/// Cursors always point to a gap between two elements in the set, and can
2172/// operate on the two immediately adjacent elements.
2173///
2174/// A `CursorMutKey` is created from a [`CursorMut`] with the
2175/// [`CursorMut::with_mutable_key`] method.
2176///
2177/// # Safety
2178///
2179/// Since this cursor allows mutating elements, you must ensure that the
2180/// `BTreeSet` invariants are maintained. Specifically:
2181///
2182/// * The newly inserted element must be unique in the tree.
2183/// * All elements in the tree must remain in sorted order.
2184#[unstable(feature = "btree_cursors", issue = "107540")]
2185pub struct CursorMutKey<
2186    'a,
2187    K: 'a,
2188    #[unstable(feature = "allocator_api", issue = "32838")] A = Global,
2189> {
2190    inner: super::map::CursorMutKey<'a, K, SetValZST, A>,
2191}
2192
2193#[unstable(feature = "btree_cursors", issue = "107540")]
2194impl<K: Debug, A> Debug for CursorMutKey<'_, K, A> {
2195    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2196        f.write_str("CursorMutKey")
2197    }
2198}
2199
2200impl<'a, K> Cursor<'a, K> {
2201    /// Advances the cursor to the next gap, returning the element that it
2202    /// moved over.
2203    ///
2204    /// If the cursor is already at the end of the set then `None` is returned
2205    /// and the cursor is not moved.
2206    #[unstable(feature = "btree_cursors", issue = "107540")]
2207    pub fn next(&mut self) -> Option<&'a K> {
2208        self.inner.next().map(|(k, _)| k)
2209    }
2210
2211    /// Advances the cursor to the previous gap, returning the element that it
2212    /// moved over.
2213    ///
2214    /// If the cursor is already at the start of the set then `None` is returned
2215    /// and the cursor is not moved.
2216    #[unstable(feature = "btree_cursors", issue = "107540")]
2217    pub fn prev(&mut self) -> Option<&'a K> {
2218        self.inner.prev().map(|(k, _)| k)
2219    }
2220
2221    /// Returns a reference to next element without moving the cursor.
2222    ///
2223    /// If the cursor is at the end of the set then `None` is returned
2224    #[unstable(feature = "btree_cursors", issue = "107540")]
2225    pub fn peek_next(&self) -> Option<&'a K> {
2226        self.inner.peek_next().map(|(k, _)| k)
2227    }
2228
2229    /// Returns a reference to the previous element without moving the cursor.
2230    ///
2231    /// If the cursor is at the start of the set then `None` is returned.
2232    #[unstable(feature = "btree_cursors", issue = "107540")]
2233    pub fn peek_prev(&self) -> Option<&'a K> {
2234        self.inner.peek_prev().map(|(k, _)| k)
2235    }
2236}
2237
2238impl<'a, T, A> CursorMut<'a, T, A> {
2239    /// Advances the cursor to the next gap, returning the element that it
2240    /// moved over.
2241    ///
2242    /// If the cursor is already at the end of the set then `None` is returned
2243    /// and the cursor is not moved.
2244    #[unstable(feature = "btree_cursors", issue = "107540")]
2245    pub fn next(&mut self) -> Option<&T> {
2246        self.inner.next().map(|(k, _)| k)
2247    }
2248
2249    /// Advances the cursor to the previous gap, returning the element that it
2250    /// moved over.
2251    ///
2252    /// If the cursor is already at the start of the set then `None` is returned
2253    /// and the cursor is not moved.
2254    #[unstable(feature = "btree_cursors", issue = "107540")]
2255    pub fn prev(&mut self) -> Option<&T> {
2256        self.inner.prev().map(|(k, _)| k)
2257    }
2258
2259    /// Returns a reference to the next element without moving the cursor.
2260    ///
2261    /// If the cursor is at the end of the set then `None` is returned.
2262    #[unstable(feature = "btree_cursors", issue = "107540")]
2263    pub fn peek_next(&mut self) -> Option<&T> {
2264        self.inner.peek_next().map(|(k, _)| k)
2265    }
2266
2267    /// Returns a reference to the previous element without moving the cursor.
2268    ///
2269    /// If the cursor is at the start of the set then `None` is returned.
2270    #[unstable(feature = "btree_cursors", issue = "107540")]
2271    pub fn peek_prev(&mut self) -> Option<&T> {
2272        self.inner.peek_prev().map(|(k, _)| k)
2273    }
2274
2275    /// Returns a read-only cursor pointing to the same location as the
2276    /// `CursorMut`.
2277    ///
2278    /// The lifetime of the returned `Cursor` is bound to that of the
2279    /// `CursorMut`, which means it cannot outlive the `CursorMut` and that the
2280    /// `CursorMut` is frozen for the lifetime of the `Cursor`.
2281    #[unstable(feature = "btree_cursors", issue = "107540")]
2282    pub fn as_cursor(&self) -> Cursor<'_, T> {
2283        Cursor { inner: self.inner.as_cursor() }
2284    }
2285
2286    /// Converts the cursor into a [`CursorMutKey`], which allows mutating
2287    /// elements in the tree.
2288    ///
2289    /// # Safety
2290    ///
2291    /// Since this cursor allows mutating elements, you must ensure that the
2292    /// `BTreeSet` invariants are maintained. Specifically:
2293    ///
2294    /// * The newly inserted element must be unique in the tree.
2295    /// * All elements in the tree must remain in sorted order.
2296    #[unstable(feature = "btree_cursors", issue = "107540")]
2297    pub unsafe fn with_mutable_key(self) -> CursorMutKey<'a, T, A> {
2298        CursorMutKey { inner: unsafe { self.inner.with_mutable_key() } }
2299    }
2300}
2301
2302impl<'a, T, A> CursorMutKey<'a, T, A> {
2303    /// Advances the cursor to the next gap, returning the  element that it
2304    /// moved over.
2305    ///
2306    /// If the cursor is already at the end of the set then `None` is returned
2307    /// and the cursor is not moved.
2308    #[unstable(feature = "btree_cursors", issue = "107540")]
2309    pub fn next(&mut self) -> Option<&mut T> {
2310        self.inner.next().map(|(k, _)| k)
2311    }
2312
2313    /// Advances the cursor to the previous gap, returning the element that it
2314    /// moved over.
2315    ///
2316    /// If the cursor is already at the start of the set then `None` is returned
2317    /// and the cursor is not moved.
2318    #[unstable(feature = "btree_cursors", issue = "107540")]
2319    pub fn prev(&mut self) -> Option<&mut T> {
2320        self.inner.prev().map(|(k, _)| k)
2321    }
2322
2323    /// Returns a reference to the next element without moving the cursor.
2324    ///
2325    /// If the cursor is at the end of the set then `None` is returned
2326    #[unstable(feature = "btree_cursors", issue = "107540")]
2327    pub fn peek_next(&mut self) -> Option<&mut T> {
2328        self.inner.peek_next().map(|(k, _)| k)
2329    }
2330
2331    /// Returns a reference to the previous element without moving the cursor.
2332    ///
2333    /// If the cursor is at the start of the set then `None` is returned.
2334    #[unstable(feature = "btree_cursors", issue = "107540")]
2335    pub fn peek_prev(&mut self) -> Option<&mut T> {
2336        self.inner.peek_prev().map(|(k, _)| k)
2337    }
2338
2339    /// Returns a read-only cursor pointing to the same location as the
2340    /// `CursorMutKey`.
2341    ///
2342    /// The lifetime of the returned `Cursor` is bound to that of the
2343    /// `CursorMutKey`, which means it cannot outlive the `CursorMutKey` and that the
2344    /// `CursorMutKey` is frozen for the lifetime of the `Cursor`.
2345    #[unstable(feature = "btree_cursors", issue = "107540")]
2346    pub fn as_cursor(&self) -> Cursor<'_, T> {
2347        Cursor { inner: self.inner.as_cursor() }
2348    }
2349}
2350
2351impl<'a, T: Ord, A: Allocator + Clone> CursorMut<'a, T, A> {
2352    /// Inserts a new element into the set in the gap that the
2353    /// cursor is currently pointing to.
2354    ///
2355    /// After the insertion the cursor will be pointing at the gap before the
2356    /// newly inserted element.
2357    ///
2358    /// # Safety
2359    ///
2360    /// You must ensure that the `BTreeSet` invariants are maintained.
2361    /// Specifically:
2362    ///
2363    /// * The newly inserted element must be unique in the tree.
2364    /// * All elements in the tree must remain in sorted order.
2365    #[unstable(feature = "btree_cursors", issue = "107540")]
2366    pub unsafe fn insert_after_unchecked(&mut self, value: T) {
2367        unsafe { self.inner.insert_after_unchecked(value, SetValZST) }
2368    }
2369
2370    /// Inserts a new element into the set in the gap that the
2371    /// cursor is currently pointing to.
2372    ///
2373    /// After the insertion the cursor will be pointing at the gap after the
2374    /// newly inserted element.
2375    ///
2376    /// # Safety
2377    ///
2378    /// You must ensure that the `BTreeSet` invariants are maintained.
2379    /// Specifically:
2380    ///
2381    /// * The newly inserted element must be unique in the tree.
2382    /// * All elements in the tree must remain in sorted order.
2383    #[unstable(feature = "btree_cursors", issue = "107540")]
2384    pub unsafe fn insert_before_unchecked(&mut self, value: T) {
2385        unsafe { self.inner.insert_before_unchecked(value, SetValZST) }
2386    }
2387
2388    /// Inserts a new element into the set in the gap that the
2389    /// cursor is currently pointing to.
2390    ///
2391    /// After the insertion the cursor will be pointing at the gap before the
2392    /// newly inserted element.
2393    ///
2394    /// If the inserted element is not greater than the element before the
2395    /// cursor (if any), or if it not less than the element after the cursor (if
2396    /// any), then an [`UnorderedKeyError`] is returned since this would
2397    /// invalidate the [`Ord`] invariant between the elements of the set.
2398    #[unstable(feature = "btree_cursors", issue = "107540")]
2399    pub fn insert_after(&mut self, value: T) -> Result<(), UnorderedKeyError> {
2400        self.inner.insert_after(value, SetValZST)
2401    }
2402
2403    /// Inserts a new element into the set in the gap that the
2404    /// cursor is currently pointing to.
2405    ///
2406    /// After the insertion the cursor will be pointing at the gap after the
2407    /// newly inserted element.
2408    ///
2409    /// If the inserted element is not greater than the element before the
2410    /// cursor (if any), or if it not less than the element after the cursor (if
2411    /// any), then an [`UnorderedKeyError`] is returned since this would
2412    /// invalidate the [`Ord`] invariant between the elements of the set.
2413    #[unstable(feature = "btree_cursors", issue = "107540")]
2414    pub fn insert_before(&mut self, value: T) -> Result<(), UnorderedKeyError> {
2415        self.inner.insert_before(value, SetValZST)
2416    }
2417
2418    /// Removes the next element from the `BTreeSet`.
2419    ///
2420    /// The element that was removed is returned. The cursor position is
2421    /// unchanged (before the removed element).
2422    #[unstable(feature = "btree_cursors", issue = "107540")]
2423    pub fn remove_next(&mut self) -> Option<T> {
2424        self.inner.remove_next().map(|(k, _)| k)
2425    }
2426
2427    /// Removes the preceding element from the `BTreeSet`.
2428    ///
2429    /// The element that was removed is returned. The cursor position is
2430    /// unchanged (after the removed element).
2431    #[unstable(feature = "btree_cursors", issue = "107540")]
2432    pub fn remove_prev(&mut self) -> Option<T> {
2433        self.inner.remove_prev().map(|(k, _)| k)
2434    }
2435}
2436
2437impl<'a, T: Ord, A: Allocator + Clone> CursorMutKey<'a, T, A> {
2438    /// Inserts a new element into the set in the gap that the
2439    /// cursor is currently pointing to.
2440    ///
2441    /// After the insertion the cursor will be pointing at the gap before the
2442    /// newly inserted element.
2443    ///
2444    /// # Safety
2445    ///
2446    /// You must ensure that the `BTreeSet` invariants are maintained.
2447    /// Specifically:
2448    ///
2449    /// * The key of the newly inserted element must be unique in the tree.
2450    /// * All elements in the tree must remain in sorted order.
2451    #[unstable(feature = "btree_cursors", issue = "107540")]
2452    pub unsafe fn insert_after_unchecked(&mut self, value: T) {
2453        unsafe { self.inner.insert_after_unchecked(value, SetValZST) }
2454    }
2455
2456    /// Inserts a new element into the set in the gap that the
2457    /// cursor is currently pointing to.
2458    ///
2459    /// After the insertion the cursor will be pointing at the gap after the
2460    /// newly inserted element.
2461    ///
2462    /// # Safety
2463    ///
2464    /// You must ensure that the `BTreeSet` invariants are maintained.
2465    /// Specifically:
2466    ///
2467    /// * The newly inserted element must be unique in the tree.
2468    /// * All elements in the tree must remain in sorted order.
2469    #[unstable(feature = "btree_cursors", issue = "107540")]
2470    pub unsafe fn insert_before_unchecked(&mut self, value: T) {
2471        unsafe { self.inner.insert_before_unchecked(value, SetValZST) }
2472    }
2473
2474    /// Inserts a new element into the set in the gap that the
2475    /// cursor is currently pointing to.
2476    ///
2477    /// After the insertion the cursor will be pointing at the gap before the
2478    /// newly inserted element.
2479    ///
2480    /// If the inserted element is not greater than the element before the
2481    /// cursor (if any), or if it not less than the element after the cursor (if
2482    /// any), then an [`UnorderedKeyError`] is returned since this would
2483    /// invalidate the [`Ord`] invariant between the elements of the set.
2484    #[unstable(feature = "btree_cursors", issue = "107540")]
2485    pub fn insert_after(&mut self, value: T) -> Result<(), UnorderedKeyError> {
2486        self.inner.insert_after(value, SetValZST)
2487    }
2488
2489    /// Inserts a new element into the set in the gap that the
2490    /// cursor is currently pointing to.
2491    ///
2492    /// After the insertion the cursor will be pointing at the gap after the
2493    /// newly inserted element.
2494    ///
2495    /// If the inserted element is not greater than the element before the
2496    /// cursor (if any), or if it not less than the element after the cursor (if
2497    /// any), then an [`UnorderedKeyError`] is returned since this would
2498    /// invalidate the [`Ord`] invariant between the elements of the set.
2499    #[unstable(feature = "btree_cursors", issue = "107540")]
2500    pub fn insert_before(&mut self, value: T) -> Result<(), UnorderedKeyError> {
2501        self.inner.insert_before(value, SetValZST)
2502    }
2503
2504    /// Removes the next element from the `BTreeSet`.
2505    ///
2506    /// The element that was removed is returned. The cursor position is
2507    /// unchanged (before the removed element).
2508    #[unstable(feature = "btree_cursors", issue = "107540")]
2509    pub fn remove_next(&mut self) -> Option<T> {
2510        self.inner.remove_next().map(|(k, _)| k)
2511    }
2512
2513    /// Removes the preceding element from the `BTreeSet`.
2514    ///
2515    /// The element that was removed is returned. The cursor position is
2516    /// unchanged (after the removed element).
2517    #[unstable(feature = "btree_cursors", issue = "107540")]
2518    pub fn remove_prev(&mut self) -> Option<T> {
2519        self.inner.remove_prev().map(|(k, _)| k)
2520    }
2521}
2522
2523#[unstable(feature = "btree_cursors", issue = "107540")]
2524pub use super::map::UnorderedKeyError;
2525
2526#[cfg(test)]
2527mod tests;
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy