| use core::fmt::{self, Debug}; |
| |
| use Entry::*; |
| |
| use super::{SetValZST, map}; |
| use crate::alloc::{Allocator, Global}; |
| |
| /// A view into a single entry in a set, which may either be vacant or occupied. |
| /// |
| /// This `enum` is constructed from the [`entry`] method on [`BTreeSet`]. |
| /// |
| /// [`BTreeSet`]: super::BTreeSet |
| /// [`entry`]: super::BTreeSet::entry |
| /// |
| /// # Examples |
| /// |
| /// ``` |
| /// #![feature(btree_set_entry)] |
| /// |
| /// use std::collections::btree_set::BTreeSet; |
| /// |
| /// let mut set = BTreeSet::new(); |
| /// set.extend(["a", "b", "c"]); |
| /// assert_eq!(set.len(), 3); |
| /// |
| /// // Existing value (insert) |
| /// let entry = set.entry("a"); |
| /// let _raw_o = entry.insert(); |
| /// assert_eq!(set.len(), 3); |
| /// // Nonexistent value (insert) |
| /// set.entry("d").insert(); |
| /// |
| /// // Existing value (or_insert) |
| /// set.entry("b").or_insert(); |
| /// // Nonexistent value (or_insert) |
| /// set.entry("e").or_insert(); |
| /// |
| /// println!("Our BTreeSet: {:?}", set); |
| /// assert!(set.iter().eq(&["a", "b", "c", "d", "e"])); |
| /// ``` |
| #[unstable(feature = "btree_set_entry", issue = "133549")] |
| pub enum Entry< |
| 'a, |
| T, |
| #[unstable(feature = "allocator_api", issue = "32838")] A: Allocator + Clone = Global, |
| > { |
| /// An occupied entry. |
| /// |
| /// # Examples |
| /// |
| /// ``` |
| /// #![feature(btree_set_entry)] |
| /// |
| /// use std::collections::btree_set::{Entry, BTreeSet}; |
| /// |
| /// let mut set = BTreeSet::from(["a", "b"]); |
| /// |
| /// match set.entry("a") { |
| /// Entry::Vacant(_) => unreachable!(), |
| /// Entry::Occupied(_) => { } |
| /// } |
| /// ``` |
| #[unstable(feature = "btree_set_entry", issue = "133549")] |
| Occupied(OccupiedEntry<'a, T, A>), |
| |
| /// A vacant entry. |
| /// |
| /// # Examples |
| /// |
| /// ``` |
| /// #![feature(btree_set_entry)] |
| /// |
| /// use std::collections::btree_set::{Entry, BTreeSet}; |
| /// |
| /// let mut set = BTreeSet::new(); |
| /// |
| /// match set.entry("a") { |
| /// Entry::Occupied(_) => unreachable!(), |
| /// Entry::Vacant(_) => { } |
| /// } |
| /// ``` |
| #[unstable(feature = "btree_set_entry", issue = "133549")] |
| Vacant(VacantEntry<'a, T, A>), |
| } |
| |
| #[unstable(feature = "btree_set_entry", issue = "133549")] |
| impl<T: Debug + Ord, A: Allocator + Clone> Debug for Entry<'_, T, A> { |
| fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
| match *self { |
| Vacant(ref v) => f.debug_tuple("Entry").field(v).finish(), |
| Occupied(ref o) => f.debug_tuple("Entry").field(o).finish(), |
| } |
| } |
| } |
| |
| /// A view into an occupied entry in a `BTreeSet`. |
| /// It is part of the [`Entry`] enum. |
| /// |
| /// # Examples |
| /// |
| /// ``` |
| /// #![feature(btree_set_entry)] |
| /// |
| /// use std::collections::btree_set::{Entry, BTreeSet}; |
| /// |
| /// let mut set = BTreeSet::new(); |
| /// set.extend(["a", "b", "c"]); |
| /// |
| /// let _entry_o = set.entry("a").insert(); |
| /// assert_eq!(set.len(), 3); |
| /// |
| /// // Existing key |
| /// match set.entry("a") { |
| /// Entry::Vacant(_) => unreachable!(), |
| /// Entry::Occupied(view) => { |
| /// assert_eq!(view.get(), &"a"); |
| /// } |
| /// } |
| /// |
| /// assert_eq!(set.len(), 3); |
| /// |
| /// // Existing key (take) |
| /// match set.entry("c") { |
| /// Entry::Vacant(_) => unreachable!(), |
| /// Entry::Occupied(view) => { |
| /// assert_eq!(view.remove(), "c"); |
| /// } |
| /// } |
| /// assert_eq!(set.get(&"c"), None); |
| /// assert_eq!(set.len(), 2); |
| /// ``` |
| #[unstable(feature = "btree_set_entry", issue = "133549")] |
| pub struct OccupiedEntry< |
| 'a, |
| T, |
| #[unstable(feature = "allocator_api", issue = "32838")] A: Allocator + Clone = Global, |
| > { |
| pub(super) inner: map::OccupiedEntry<'a, T, SetValZST, A>, |
| } |
| |
| #[unstable(feature = "btree_set_entry", issue = "133549")] |
| impl<T: Debug + Ord, A: Allocator + Clone> Debug for OccupiedEntry<'_, T, A> { |
| fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
| f.debug_struct("OccupiedEntry").field("value", self.get()).finish() |
| } |
| } |
| |
| /// A view into a vacant entry in a `BTreeSet`. |
| /// It is part of the [`Entry`] enum. |
| /// |
| /// # Examples |
| /// |
| /// ``` |
| /// #![feature(btree_set_entry)] |
| /// |
| /// use std::collections::btree_set::{Entry, BTreeSet}; |
| /// |
| /// let mut set = BTreeSet::<&str>::new(); |
| /// |
| /// let entry_v = match set.entry("a") { |
| /// Entry::Vacant(view) => view, |
| /// Entry::Occupied(_) => unreachable!(), |
| /// }; |
| /// entry_v.insert(); |
| /// assert!(set.contains("a") && set.len() == 1); |
| /// |
| /// // Nonexistent key (insert) |
| /// match set.entry("b") { |
| /// Entry::Vacant(view) => view.insert(), |
| /// Entry::Occupied(_) => unreachable!(), |
| /// } |
| /// assert!(set.contains("b") && set.len() == 2); |
| /// ``` |
| #[unstable(feature = "btree_set_entry", issue = "133549")] |
| pub struct VacantEntry< |
| 'a, |
| T, |
| #[unstable(feature = "allocator_api", issue = "32838")] A: Allocator + Clone = Global, |
| > { |
| pub(super) inner: map::VacantEntry<'a, T, SetValZST, A>, |
| } |
| |
| #[unstable(feature = "btree_set_entry", issue = "133549")] |
| impl<T: Debug + Ord, A: Allocator + Clone> Debug for VacantEntry<'_, T, A> { |
| fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
| f.debug_tuple("VacantEntry").field(self.get()).finish() |
| } |
| } |
| |
| impl<'a, T: Ord, A: Allocator + Clone> Entry<'a, T, A> { |
| /// Sets the value of the entry, and returns an `OccupiedEntry`. |
| /// |
| /// # Examples |
| /// |
| /// ``` |
| /// #![feature(btree_set_entry)] |
| /// |
| /// use std::collections::BTreeSet; |
| /// |
| /// let mut set = BTreeSet::new(); |
| /// let entry = set.entry("horseyland").insert(); |
| /// |
| /// assert_eq!(entry.get(), &"horseyland"); |
| /// ``` |
| #[inline] |
| #[unstable(feature = "btree_set_entry", issue = "133549")] |
| pub fn insert(self) -> OccupiedEntry<'a, T, A> { |
| match self { |
| Occupied(entry) => entry, |
| Vacant(entry) => entry.insert_entry(), |
| } |
| } |
| |
| /// Ensures a value is in the entry by inserting if it was vacant. |
| /// |
| /// # Examples |
| /// |
| /// ``` |
| /// #![feature(btree_set_entry)] |
| /// |
| /// use std::collections::BTreeSet; |
| /// |
| /// let mut set = BTreeSet::new(); |
| /// |
| /// // nonexistent key |
| /// set.entry("poneyland").or_insert(); |
| /// assert!(set.contains("poneyland")); |
| /// |
| /// // existing key |
| /// set.entry("poneyland").or_insert(); |
| /// assert!(set.contains("poneyland")); |
| /// assert_eq!(set.len(), 1); |
| /// ``` |
| #[inline] |
| #[unstable(feature = "btree_set_entry", issue = "133549")] |
| pub fn or_insert(self) { |
| if let Vacant(entry) = self { |
| entry.insert(); |
| } |
| } |
| |
| /// Returns a reference to this entry's value. |
| /// |
| /// # Examples |
| /// |
| /// ``` |
| /// #![feature(btree_set_entry)] |
| /// |
| /// use std::collections::BTreeSet; |
| /// |
| /// let mut set = BTreeSet::new(); |
| /// set.entry("poneyland").or_insert(); |
| /// |
| /// // existing key |
| /// assert_eq!(set.entry("poneyland").get(), &"poneyland"); |
| /// // nonexistent key |
| /// assert_eq!(set.entry("horseland").get(), &"horseland"); |
| /// ``` |
| #[inline] |
| #[unstable(feature = "btree_set_entry", issue = "133549")] |
| pub fn get(&self) -> &T { |
| match *self { |
| Occupied(ref entry) => entry.get(), |
| Vacant(ref entry) => entry.get(), |
| } |
| } |
| } |
| |
| impl<'a, T: Ord, A: Allocator + Clone> OccupiedEntry<'a, T, A> { |
| /// Gets a reference to the value in the entry. |
| /// |
| /// # Examples |
| /// |
| /// ``` |
| /// #![feature(btree_set_entry)] |
| /// |
| /// use std::collections::btree_set::{Entry, BTreeSet}; |
| /// |
| /// let mut set = BTreeSet::new(); |
| /// set.entry("poneyland").or_insert(); |
| /// |
| /// match set.entry("poneyland") { |
| /// Entry::Vacant(_) => panic!(), |
| /// Entry::Occupied(entry) => assert_eq!(entry.get(), &"poneyland"), |
| /// } |
| /// ``` |
| #[inline] |
| #[unstable(feature = "btree_set_entry", issue = "133549")] |
| pub fn get(&self) -> &T { |
| self.inner.key() |
| } |
| |
| /// Takes the value out of the entry, and returns it. |
| /// |
| /// # Examples |
| /// |
| /// ``` |
| /// #![feature(btree_set_entry)] |
| /// |
| /// use std::collections::BTreeSet; |
| /// use std::collections::btree_set::Entry; |
| /// |
| /// let mut set = BTreeSet::new(); |
| /// set.entry("poneyland").or_insert(); |
| /// |
| /// if let Entry::Occupied(o) = set.entry("poneyland") { |
| /// assert_eq!(o.remove(), "poneyland"); |
| /// } |
| /// |
| /// assert_eq!(set.contains("poneyland"), false); |
| /// ``` |
| #[inline] |
| #[unstable(feature = "btree_set_entry", issue = "133549")] |
| pub fn remove(self) -> T { |
| self.inner.remove_entry().0 |
| } |
| } |
| |
| impl<'a, T: Ord, A: Allocator + Clone> VacantEntry<'a, T, A> { |
| /// Gets a reference to the value that would be used when inserting |
| /// through the `VacantEntry`. |
| /// |
| /// # Examples |
| /// |
| /// ``` |
| /// #![feature(btree_set_entry)] |
| /// |
| /// use std::collections::BTreeSet; |
| /// |
| /// let mut set = BTreeSet::new(); |
| /// assert_eq!(set.entry("poneyland").get(), &"poneyland"); |
| /// ``` |
| #[inline] |
| #[unstable(feature = "btree_set_entry", issue = "133549")] |
| pub fn get(&self) -> &T { |
| self.inner.key() |
| } |
| |
| /// Take ownership of the value. |
| /// |
| /// # Examples |
| /// |
| /// ``` |
| /// #![feature(btree_set_entry)] |
| /// |
| /// use std::collections::btree_set::{Entry, BTreeSet}; |
| /// |
| /// let mut set = BTreeSet::new(); |
| /// |
| /// match set.entry("poneyland") { |
| /// Entry::Occupied(_) => panic!(), |
| /// Entry::Vacant(v) => assert_eq!(v.into_value(), "poneyland"), |
| /// } |
| /// ``` |
| #[inline] |
| #[unstable(feature = "btree_set_entry", issue = "133549")] |
| pub fn into_value(self) -> T { |
| self.inner.into_key() |
| } |
| |
| /// Sets the value of the entry with the VacantEntry's value. |
| /// |
| /// # Examples |
| /// |
| /// ``` |
| /// #![feature(btree_set_entry)] |
| /// |
| /// use std::collections::BTreeSet; |
| /// use std::collections::btree_set::Entry; |
| /// |
| /// let mut set = BTreeSet::new(); |
| /// |
| /// if let Entry::Vacant(o) = set.entry("poneyland") { |
| /// o.insert(); |
| /// } |
| /// assert!(set.contains("poneyland")); |
| /// ``` |
| #[inline] |
| #[unstable(feature = "btree_set_entry", issue = "133549")] |
| pub fn insert(self) { |
| self.inner.insert(SetValZST); |
| } |
| |
| #[inline] |
| fn insert_entry(self) -> OccupiedEntry<'a, T, A> { |
| OccupiedEntry { inner: self.inner.insert_entry(SetValZST) } |
| } |
| } |