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 all elements 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    /// Splitting a set into even and odd values, reusing the original set:
1205    ///
1206    /// ```
1207    /// #![feature(btree_extract_if)]
1208    /// use std::collections::BTreeSet;
1209    ///
1210    /// let mut set: BTreeSet<i32> = (0..8).collect();
1211    /// let evens: BTreeSet<_> = set.extract_if(|v| v % 2 == 0).collect();
1212    /// let odds = set;
1213    /// assert_eq!(evens.into_iter().collect::<Vec<_>>(), vec![0, 2, 4, 6]);
1214    /// assert_eq!(odds.into_iter().collect::<Vec<_>>(), vec![1, 3, 5, 7]);
1215    /// ```
1216    #[unstable(feature = "btree_extract_if", issue = "70530")]
1217    pub fn extract_if<'a, F>(&'a mut self, pred: F) -> ExtractIf<'a, T, F, A>
1218    where
1219        T: Ord,
1220        F: 'a + FnMut(&T) -> bool,
1221    {
1222        let (inner, alloc) = self.map.extract_if_inner();
1223        ExtractIf { pred, inner, alloc }
1224    }
1225
1226    /// Gets an iterator that visits the elements in the `BTreeSet` in ascending
1227    /// order.
1228    ///
1229    /// # Examples
1230    ///
1231    /// ```
1232    /// use std::collections::BTreeSet;
1233    ///
1234    /// let set = BTreeSet::from([3, 1, 2]);
1235    /// let mut set_iter = set.iter();
1236    /// assert_eq!(set_iter.next(), Some(&1));
1237    /// assert_eq!(set_iter.next(), Some(&2));
1238    /// assert_eq!(set_iter.next(), Some(&3));
1239    /// assert_eq!(set_iter.next(), None);
1240    /// ```
1241    #[stable(feature = "rust1", since = "1.0.0")]
1242    #[cfg_attr(not(test), rustc_diagnostic_item = "btreeset_iter")]
1243    pub fn iter(&self) -> Iter<'_, T> {
1244        Iter { iter: self.map.keys() }
1245    }
1246
1247    /// Returns the number of elements in the set.
1248    ///
1249    /// # Examples
1250    ///
1251    /// ```
1252    /// use std::collections::BTreeSet;
1253    ///
1254    /// let mut v = BTreeSet::new();
1255    /// assert_eq!(v.len(), 0);
1256    /// v.insert(1);
1257    /// assert_eq!(v.len(), 1);
1258    /// ```
1259    #[must_use]
1260    #[stable(feature = "rust1", since = "1.0.0")]
1261    #[rustc_const_unstable(
1262        feature = "const_btree_len",
1263        issue = "71835",
1264        implied_by = "const_btree_new"
1265    )]
1266    #[rustc_confusables("length", "size")]
1267    pub const fn len(&self) -> usize {
1268        self.map.len()
1269    }
1270
1271    /// Returns `true` if the set contains no elements.
1272    ///
1273    /// # Examples
1274    ///
1275    /// ```
1276    /// use std::collections::BTreeSet;
1277    ///
1278    /// let mut v = BTreeSet::new();
1279    /// assert!(v.is_empty());
1280    /// v.insert(1);
1281    /// assert!(!v.is_empty());
1282    /// ```
1283    #[must_use]
1284    #[stable(feature = "rust1", since = "1.0.0")]
1285    #[rustc_const_unstable(
1286        feature = "const_btree_len",
1287        issue = "71835",
1288        implied_by = "const_btree_new"
1289    )]
1290    pub const fn is_empty(&self) -> bool {
1291        self.len() == 0
1292    }
1293
1294    /// Returns a [`Cursor`] pointing at the gap before the smallest element
1295    /// greater than the given bound.
1296    ///
1297    /// Passing `Bound::Included(x)` will return a cursor pointing to the
1298    /// gap before the smallest element greater than or equal to `x`.
1299    ///
1300    /// Passing `Bound::Excluded(x)` will return a cursor pointing to the
1301    /// gap before the smallest element greater than `x`.
1302    ///
1303    /// Passing `Bound::Unbounded` will return a cursor pointing to the
1304    /// gap before the smallest element in the set.
1305    ///
1306    /// # Examples
1307    ///
1308    /// ```
1309    /// #![feature(btree_cursors)]
1310    ///
1311    /// use std::collections::BTreeSet;
1312    /// use std::ops::Bound;
1313    ///
1314    /// let set = BTreeSet::from([1, 2, 3, 4]);
1315    ///
1316    /// let cursor = set.lower_bound(Bound::Included(&2));
1317    /// assert_eq!(cursor.peek_prev(), Some(&1));
1318    /// assert_eq!(cursor.peek_next(), Some(&2));
1319    ///
1320    /// let cursor = set.lower_bound(Bound::Excluded(&2));
1321    /// assert_eq!(cursor.peek_prev(), Some(&2));
1322    /// assert_eq!(cursor.peek_next(), Some(&3));
1323    ///
1324    /// let cursor = set.lower_bound(Bound::Unbounded);
1325    /// assert_eq!(cursor.peek_prev(), None);
1326    /// assert_eq!(cursor.peek_next(), Some(&1));
1327    /// ```
1328    #[unstable(feature = "btree_cursors", issue = "107540")]
1329    pub fn lower_bound<Q: ?Sized>(&self, bound: Bound<&Q>) -> Cursor<'_, T>
1330    where
1331        T: Borrow<Q> + Ord,
1332        Q: Ord,
1333    {
1334        Cursor { inner: self.map.lower_bound(bound) }
1335    }
1336
1337    /// Returns a [`CursorMut`] pointing at the gap before the smallest element
1338    /// greater than the given bound.
1339    ///
1340    /// Passing `Bound::Included(x)` will return a cursor pointing to the
1341    /// gap before the smallest element greater than or equal to `x`.
1342    ///
1343    /// Passing `Bound::Excluded(x)` will return a cursor pointing to the
1344    /// gap before the smallest element greater than `x`.
1345    ///
1346    /// Passing `Bound::Unbounded` will return a cursor pointing to the
1347    /// gap before the smallest element in the set.
1348    ///
1349    /// # Examples
1350    ///
1351    /// ```
1352    /// #![feature(btree_cursors)]
1353    ///
1354    /// use std::collections::BTreeSet;
1355    /// use std::ops::Bound;
1356    ///
1357    /// let mut set = BTreeSet::from([1, 2, 3, 4]);
1358    ///
1359    /// let mut cursor = set.lower_bound_mut(Bound::Included(&2));
1360    /// assert_eq!(cursor.peek_prev(), Some(&1));
1361    /// assert_eq!(cursor.peek_next(), Some(&2));
1362    ///
1363    /// let mut cursor = set.lower_bound_mut(Bound::Excluded(&2));
1364    /// assert_eq!(cursor.peek_prev(), Some(&2));
1365    /// assert_eq!(cursor.peek_next(), Some(&3));
1366    ///
1367    /// let mut cursor = set.lower_bound_mut(Bound::Unbounded);
1368    /// assert_eq!(cursor.peek_prev(), None);
1369    /// assert_eq!(cursor.peek_next(), Some(&1));
1370    /// ```
1371    #[unstable(feature = "btree_cursors", issue = "107540")]
1372    pub fn lower_bound_mut<Q: ?Sized>(&mut self, bound: Bound<&Q>) -> CursorMut<'_, T, A>
1373    where
1374        T: Borrow<Q> + Ord,
1375        Q: Ord,
1376    {
1377        CursorMut { inner: self.map.lower_bound_mut(bound) }
1378    }
1379
1380    /// Returns a [`Cursor`] pointing at the gap after the greatest element
1381    /// smaller than the given bound.
1382    ///
1383    /// Passing `Bound::Included(x)` will return a cursor pointing to the
1384    /// gap after the greatest element smaller than or equal to `x`.
1385    ///
1386    /// Passing `Bound::Excluded(x)` will return a cursor pointing to the
1387    /// gap after the greatest element smaller than `x`.
1388    ///
1389    /// Passing `Bound::Unbounded` will return a cursor pointing to the
1390    /// gap after the greatest element in the set.
1391    ///
1392    /// # Examples
1393    ///
1394    /// ```
1395    /// #![feature(btree_cursors)]
1396    ///
1397    /// use std::collections::BTreeSet;
1398    /// use std::ops::Bound;
1399    ///
1400    /// let set = BTreeSet::from([1, 2, 3, 4]);
1401    ///
1402    /// let cursor = set.upper_bound(Bound::Included(&3));
1403    /// assert_eq!(cursor.peek_prev(), Some(&3));
1404    /// assert_eq!(cursor.peek_next(), Some(&4));
1405    ///
1406    /// let cursor = set.upper_bound(Bound::Excluded(&3));
1407    /// assert_eq!(cursor.peek_prev(), Some(&2));
1408    /// assert_eq!(cursor.peek_next(), Some(&3));
1409    ///
1410    /// let cursor = set.upper_bound(Bound::Unbounded);
1411    /// assert_eq!(cursor.peek_prev(), Some(&4));
1412    /// assert_eq!(cursor.peek_next(), None);
1413    /// ```
1414    #[unstable(feature = "btree_cursors", issue = "107540")]
1415    pub fn upper_bound<Q: ?Sized>(&self, bound: Bound<&Q>) -> Cursor<'_, T>
1416    where
1417        T: Borrow<Q> + Ord,
1418        Q: Ord,
1419    {
1420        Cursor { inner: self.map.upper_bound(bound) }
1421    }
1422
1423    /// Returns a [`CursorMut`] pointing at the gap after the greatest element
1424    /// smaller than the given bound.
1425    ///
1426    /// Passing `Bound::Included(x)` will return a cursor pointing to the
1427    /// gap after the greatest element smaller than or equal to `x`.
1428    ///
1429    /// Passing `Bound::Excluded(x)` will return a cursor pointing to the
1430    /// gap after the greatest element smaller than `x`.
1431    ///
1432    /// Passing `Bound::Unbounded` will return a cursor pointing to the
1433    /// gap after the greatest element in the set.
1434    ///
1435    /// # Examples
1436    ///
1437    /// ```
1438    /// #![feature(btree_cursors)]
1439    ///
1440    /// use std::collections::BTreeSet;
1441    /// use std::ops::Bound;
1442    ///
1443    /// let mut set = BTreeSet::from([1, 2, 3, 4]);
1444    ///
1445    /// let mut cursor = set.upper_bound_mut(Bound::Included(&3));
1446    /// assert_eq!(cursor.peek_prev(), Some(&3));
1447    /// assert_eq!(cursor.peek_next(), Some(&4));
1448    ///
1449    /// let mut cursor = set.upper_bound_mut(Bound::Excluded(&3));
1450    /// assert_eq!(cursor.peek_prev(), Some(&2));
1451    /// assert_eq!(cursor.peek_next(), Some(&3));
1452    ///
1453    /// let mut cursor = set.upper_bound_mut(Bound::Unbounded);
1454    /// assert_eq!(cursor.peek_prev(), Some(&4));
1455    /// assert_eq!(cursor.peek_next(), None);
1456    /// ```
1457    #[unstable(feature = "btree_cursors", issue = "107540")]
1458    pub fn upper_bound_mut<Q: ?Sized>(&mut self, bound: Bound<&Q>) -> CursorMut<'_, T, A>
1459    where
1460        T: Borrow<Q> + Ord,
1461        Q: Ord,
1462    {
1463        CursorMut { inner: self.map.upper_bound_mut(bound) }
1464    }
1465}
1466
1467#[stable(feature = "rust1", since = "1.0.0")]
1468impl<T: Ord> FromIterator<T> for BTreeSet<T> {
1469    fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> BTreeSet<T> {
1470        let mut inputs: Vec<_> = iter.into_iter().collect();
1471
1472        if inputs.is_empty() {
1473            return BTreeSet::new();
1474        }
1475
1476        // use stable sort to preserve the insertion order.
1477        inputs.sort();
1478        BTreeSet::from_sorted_iter(inputs.into_iter(), Global)
1479    }
1480}
1481
1482impl<T: Ord, A: Allocator + Clone> BTreeSet<T, A> {
1483    fn from_sorted_iter<I: Iterator<Item = T>>(iter: I, alloc: A) -> BTreeSet<T, A> {
1484        let iter = iter.map(|k| (k, SetValZST::default()));
1485        let map = BTreeMap::bulk_build_from_sorted_iter(iter, alloc);
1486        BTreeSet { map }
1487    }
1488}
1489
1490#[stable(feature = "std_collections_from_array", since = "1.56.0")]
1491impl<T: Ord, const N: usize> From<[T; N]> for BTreeSet<T> {
1492    /// Converts a `[T; N]` into a `BTreeSet<T>`.
1493    ///
1494    /// If the array contains any equal values,
1495    /// all but one will be dropped.
1496    ///
1497    /// # Examples
1498    ///
1499    /// ```
1500    /// use std::collections::BTreeSet;
1501    ///
1502    /// let set1 = BTreeSet::from([1, 2, 3, 4]);
1503    /// let set2: BTreeSet<_> = [1, 2, 3, 4].into();
1504    /// assert_eq!(set1, set2);
1505    /// ```
1506    fn from(mut arr: [T; N]) -> Self {
1507        if N == 0 {
1508            return BTreeSet::new();
1509        }
1510
1511        // use stable sort to preserve the insertion order.
1512        arr.sort();
1513        let iter = IntoIterator::into_iter(arr).map(|k| (k, SetValZST::default()));
1514        let map = BTreeMap::bulk_build_from_sorted_iter(iter, Global);
1515        BTreeSet { map }
1516    }
1517}
1518
1519#[stable(feature = "rust1", since = "1.0.0")]
1520impl<T, A: Allocator + Clone> IntoIterator for BTreeSet<T, A> {
1521    type Item = T;
1522    type IntoIter = IntoIter<T, A>;
1523
1524    /// Gets an iterator for moving out the `BTreeSet`'s contents in ascending order.
1525    ///
1526    /// # Examples
1527    ///
1528    /// ```
1529    /// use std::collections::BTreeSet;
1530    ///
1531    /// let set = BTreeSet::from([1, 2, 3, 4]);
1532    ///
1533    /// let v: Vec<_> = set.into_iter().collect();
1534    /// assert_eq!(v, [1, 2, 3, 4]);
1535    /// ```
1536    fn into_iter(self) -> IntoIter<T, A> {
1537        IntoIter { iter: self.map.into_iter() }
1538    }
1539}
1540
1541#[stable(feature = "rust1", since = "1.0.0")]
1542impl<'a, T, A: Allocator + Clone> IntoIterator for &'a BTreeSet<T, A> {
1543    type Item = &'a T;
1544    type IntoIter = Iter<'a, T>;
1545
1546    fn into_iter(self) -> Iter<'a, T> {
1547        self.iter()
1548    }
1549}
1550
1551/// An iterator produced by calling `extract_if` on BTreeSet.
1552#[unstable(feature = "btree_extract_if", issue = "70530")]
1553#[must_use = "iterators are lazy and do nothing unless consumed"]
1554pub struct ExtractIf<
1555    'a,
1556    T,
1557    F,
1558    #[unstable(feature = "allocator_api", issue = "32838")] A: Allocator + Clone = Global,
1559> {
1560    pred: F,
1561    inner: super::map::ExtractIfInner<'a, T, SetValZST>,
1562    /// The BTreeMap will outlive this IntoIter so we don't care about drop order for `alloc`.
1563    alloc: A,
1564}
1565
1566#[unstable(feature = "btree_extract_if", issue = "70530")]
1567impl<T, F, A> fmt::Debug for ExtractIf<'_, T, F, A>
1568where
1569    T: fmt::Debug,
1570    A: Allocator + Clone,
1571{
1572    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1573        f.debug_struct("ExtractIf")
1574            .field("peek", &self.inner.peek().map(|(k, _)| k))
1575            .finish_non_exhaustive()
1576    }
1577}
1578
1579#[unstable(feature = "btree_extract_if", issue = "70530")]
1580impl<'a, T, F, A: Allocator + Clone> Iterator for ExtractIf<'_, T, F, A>
1581where
1582    F: 'a + FnMut(&T) -> bool,
1583{
1584    type Item = T;
1585
1586    fn next(&mut self) -> Option<T> {
1587        let pred = &mut self.pred;
1588        let mut mapped_pred = |k: &T, _v: &mut SetValZST| pred(k);
1589        self.inner.next(&mut mapped_pred, self.alloc.clone()).map(|(k, _)| k)
1590    }
1591
1592    fn size_hint(&self) -> (usize, Option<usize>) {
1593        self.inner.size_hint()
1594    }
1595}
1596
1597#[unstable(feature = "btree_extract_if", issue = "70530")]
1598impl<T, F, A: Allocator + Clone> FusedIterator for ExtractIf<'_, T, F, A> where F: FnMut(&T) -> bool {}
1599
1600#[stable(feature = "rust1", since = "1.0.0")]
1601impl<T: Ord, A: Allocator + Clone> Extend<T> for BTreeSet<T, A> {
1602    #[inline]
1603    fn extend<Iter: IntoIterator<Item = T>>(&mut self, iter: Iter) {
1604        iter.into_iter().for_each(move |elem| {
1605            self.insert(elem);
1606        });
1607    }
1608
1609    #[inline]
1610    fn extend_one(&mut self, elem: T) {
1611        self.insert(elem);
1612    }
1613}
1614
1615#[stable(feature = "extend_ref", since = "1.2.0")]
1616impl<'a, T: 'a + Ord + Copy, A: Allocator + Clone> Extend<&'a T> for BTreeSet<T, A> {
1617    fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I) {
1618        self.extend(iter.into_iter().cloned());
1619    }
1620
1621    #[inline]
1622    fn extend_one(&mut self, &elem: &'a T) {
1623        self.insert(elem);
1624    }
1625}
1626
1627#[stable(feature = "rust1", since = "1.0.0")]
1628impl<T> Default for BTreeSet<T> {
1629    /// Creates an empty `BTreeSet`.
1630    fn default() -> BTreeSet<T> {
1631        BTreeSet::new()
1632    }
1633}
1634
1635#[stable(feature = "rust1", since = "1.0.0")]
1636impl<T: Ord + Clone, A: Allocator + Clone> Sub<&BTreeSet<T, A>> for &BTreeSet<T, A> {
1637    type Output = BTreeSet<T, A>;
1638
1639    /// Returns the difference of `self` and `rhs` as a new `BTreeSet<T>`.
1640    ///
1641    /// # Examples
1642    ///
1643    /// ```
1644    /// use std::collections::BTreeSet;
1645    ///
1646    /// let a = BTreeSet::from([1, 2, 3]);
1647    /// let b = BTreeSet::from([3, 4, 5]);
1648    ///
1649    /// let result = &a - &b;
1650    /// assert_eq!(result, BTreeSet::from([1, 2]));
1651    /// ```
1652    fn sub(self, rhs: &BTreeSet<T, A>) -> BTreeSet<T, A> {
1653        BTreeSet::from_sorted_iter(
1654            self.difference(rhs).cloned(),
1655            ManuallyDrop::into_inner(self.map.alloc.clone()),
1656        )
1657    }
1658}
1659
1660#[stable(feature = "rust1", since = "1.0.0")]
1661impl<T: Ord + Clone, A: Allocator + Clone> BitXor<&BTreeSet<T, A>> for &BTreeSet<T, A> {
1662    type Output = BTreeSet<T, A>;
1663
1664    /// Returns the symmetric difference of `self` and `rhs` as a new `BTreeSet<T>`.
1665    ///
1666    /// # Examples
1667    ///
1668    /// ```
1669    /// use std::collections::BTreeSet;
1670    ///
1671    /// let a = BTreeSet::from([1, 2, 3]);
1672    /// let b = BTreeSet::from([2, 3, 4]);
1673    ///
1674    /// let result = &a ^ &b;
1675    /// assert_eq!(result, BTreeSet::from([1, 4]));
1676    /// ```
1677    fn bitxor(self, rhs: &BTreeSet<T, A>) -> BTreeSet<T, A> {
1678        BTreeSet::from_sorted_iter(
1679            self.symmetric_difference(rhs).cloned(),
1680            ManuallyDrop::into_inner(self.map.alloc.clone()),
1681        )
1682    }
1683}
1684
1685#[stable(feature = "rust1", since = "1.0.0")]
1686impl<T: Ord + Clone, A: Allocator + Clone> BitAnd<&BTreeSet<T, A>> for &BTreeSet<T, A> {
1687    type Output = BTreeSet<T, A>;
1688
1689    /// Returns the intersection of `self` and `rhs` as a new `BTreeSet<T>`.
1690    ///
1691    /// # Examples
1692    ///
1693    /// ```
1694    /// use std::collections::BTreeSet;
1695    ///
1696    /// let a = BTreeSet::from([1, 2, 3]);
1697    /// let b = BTreeSet::from([2, 3, 4]);
1698    ///
1699    /// let result = &a & &b;
1700    /// assert_eq!(result, BTreeSet::from([2, 3]));
1701    /// ```
1702    fn bitand(self, rhs: &BTreeSet<T, A>) -> BTreeSet<T, A> {
1703        BTreeSet::from_sorted_iter(
1704            self.intersection(rhs).cloned(),
1705            ManuallyDrop::into_inner(self.map.alloc.clone()),
1706        )
1707    }
1708}
1709
1710#[stable(feature = "rust1", since = "1.0.0")]
1711impl<T: Ord + Clone, A: Allocator + Clone> BitOr<&BTreeSet<T, A>> for &BTreeSet<T, A> {
1712    type Output = BTreeSet<T, A>;
1713
1714    /// Returns the union of `self` and `rhs` as a new `BTreeSet<T>`.
1715    ///
1716    /// # Examples
1717    ///
1718    /// ```
1719    /// use std::collections::BTreeSet;
1720    ///
1721    /// let a = BTreeSet::from([1, 2, 3]);
1722    /// let b = BTreeSet::from([3, 4, 5]);
1723    ///
1724    /// let result = &a | &b;
1725    /// assert_eq!(result, BTreeSet::from([1, 2, 3, 4, 5]));
1726    /// ```
1727    fn bitor(self, rhs: &BTreeSet<T, A>) -> BTreeSet<T, A> {
1728        BTreeSet::from_sorted_iter(
1729            self.union(rhs).cloned(),
1730            ManuallyDrop::into_inner(self.map.alloc.clone()),
1731        )
1732    }
1733}
1734
1735#[stable(feature = "rust1", since = "1.0.0")]
1736impl<T: Debug, A: Allocator + Clone> Debug for BTreeSet<T, A> {
1737    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1738        f.debug_set().entries(self.iter()).finish()
1739    }
1740}
1741
1742#[stable(feature = "rust1", since = "1.0.0")]
1743impl<T> Clone for Iter<'_, T> {
1744    fn clone(&self) -> Self {
1745        Iter { iter: self.iter.clone() }
1746    }
1747}
1748#[stable(feature = "rust1", since = "1.0.0")]
1749impl<'a, T> Iterator for Iter<'a, T> {
1750    type Item = &'a T;
1751
1752    fn next(&mut self) -> Option<&'a T> {
1753        self.iter.next()
1754    }
1755
1756    fn size_hint(&self) -> (usize, Option<usize>) {
1757        self.iter.size_hint()
1758    }
1759
1760    fn last(mut self) -> Option<&'a T> {
1761        self.next_back()
1762    }
1763
1764    fn min(mut self) -> Option<&'a T>
1765    where
1766        &'a T: Ord,
1767    {
1768        self.next()
1769    }
1770
1771    fn max(mut self) -> Option<&'a T>
1772    where
1773        &'a T: Ord,
1774    {
1775        self.next_back()
1776    }
1777}
1778#[stable(feature = "rust1", since = "1.0.0")]
1779impl<'a, T> DoubleEndedIterator for Iter<'a, T> {
1780    fn next_back(&mut self) -> Option<&'a T> {
1781        self.iter.next_back()
1782    }
1783}
1784#[stable(feature = "rust1", since = "1.0.0")]
1785impl<T> ExactSizeIterator for Iter<'_, T> {
1786    fn len(&self) -> usize {
1787        self.iter.len()
1788    }
1789}
1790
1791#[stable(feature = "fused", since = "1.26.0")]
1792impl<T> FusedIterator for Iter<'_, T> {}
1793
1794#[stable(feature = "rust1", since = "1.0.0")]
1795impl<T, A: Allocator + Clone> Iterator for IntoIter<T, A> {
1796    type Item = T;
1797
1798    fn next(&mut self) -> Option<T> {
1799        self.iter.next().map(|(k, _)| k)
1800    }
1801
1802    fn size_hint(&self) -> (usize, Option<usize>) {
1803        self.iter.size_hint()
1804    }
1805}
1806
1807#[stable(feature = "default_iters", since = "1.70.0")]
1808impl<T> Default for Iter<'_, T> {
1809    /// Creates an empty `btree_set::Iter`.
1810    ///
1811    /// ```
1812    /// # use std::collections::btree_set;
1813    /// let iter: btree_set::Iter<'_, u8> = Default::default();
1814    /// assert_eq!(iter.len(), 0);
1815    /// ```
1816    fn default() -> Self {
1817        Iter { iter: Default::default() }
1818    }
1819}
1820
1821#[stable(feature = "rust1", since = "1.0.0")]
1822impl<T, A: Allocator + Clone> DoubleEndedIterator for IntoIter<T, A> {
1823    fn next_back(&mut self) -> Option<T> {
1824        self.iter.next_back().map(|(k, _)| k)
1825    }
1826}
1827#[stable(feature = "rust1", since = "1.0.0")]
1828impl<T, A: Allocator + Clone> ExactSizeIterator for IntoIter<T, A> {
1829    fn len(&self) -> usize {
1830        self.iter.len()
1831    }
1832}
1833
1834#[stable(feature = "fused", since = "1.26.0")]
1835impl<T, A: Allocator + Clone> FusedIterator for IntoIter<T, A> {}
1836
1837#[stable(feature = "default_iters", since = "1.70.0")]
1838impl<T, A> Default for IntoIter<T, A>
1839where
1840    A: Allocator + Default + Clone,
1841{
1842    /// Creates an empty `btree_set::IntoIter`.
1843    ///
1844    /// ```
1845    /// # use std::collections::btree_set;
1846    /// let iter: btree_set::IntoIter<u8> = Default::default();
1847    /// assert_eq!(iter.len(), 0);
1848    /// ```
1849    fn default() -> Self {
1850        IntoIter { iter: Default::default() }
1851    }
1852}
1853
1854#[stable(feature = "btree_range", since = "1.17.0")]
1855impl<T> Clone for Range<'_, T> {
1856    fn clone(&self) -> Self {
1857        Range { iter: self.iter.clone() }
1858    }
1859}
1860
1861#[stable(feature = "btree_range", since = "1.17.0")]
1862impl<'a, T> Iterator for Range<'a, T> {
1863    type Item = &'a T;
1864
1865    fn next(&mut self) -> Option<&'a T> {
1866        self.iter.next().map(|(k, _)| k)
1867    }
1868
1869    fn last(mut self) -> Option<&'a T> {
1870        self.next_back()
1871    }
1872
1873    fn min(mut self) -> Option<&'a T>
1874    where
1875        &'a T: Ord,
1876    {
1877        self.next()
1878    }
1879
1880    fn max(mut self) -> Option<&'a T>
1881    where
1882        &'a T: Ord,
1883    {
1884        self.next_back()
1885    }
1886}
1887
1888#[stable(feature = "btree_range", since = "1.17.0")]
1889impl<'a, T> DoubleEndedIterator for Range<'a, T> {
1890    fn next_back(&mut self) -> Option<&'a T> {
1891        self.iter.next_back().map(|(k, _)| k)
1892    }
1893}
1894
1895#[stable(feature = "fused", since = "1.26.0")]
1896impl<T> FusedIterator for Range<'_, T> {}
1897
1898#[stable(feature = "default_iters", since = "1.70.0")]
1899impl<T> Default for Range<'_, T> {
1900    /// Creates an empty `btree_set::Range`.
1901    ///
1902    /// ```
1903    /// # use std::collections::btree_set;
1904    /// let iter: btree_set::Range<'_, u8> = Default::default();
1905    /// assert_eq!(iter.count(), 0);
1906    /// ```
1907    fn default() -> Self {
1908        Range { iter: Default::default() }
1909    }
1910}
1911
1912#[stable(feature = "rust1", since = "1.0.0")]
1913impl<T, A: Allocator + Clone> Clone for Difference<'_, T, A> {
1914    fn clone(&self) -> Self {
1915        Difference {
1916            inner: match &self.inner {
1917                DifferenceInner::Stitch { self_iter, other_iter } => DifferenceInner::Stitch {
1918                    self_iter: self_iter.clone(),
1919                    other_iter: other_iter.clone(),
1920                },
1921                DifferenceInner::Search { self_iter, other_set } => {
1922                    DifferenceInner::Search { self_iter: self_iter.clone(), other_set }
1923                }
1924                DifferenceInner::Iterate(iter) => DifferenceInner::Iterate(iter.clone()),
1925            },
1926        }
1927    }
1928}
1929#[stable(feature = "rust1", since = "1.0.0")]
1930impl<'a, T: Ord, A: Allocator + Clone> Iterator for Difference<'a, T, A> {
1931    type Item = &'a T;
1932
1933    fn next(&mut self) -> Option<&'a T> {
1934        match &mut self.inner {
1935            DifferenceInner::Stitch { self_iter, other_iter } => {
1936                let mut self_next = self_iter.next()?;
1937                loop {
1938                    match other_iter.peek().map_or(Less, |other_next| self_next.cmp(other_next)) {
1939                        Less => return Some(self_next),
1940                        Equal => {
1941                            self_next = self_iter.next()?;
1942                            other_iter.next();
1943                        }
1944                        Greater => {
1945                            other_iter.next();
1946                        }
1947                    }
1948                }
1949            }
1950            DifferenceInner::Search { self_iter, other_set } => loop {
1951                let self_next = self_iter.next()?;
1952                if !other_set.contains(&self_next) {
1953                    return Some(self_next);
1954                }
1955            },
1956            DifferenceInner::Iterate(iter) => iter.next(),
1957        }
1958    }
1959
1960    fn size_hint(&self) -> (usize, Option<usize>) {
1961        let (self_len, other_len) = match &self.inner {
1962            DifferenceInner::Stitch { self_iter, other_iter } => {
1963                (self_iter.len(), other_iter.len())
1964            }
1965            DifferenceInner::Search { self_iter, other_set } => (self_iter.len(), other_set.len()),
1966            DifferenceInner::Iterate(iter) => (iter.len(), 0),
1967        };
1968        (self_len.saturating_sub(other_len), Some(self_len))
1969    }
1970
1971    fn min(mut self) -> Option<&'a T> {
1972        self.next()
1973    }
1974}
1975
1976#[stable(feature = "fused", since = "1.26.0")]
1977impl<T: Ord, A: Allocator + Clone> FusedIterator for Difference<'_, T, A> {}
1978
1979#[stable(feature = "rust1", since = "1.0.0")]
1980impl<T> Clone for SymmetricDifference<'_, T> {
1981    fn clone(&self) -> Self {
1982        SymmetricDifference(self.0.clone())
1983    }
1984}
1985#[stable(feature = "rust1", since = "1.0.0")]
1986impl<'a, T: Ord> Iterator for SymmetricDifference<'a, T> {
1987    type Item = &'a T;
1988
1989    fn next(&mut self) -> Option<&'a T> {
1990        loop {
1991            let (a_next, b_next) = self.0.nexts(Self::Item::cmp);
1992            if a_next.and(b_next).is_none() {
1993                return a_next.or(b_next);
1994            }
1995        }
1996    }
1997
1998    fn size_hint(&self) -> (usize, Option<usize>) {
1999        let (a_len, b_len) = self.0.lens();
2000        // No checked_add, because even if a and b refer to the same set,
2001        // and T is a zero-sized type, the storage overhead of sets limits
2002        // the number of elements to less than half the range of usize.
2003        (0, Some(a_len + b_len))
2004    }
2005
2006    fn min(mut self) -> Option<&'a T> {
2007        self.next()
2008    }
2009}
2010
2011#[stable(feature = "fused", since = "1.26.0")]
2012impl<T: Ord> FusedIterator for SymmetricDifference<'_, T> {}
2013
2014#[stable(feature = "rust1", since = "1.0.0")]
2015impl<T, A: Allocator + Clone> Clone for Intersection<'_, T, A> {
2016    fn clone(&self) -> Self {
2017        Intersection {
2018            inner: match &self.inner {
2019                IntersectionInner::Stitch { a, b } => {
2020                    IntersectionInner::Stitch { a: a.clone(), b: b.clone() }
2021                }
2022                IntersectionInner::Search { small_iter, large_set } => {
2023                    IntersectionInner::Search { small_iter: small_iter.clone(), large_set }
2024                }
2025                IntersectionInner::Answer(answer) => IntersectionInner::Answer(*answer),
2026            },
2027        }
2028    }
2029}
2030#[stable(feature = "rust1", since = "1.0.0")]
2031impl<'a, T: Ord, A: Allocator + Clone> Iterator for Intersection<'a, T, A> {
2032    type Item = &'a T;
2033
2034    fn next(&mut self) -> Option<&'a T> {
2035        match &mut self.inner {
2036            IntersectionInner::Stitch { a, b } => {
2037                let mut a_next = a.next()?;
2038                let mut b_next = b.next()?;
2039                loop {
2040                    match a_next.cmp(b_next) {
2041                        Less => a_next = a.next()?,
2042                        Greater => b_next = b.next()?,
2043                        Equal => return Some(a_next),
2044                    }
2045                }
2046            }
2047            IntersectionInner::Search { small_iter, large_set } => loop {
2048                let small_next = small_iter.next()?;
2049                if large_set.contains(&small_next) {
2050                    return Some(small_next);
2051                }
2052            },
2053            IntersectionInner::Answer(answer) => answer.take(),
2054        }
2055    }
2056
2057    fn size_hint(&self) -> (usize, Option<usize>) {
2058        match &self.inner {
2059            IntersectionInner::Stitch { a, b } => (0, Some(min(a.len(), b.len()))),
2060            IntersectionInner::Search { small_iter, .. } => (0, Some(small_iter.len())),
2061            IntersectionInner::Answer(None) => (0, Some(0)),
2062            IntersectionInner::Answer(Some(_)) => (1, Some(1)),
2063        }
2064    }
2065
2066    fn min(mut self) -> Option<&'a T> {
2067        self.next()
2068    }
2069}
2070
2071#[stable(feature = "fused", since = "1.26.0")]
2072impl<T: Ord, A: Allocator + Clone> FusedIterator for Intersection<'_, T, A> {}
2073
2074#[stable(feature = "rust1", since = "1.0.0")]
2075impl<T> Clone for Union<'_, T> {
2076    fn clone(&self) -> Self {
2077        Union(self.0.clone())
2078    }
2079}
2080#[stable(feature = "rust1", since = "1.0.0")]
2081impl<'a, T: Ord> Iterator for Union<'a, T> {
2082    type Item = &'a T;
2083
2084    fn next(&mut self) -> Option<&'a T> {
2085        let (a_next, b_next) = self.0.nexts(Self::Item::cmp);
2086        a_next.or(b_next)
2087    }
2088
2089    fn size_hint(&self) -> (usize, Option<usize>) {
2090        let (a_len, b_len) = self.0.lens();
2091        // No checked_add - see SymmetricDifference::size_hint.
2092        (max(a_len, b_len), Some(a_len + b_len))
2093    }
2094
2095    fn min(mut self) -> Option<&'a T> {
2096        self.next()
2097    }
2098}
2099
2100#[stable(feature = "fused", since = "1.26.0")]
2101impl<T: Ord> FusedIterator for Union<'_, T> {}
2102
2103/// A cursor over a `BTreeSet`.
2104///
2105/// A `Cursor` is like an iterator, except that it can freely seek back-and-forth.
2106///
2107/// Cursors always point to a gap between two elements in the set, and can
2108/// operate on the two immediately adjacent elements.
2109///
2110/// A `Cursor` is created with the [`BTreeSet::lower_bound`] and [`BTreeSet::upper_bound`] methods.
2111#[derive(Clone)]
2112#[unstable(feature = "btree_cursors", issue = "107540")]
2113pub struct Cursor<'a, K: 'a> {
2114    inner: super::map::Cursor<'a, K, SetValZST>,
2115}
2116
2117#[unstable(feature = "btree_cursors", issue = "107540")]
2118impl<K: Debug> Debug for Cursor<'_, K> {
2119    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2120        f.write_str("Cursor")
2121    }
2122}
2123
2124/// A cursor over a `BTreeSet` with editing operations.
2125///
2126/// A `Cursor` is like an iterator, except that it can freely seek back-and-forth, and can
2127/// safely mutate the set during iteration. This is because the lifetime of its yielded
2128/// references is tied to its own lifetime, instead of just the underlying map. This means
2129/// cursors cannot yield multiple elements at once.
2130///
2131/// Cursors always point to a gap between two elements in the set, and can
2132/// operate on the two immediately adjacent elements.
2133///
2134/// A `CursorMut` is created with the [`BTreeSet::lower_bound_mut`] and [`BTreeSet::upper_bound_mut`]
2135/// methods.
2136#[unstable(feature = "btree_cursors", issue = "107540")]
2137pub struct CursorMut<'a, K: 'a, #[unstable(feature = "allocator_api", issue = "32838")] A = Global>
2138{
2139    inner: super::map::CursorMut<'a, K, SetValZST, A>,
2140}
2141
2142#[unstable(feature = "btree_cursors", issue = "107540")]
2143impl<K: Debug, A> Debug for CursorMut<'_, K, A> {
2144    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2145        f.write_str("CursorMut")
2146    }
2147}
2148
2149/// A cursor over a `BTreeSet` with editing operations, and which allows
2150/// mutating elements.
2151///
2152/// A `Cursor` is like an iterator, except that it can freely seek back-and-forth, and can
2153/// safely mutate the set during iteration. This is because the lifetime of its yielded
2154/// references is tied to its own lifetime, instead of just the underlying set. This means
2155/// cursors cannot yield multiple elements at once.
2156///
2157/// Cursors always point to a gap between two elements in the set, and can
2158/// operate on the two immediately adjacent elements.
2159///
2160/// A `CursorMutKey` is created from a [`CursorMut`] with the
2161/// [`CursorMut::with_mutable_key`] method.
2162///
2163/// # Safety
2164///
2165/// Since this cursor allows mutating elements, you must ensure that the
2166/// `BTreeSet` invariants are maintained. Specifically:
2167///
2168/// * The newly inserted element must be unique in the tree.
2169/// * All elements in the tree must remain in sorted order.
2170#[unstable(feature = "btree_cursors", issue = "107540")]
2171pub struct CursorMutKey<
2172    'a,
2173    K: 'a,
2174    #[unstable(feature = "allocator_api", issue = "32838")] A = Global,
2175> {
2176    inner: super::map::CursorMutKey<'a, K, SetValZST, A>,
2177}
2178
2179#[unstable(feature = "btree_cursors", issue = "107540")]
2180impl<K: Debug, A> Debug for CursorMutKey<'_, K, A> {
2181    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2182        f.write_str("CursorMutKey")
2183    }
2184}
2185
2186impl<'a, K> Cursor<'a, K> {
2187    /// Advances the cursor to the next gap, returning the element that it
2188    /// moved over.
2189    ///
2190    /// If the cursor is already at the end of the set then `None` is returned
2191    /// and the cursor is not moved.
2192    #[unstable(feature = "btree_cursors", issue = "107540")]
2193    pub fn next(&mut self) -> Option<&'a K> {
2194        self.inner.next().map(|(k, _)| k)
2195    }
2196
2197    /// Advances the cursor to the previous gap, returning the element that it
2198    /// moved over.
2199    ///
2200    /// If the cursor is already at the start of the set then `None` is returned
2201    /// and the cursor is not moved.
2202    #[unstable(feature = "btree_cursors", issue = "107540")]
2203    pub fn prev(&mut self) -> Option<&'a K> {
2204        self.inner.prev().map(|(k, _)| k)
2205    }
2206
2207    /// Returns a reference to next element without moving the cursor.
2208    ///
2209    /// If the cursor is at the end of the set then `None` is returned
2210    #[unstable(feature = "btree_cursors", issue = "107540")]
2211    pub fn peek_next(&self) -> Option<&'a K> {
2212        self.inner.peek_next().map(|(k, _)| k)
2213    }
2214
2215    /// Returns a reference to the previous element without moving the cursor.
2216    ///
2217    /// If the cursor is at the start of the set then `None` is returned.
2218    #[unstable(feature = "btree_cursors", issue = "107540")]
2219    pub fn peek_prev(&self) -> Option<&'a K> {
2220        self.inner.peek_prev().map(|(k, _)| k)
2221    }
2222}
2223
2224impl<'a, T, A> CursorMut<'a, T, A> {
2225    /// Advances the cursor to the next gap, returning the element that it
2226    /// moved over.
2227    ///
2228    /// If the cursor is already at the end of the set then `None` is returned
2229    /// and the cursor is not moved.
2230    #[unstable(feature = "btree_cursors", issue = "107540")]
2231    pub fn next(&mut self) -> Option<&T> {
2232        self.inner.next().map(|(k, _)| k)
2233    }
2234
2235    /// Advances the cursor to the previous gap, returning the element that it
2236    /// moved over.
2237    ///
2238    /// If the cursor is already at the start of the set then `None` is returned
2239    /// and the cursor is not moved.
2240    #[unstable(feature = "btree_cursors", issue = "107540")]
2241    pub fn prev(&mut self) -> Option<&T> {
2242        self.inner.prev().map(|(k, _)| k)
2243    }
2244
2245    /// Returns a reference to the next element without moving the cursor.
2246    ///
2247    /// If the cursor is at the end of the set then `None` is returned.
2248    #[unstable(feature = "btree_cursors", issue = "107540")]
2249    pub fn peek_next(&mut self) -> Option<&T> {
2250        self.inner.peek_next().map(|(k, _)| k)
2251    }
2252
2253    /// Returns a reference to the previous element without moving the cursor.
2254    ///
2255    /// If the cursor is at the start of the set then `None` is returned.
2256    #[unstable(feature = "btree_cursors", issue = "107540")]
2257    pub fn peek_prev(&mut self) -> Option<&T> {
2258        self.inner.peek_prev().map(|(k, _)| k)
2259    }
2260
2261    /// Returns a read-only cursor pointing to the same location as the
2262    /// `CursorMut`.
2263    ///
2264    /// The lifetime of the returned `Cursor` is bound to that of the
2265    /// `CursorMut`, which means it cannot outlive the `CursorMut` and that the
2266    /// `CursorMut` is frozen for the lifetime of the `Cursor`.
2267    #[unstable(feature = "btree_cursors", issue = "107540")]
2268    pub fn as_cursor(&self) -> Cursor<'_, T> {
2269        Cursor { inner: self.inner.as_cursor() }
2270    }
2271
2272    /// Converts the cursor into a [`CursorMutKey`], which allows mutating
2273    /// elements in the tree.
2274    ///
2275    /// # Safety
2276    ///
2277    /// Since this cursor allows mutating elements, you must ensure that the
2278    /// `BTreeSet` invariants are maintained. Specifically:
2279    ///
2280    /// * The newly inserted element must be unique in the tree.
2281    /// * All elements in the tree must remain in sorted order.
2282    #[unstable(feature = "btree_cursors", issue = "107540")]
2283    pub unsafe fn with_mutable_key(self) -> CursorMutKey<'a, T, A> {
2284        CursorMutKey { inner: unsafe { self.inner.with_mutable_key() } }
2285    }
2286}
2287
2288impl<'a, T, A> CursorMutKey<'a, T, A> {
2289    /// Advances the cursor to the next gap, returning the  element that it
2290    /// moved over.
2291    ///
2292    /// If the cursor is already at the end of the set then `None` is returned
2293    /// and the cursor is not moved.
2294    #[unstable(feature = "btree_cursors", issue = "107540")]
2295    pub fn next(&mut self) -> Option<&mut T> {
2296        self.inner.next().map(|(k, _)| k)
2297    }
2298
2299    /// Advances the cursor to the previous gap, returning the element that it
2300    /// moved over.
2301    ///
2302    /// If the cursor is already at the start of the set then `None` is returned
2303    /// and the cursor is not moved.
2304    #[unstable(feature = "btree_cursors", issue = "107540")]
2305    pub fn prev(&mut self) -> Option<&mut T> {
2306        self.inner.prev().map(|(k, _)| k)
2307    }
2308
2309    /// Returns a reference to the next element without moving the cursor.
2310    ///
2311    /// If the cursor is at the end of the set then `None` is returned
2312    #[unstable(feature = "btree_cursors", issue = "107540")]
2313    pub fn peek_next(&mut self) -> Option<&mut T> {
2314        self.inner.peek_next().map(|(k, _)| k)
2315    }
2316
2317    /// Returns a reference to the previous element without moving the cursor.
2318    ///
2319    /// If the cursor is at the start of the set then `None` is returned.
2320    #[unstable(feature = "btree_cursors", issue = "107540")]
2321    pub fn peek_prev(&mut self) -> Option<&mut T> {
2322        self.inner.peek_prev().map(|(k, _)| k)
2323    }
2324
2325    /// Returns a read-only cursor pointing to the same location as the
2326    /// `CursorMutKey`.
2327    ///
2328    /// The lifetime of the returned `Cursor` is bound to that of the
2329    /// `CursorMutKey`, which means it cannot outlive the `CursorMutKey` and that the
2330    /// `CursorMutKey` is frozen for the lifetime of the `Cursor`.
2331    #[unstable(feature = "btree_cursors", issue = "107540")]
2332    pub fn as_cursor(&self) -> Cursor<'_, T> {
2333        Cursor { inner: self.inner.as_cursor() }
2334    }
2335}
2336
2337impl<'a, T: Ord, A: Allocator + Clone> CursorMut<'a, T, A> {
2338    /// Inserts a new element into the set in the gap that the
2339    /// cursor is currently pointing to.
2340    ///
2341    /// After the insertion the cursor will be pointing at the gap before the
2342    /// newly inserted element.
2343    ///
2344    /// # Safety
2345    ///
2346    /// You must ensure that the `BTreeSet` invariants are maintained.
2347    /// Specifically:
2348    ///
2349    /// * The newly inserted element must be unique in the tree.
2350    /// * All elements in the tree must remain in sorted order.
2351    #[unstable(feature = "btree_cursors", issue = "107540")]
2352    pub unsafe fn insert_after_unchecked(&mut self, value: T) {
2353        unsafe { self.inner.insert_after_unchecked(value, SetValZST) }
2354    }
2355
2356    /// Inserts a new element into the set in the gap that the
2357    /// cursor is currently pointing to.
2358    ///
2359    /// After the insertion the cursor will be pointing at the gap after the
2360    /// newly inserted element.
2361    ///
2362    /// # Safety
2363    ///
2364    /// You must ensure that the `BTreeSet` invariants are maintained.
2365    /// Specifically:
2366    ///
2367    /// * The newly inserted element must be unique in the tree.
2368    /// * All elements in the tree must remain in sorted order.
2369    #[unstable(feature = "btree_cursors", issue = "107540")]
2370    pub unsafe fn insert_before_unchecked(&mut self, value: T) {
2371        unsafe { self.inner.insert_before_unchecked(value, SetValZST) }
2372    }
2373
2374    /// Inserts a new element into the set in the gap that the
2375    /// cursor is currently pointing to.
2376    ///
2377    /// After the insertion the cursor will be pointing at the gap before the
2378    /// newly inserted element.
2379    ///
2380    /// If the inserted element is not greater than the element before the
2381    /// cursor (if any), or if it not less than the element after the cursor (if
2382    /// any), then an [`UnorderedKeyError`] is returned since this would
2383    /// invalidate the [`Ord`] invariant between the elements of the set.
2384    #[unstable(feature = "btree_cursors", issue = "107540")]
2385    pub fn insert_after(&mut self, value: T) -> Result<(), UnorderedKeyError> {
2386        self.inner.insert_after(value, SetValZST)
2387    }
2388
2389    /// Inserts a new element into the set in the gap that the
2390    /// cursor is currently pointing to.
2391    ///
2392    /// After the insertion the cursor will be pointing at the gap after the
2393    /// newly inserted element.
2394    ///
2395    /// If the inserted element is not greater than the element before the
2396    /// cursor (if any), or if it not less than the element after the cursor (if
2397    /// any), then an [`UnorderedKeyError`] is returned since this would
2398    /// invalidate the [`Ord`] invariant between the elements of the set.
2399    #[unstable(feature = "btree_cursors", issue = "107540")]
2400    pub fn insert_before(&mut self, value: T) -> Result<(), UnorderedKeyError> {
2401        self.inner.insert_before(value, SetValZST)
2402    }
2403
2404    /// Removes the next element from the `BTreeSet`.
2405    ///
2406    /// The element that was removed is returned. The cursor position is
2407    /// unchanged (before the removed element).
2408    #[unstable(feature = "btree_cursors", issue = "107540")]
2409    pub fn remove_next(&mut self) -> Option<T> {
2410        self.inner.remove_next().map(|(k, _)| k)
2411    }
2412
2413    /// Removes the preceding element from the `BTreeSet`.
2414    ///
2415    /// The element that was removed is returned. The cursor position is
2416    /// unchanged (after the removed element).
2417    #[unstable(feature = "btree_cursors", issue = "107540")]
2418    pub fn remove_prev(&mut self) -> Option<T> {
2419        self.inner.remove_prev().map(|(k, _)| k)
2420    }
2421}
2422
2423impl<'a, T: Ord, A: Allocator + Clone> CursorMutKey<'a, T, A> {
2424    /// Inserts a new element into the set in the gap that the
2425    /// cursor is currently pointing to.
2426    ///
2427    /// After the insertion the cursor will be pointing at the gap before the
2428    /// newly inserted element.
2429    ///
2430    /// # Safety
2431    ///
2432    /// You must ensure that the `BTreeSet` invariants are maintained.
2433    /// Specifically:
2434    ///
2435    /// * The key of the newly inserted element must be unique in the tree.
2436    /// * All elements in the tree must remain in sorted order.
2437    #[unstable(feature = "btree_cursors", issue = "107540")]
2438    pub unsafe fn insert_after_unchecked(&mut self, value: T) {
2439        unsafe { self.inner.insert_after_unchecked(value, SetValZST) }
2440    }
2441
2442    /// Inserts a new element into the set in the gap that the
2443    /// cursor is currently pointing to.
2444    ///
2445    /// After the insertion the cursor will be pointing at the gap after the
2446    /// newly inserted element.
2447    ///
2448    /// # Safety
2449    ///
2450    /// You must ensure that the `BTreeSet` invariants are maintained.
2451    /// Specifically:
2452    ///
2453    /// * The newly inserted element must be unique in the tree.
2454    /// * All elements in the tree must remain in sorted order.
2455    #[unstable(feature = "btree_cursors", issue = "107540")]
2456    pub unsafe fn insert_before_unchecked(&mut self, value: T) {
2457        unsafe { self.inner.insert_before_unchecked(value, SetValZST) }
2458    }
2459
2460    /// Inserts a new element into the set in the gap that the
2461    /// cursor is currently pointing to.
2462    ///
2463    /// After the insertion the cursor will be pointing at the gap before the
2464    /// newly inserted element.
2465    ///
2466    /// If the inserted element is not greater than the element before the
2467    /// cursor (if any), or if it not less than the element after the cursor (if
2468    /// any), then an [`UnorderedKeyError`] is returned since this would
2469    /// invalidate the [`Ord`] invariant between the elements of the set.
2470    #[unstable(feature = "btree_cursors", issue = "107540")]
2471    pub fn insert_after(&mut self, value: T) -> Result<(), UnorderedKeyError> {
2472        self.inner.insert_after(value, SetValZST)
2473    }
2474
2475    /// Inserts a new element into the set in the gap that the
2476    /// cursor is currently pointing to.
2477    ///
2478    /// After the insertion the cursor will be pointing at the gap after the
2479    /// newly inserted element.
2480    ///
2481    /// If the inserted element is not greater than the element before the
2482    /// cursor (if any), or if it not less than the element after the cursor (if
2483    /// any), then an [`UnorderedKeyError`] is returned since this would
2484    /// invalidate the [`Ord`] invariant between the elements of the set.
2485    #[unstable(feature = "btree_cursors", issue = "107540")]
2486    pub fn insert_before(&mut self, value: T) -> Result<(), UnorderedKeyError> {
2487        self.inner.insert_before(value, SetValZST)
2488    }
2489
2490    /// Removes the next element from the `BTreeSet`.
2491    ///
2492    /// The element that was removed is returned. The cursor position is
2493    /// unchanged (before the removed element).
2494    #[unstable(feature = "btree_cursors", issue = "107540")]
2495    pub fn remove_next(&mut self) -> Option<T> {
2496        self.inner.remove_next().map(|(k, _)| k)
2497    }
2498
2499    /// Removes the preceding element from the `BTreeSet`.
2500    ///
2501    /// The element that was removed is returned. The cursor position is
2502    /// unchanged (after the removed element).
2503    #[unstable(feature = "btree_cursors", issue = "107540")]
2504    pub fn remove_prev(&mut self) -> Option<T> {
2505        self.inner.remove_prev().map(|(k, _)| k)
2506    }
2507}
2508
2509#[unstable(feature = "btree_cursors", issue = "107540")]
2510pub use super::map::UnorderedKeyError;
2511
2512#[cfg(test)]
2513mod 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