You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

135 lines
3.6 KiB

4 years ago
//! Map entries.
//!
//! The API is similar to that of `BTreeMap` and `HashMap`'s `Entry` types.
4 years ago
use super::*;
4 years ago
/// Varient of [`Entry`](Entry) that already contains a value.
4 years ago
#[derive(Debug)]
pub struct OccupiedEntry<'a, K, V>(pub(crate) &'a mut Option<(K,V)>);
impl<'a, K, V> OccupiedEntry<'a, K, V>
where K: Collapse
{
4 years ago
/// Get a reference to the value
4 years ago
pub fn get(&self) -> &V
{
&self.0.as_ref().unwrap().1
}
4 years ago
/// Get a mutable reference to the value
4 years ago
pub fn get_mut(&mut self) -> &mut V
{
&mut self.0.as_mut().unwrap().1
}
4 years ago
/// Consume this instance, returning the held mutable reference to the value
4 years ago
pub fn into_mut(self) -> &'a mut V
{
&mut self.0.as_mut().unwrap().1
}
4 years ago
/// A reference to the key
4 years ago
pub fn key(&self) -> &K
{
&self.0.as_ref().unwrap().0
}
4 years ago
/// Replace the held value with another, yielding the old one
4 years ago
pub fn insert(&mut self, value: V) -> V
{
2 years ago
core::mem::replace(&mut self.0.as_mut().unwrap().1, value)
4 years ago
}
4 years ago
/// Remove this entry from the `Map`, yielding the removed value
4 years ago
pub fn remove(self) -> V
{
self.remove_entry().1
}
4 years ago
/// Remove this entry from the `Map`, yielding the removed key-value pair.
4 years ago
pub fn remove_entry(self) -> (K, V)
{
self.0.take().unwrap()
}
}
4 years ago
/// Varient of [`Entry`](Entry) that does not contain a value.
4 years ago
#[derive(Debug)]
pub struct VacantEntry<'a,K,V>(pub(crate) &'a mut Option<(K,V)>, pub(crate) K);
impl<'a, K, V> VacantEntry<'a, K, V>
where K: Collapse
{
4 years ago
/// Insert a value into this empty slot, retuning a mutable reference to the new value.
4 years ago
pub fn insert(self, value: V) -> &'a mut V
{
*self.0 = Some((self.1, value));
&mut self.0.as_mut().unwrap().1
}
4 years ago
/// Consume this instance, returning the held key.
4 years ago
pub fn into_key(self) -> K
{
self.1
}
4 years ago
/// A reference to the held key
4 years ago
pub fn key(&self) -> &K
{
&self.1
}
}
4 years ago
/// Represents a space in a `Map` that may or may not contains a value.
4 years ago
#[derive(Debug)]
pub enum Entry<'a, K, V>
{
4 years ago
/// This entry slot does not yet contain a value
4 years ago
Vacant(VacantEntry<'a, K, V>),
4 years ago
/// This entry slot does contain a value
4 years ago
Occupied(OccupiedEntry<'a, K, V>),
}
impl<'a, K, V> Entry<'a, K, V>
where K: Collapse
{
4 years ago
/// Run this closure on a mutable reference to the internal value if it is present, otherwise do nothing.
4 years ago
pub fn and_modify<F: FnOnce(&mut V)>(mut self, f: F) -> Entry<'a, K, V>
{
if let Self::Occupied(occuped) = &mut self {
f(occuped.get_mut())
}
self
}
4 years ago
/// A reference to the key
4 years ago
pub fn key(&self) -> &K
{
match self {
Entry::Vacant(v) => v.key(),
Entry::Occupied(o) => o.key(),
}
}
4 years ago
/// Insert into the entry if it is empty the value returned by the closure and return a mutable reference to the new value, otherwise return a mutable reference to the already present value.
4 years ago
pub fn or_insert_with<F: FnOnce() -> V>(self, with: F) -> &'a mut V
{
match self {
Entry::Occupied(o) => o.into_mut(),
Entry::Vacant(v) => v.insert(with())
}
}
4 years ago
/// Insert into the entry this value if it is empty and return a mutable reference to the new value, otherwise return a mutable reference to the already present value.
4 years ago
#[inline] pub fn or_insert(self, value: V) -> &'a mut V
{
self.or_insert_with(|| value)
}
}
impl<'a, K, V> Entry<'a, K, V>
where K: Collapse,
V: Default
{
4 years ago
/// Insert into the entry the default value if it is empty and return a mutable reference to the new value, otherwise return a mutable reference to the already present value.
4 years ago
#[inline] pub fn or_default(self) -> &'a mut V
{
self.or_insert_with(Default::default)
}
}