Struct RawOccupiedEntryMut
pub struct RawOccupiedEntryMut<'a, K, V, S, A = Global>where
A: Allocator,{ /* private fields */ }
dep_hashbrown
and alloc
only.Expand description
A view into an occupied entry in a HashMap
.
It is part of the RawEntryMut
enum.
§Examples
use core::hash::{BuildHasher, Hash};
use hashbrown::hash_map::{HashMap, RawEntryMut, RawOccupiedEntryMut};
let mut map = HashMap::new();
map.extend([("a", 10), ("b", 20), ("c", 30)]);
fn compute_hash<K: Hash + ?Sized, S: BuildHasher>(hash_builder: &S, key: &K) -> u64 {
use core::hash::Hasher;
let mut state = hash_builder.build_hasher();
key.hash(&mut state);
state.finish()
}
let _raw_o: RawOccupiedEntryMut<_, _, _> = map.raw_entry_mut().from_key(&"a").insert("a", 100);
assert_eq!(map.len(), 3);
// Existing key (insert and update)
match map.raw_entry_mut().from_key(&"a") {
RawEntryMut::Vacant(_) => unreachable!(),
RawEntryMut::Occupied(mut view) => {
assert_eq!(view.get(), &100);
let v = view.get_mut();
let new_v = (*v) * 10;
*v = new_v;
assert_eq!(view.insert(1111), 1000);
}
}
assert_eq!(map[&"a"], 1111);
assert_eq!(map.len(), 3);
// Existing key (take)
let hash = compute_hash(map.hasher(), &"c");
match map.raw_entry_mut().from_key_hashed_nocheck(hash, &"c") {
RawEntryMut::Vacant(_) => unreachable!(),
RawEntryMut::Occupied(view) => {
assert_eq!(view.remove_entry(), ("c", 30));
}
}
assert_eq!(map.raw_entry().from_key(&"c"), None);
assert_eq!(map.len(), 2);
let hash = compute_hash(map.hasher(), &"b");
match map.raw_entry_mut().from_hash(hash, |q| *q == "b") {
RawEntryMut::Vacant(_) => unreachable!(),
RawEntryMut::Occupied(view) => {
assert_eq!(view.remove_entry(), ("b", 20));
}
}
assert_eq!(map.get(&"b"), None);
assert_eq!(map.len(), 1);
Implementations§
§impl<'a, K, V, S, A> RawOccupiedEntryMut<'a, K, V, S, A>where
A: Allocator,
impl<'a, K, V, S, A> RawOccupiedEntryMut<'a, K, V, S, A>where
A: Allocator,
pub fn key(&self) -> &K
pub fn key(&self) -> &K
Gets a reference to the key in the entry.
§Examples
use hashbrown::hash_map::{HashMap, RawEntryMut};
let mut map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into();
match map.raw_entry_mut().from_key(&"a") {
RawEntryMut::Vacant(_) => panic!(),
RawEntryMut::Occupied(o) => assert_eq!(o.key(), &"a")
}
pub fn key_mut(&mut self) -> &mut K
pub fn key_mut(&mut self) -> &mut K
Gets a mutable reference to the key in the entry.
§Examples
use hashbrown::hash_map::{HashMap, RawEntryMut};
use std::rc::Rc;
let key_one = Rc::new("a");
let key_two = Rc::new("a");
let mut map: HashMap<Rc<&str>, u32> = HashMap::new();
map.insert(key_one.clone(), 10);
assert_eq!(map[&key_one], 10);
assert!(Rc::strong_count(&key_one) == 2 && Rc::strong_count(&key_two) == 1);
match map.raw_entry_mut().from_key(&key_one) {
RawEntryMut::Vacant(_) => panic!(),
RawEntryMut::Occupied(mut o) => {
*o.key_mut() = key_two.clone();
}
}
assert_eq!(map[&key_two], 10);
assert!(Rc::strong_count(&key_one) == 1 && Rc::strong_count(&key_two) == 2);
pub fn into_key(self) -> &'a mut K
pub fn into_key(self) -> &'a mut K
Converts the entry into a mutable reference to the key in the entry with a lifetime bound to the map itself.
§Examples
use hashbrown::hash_map::{HashMap, RawEntryMut};
use std::rc::Rc;
let key_one = Rc::new("a");
let key_two = Rc::new("a");
let mut map: HashMap<Rc<&str>, u32> = HashMap::new();
map.insert(key_one.clone(), 10);
assert_eq!(map[&key_one], 10);
assert!(Rc::strong_count(&key_one) == 2 && Rc::strong_count(&key_two) == 1);
let inside_key: &mut Rc<&str>;
match map.raw_entry_mut().from_key(&key_one) {
RawEntryMut::Vacant(_) => panic!(),
RawEntryMut::Occupied(o) => inside_key = o.into_key(),
}
*inside_key = key_two.clone();
assert_eq!(map[&key_two], 10);
assert!(Rc::strong_count(&key_one) == 1 && Rc::strong_count(&key_two) == 2);
pub fn get(&self) -> &V
pub fn get(&self) -> &V
Gets a reference to the value in the entry.
§Examples
use hashbrown::hash_map::{HashMap, RawEntryMut};
let mut map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into();
match map.raw_entry_mut().from_key(&"a") {
RawEntryMut::Vacant(_) => panic!(),
RawEntryMut::Occupied(o) => assert_eq!(o.get(), &100),
}
pub fn into_mut(self) -> &'a mut V
pub fn into_mut(self) -> &'a mut V
Converts the OccupiedEntry
into a mutable reference to the value in the entry
with a lifetime bound to the map itself.
§Examples
use hashbrown::hash_map::{HashMap, RawEntryMut};
let mut map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into();
let value: &mut u32;
match map.raw_entry_mut().from_key(&"a") {
RawEntryMut::Vacant(_) => panic!(),
RawEntryMut::Occupied(o) => value = o.into_mut(),
}
*value += 900;
assert_eq!(map[&"a"], 1000);
pub fn get_mut(&mut self) -> &mut V
pub fn get_mut(&mut self) -> &mut V
Gets a mutable reference to the value in the entry.
§Examples
use hashbrown::hash_map::{HashMap, RawEntryMut};
let mut map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into();
match map.raw_entry_mut().from_key(&"a") {
RawEntryMut::Vacant(_) => panic!(),
RawEntryMut::Occupied(mut o) => *o.get_mut() += 900,
}
assert_eq!(map[&"a"], 1000);
pub fn get_key_value(&self) -> (&K, &V) ⓘ
pub fn get_key_value(&self) -> (&K, &V) ⓘ
Gets a reference to the key and value in the entry.
§Examples
use hashbrown::hash_map::{HashMap, RawEntryMut};
let mut map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into();
match map.raw_entry_mut().from_key(&"a") {
RawEntryMut::Vacant(_) => panic!(),
RawEntryMut::Occupied(o) => assert_eq!(o.get_key_value(), (&"a", &100)),
}
pub fn get_key_value_mut(&mut self) -> (&mut K, &mut V) ⓘ
pub fn get_key_value_mut(&mut self) -> (&mut K, &mut V) ⓘ
Gets a mutable reference to the key and value in the entry.
§Examples
use hashbrown::hash_map::{HashMap, RawEntryMut};
use std::rc::Rc;
let key_one = Rc::new("a");
let key_two = Rc::new("a");
let mut map: HashMap<Rc<&str>, u32> = HashMap::new();
map.insert(key_one.clone(), 10);
assert_eq!(map[&key_one], 10);
assert!(Rc::strong_count(&key_one) == 2 && Rc::strong_count(&key_two) == 1);
match map.raw_entry_mut().from_key(&key_one) {
RawEntryMut::Vacant(_) => panic!(),
RawEntryMut::Occupied(mut o) => {
let (inside_key, inside_value) = o.get_key_value_mut();
*inside_key = key_two.clone();
*inside_value = 100;
}
}
assert_eq!(map[&key_two], 100);
assert!(Rc::strong_count(&key_one) == 1 && Rc::strong_count(&key_two) == 2);
pub fn into_key_value(self) -> (&'a mut K, &'a mut V) ⓘ
pub fn into_key_value(self) -> (&'a mut K, &'a mut V) ⓘ
Converts the OccupiedEntry
into a mutable reference to the key and value in the entry
with a lifetime bound to the map itself.
§Examples
use hashbrown::hash_map::{HashMap, RawEntryMut};
use std::rc::Rc;
let key_one = Rc::new("a");
let key_two = Rc::new("a");
let mut map: HashMap<Rc<&str>, u32> = HashMap::new();
map.insert(key_one.clone(), 10);
assert_eq!(map[&key_one], 10);
assert!(Rc::strong_count(&key_one) == 2 && Rc::strong_count(&key_two) == 1);
let inside_key: &mut Rc<&str>;
let inside_value: &mut u32;
match map.raw_entry_mut().from_key(&key_one) {
RawEntryMut::Vacant(_) => panic!(),
RawEntryMut::Occupied(o) => {
let tuple = o.into_key_value();
inside_key = tuple.0;
inside_value = tuple.1;
}
}
*inside_key = key_two.clone();
*inside_value = 100;
assert_eq!(map[&key_two], 100);
assert!(Rc::strong_count(&key_one) == 1 && Rc::strong_count(&key_two) == 2);
pub fn insert(&mut self, value: V) -> V
pub fn insert(&mut self, value: V) -> V
Sets the value of the entry, and returns the entry’s old value.
§Examples
use hashbrown::hash_map::{HashMap, RawEntryMut};
let mut map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into();
match map.raw_entry_mut().from_key(&"a") {
RawEntryMut::Vacant(_) => panic!(),
RawEntryMut::Occupied(mut o) => assert_eq!(o.insert(1000), 100),
}
assert_eq!(map[&"a"], 1000);
pub fn insert_key(&mut self, key: K) -> K
pub fn insert_key(&mut self, key: K) -> K
Sets the value of the entry, and returns the entry’s old value.
§Examples
use hashbrown::hash_map::{HashMap, RawEntryMut};
use std::rc::Rc;
let key_one = Rc::new("a");
let key_two = Rc::new("a");
let mut map: HashMap<Rc<&str>, u32> = HashMap::new();
map.insert(key_one.clone(), 10);
assert_eq!(map[&key_one], 10);
assert!(Rc::strong_count(&key_one) == 2 && Rc::strong_count(&key_two) == 1);
match map.raw_entry_mut().from_key(&key_one) {
RawEntryMut::Vacant(_) => panic!(),
RawEntryMut::Occupied(mut o) => {
let old_key = o.insert_key(key_two.clone());
assert!(Rc::ptr_eq(&old_key, &key_one));
}
}
assert_eq!(map[&key_two], 10);
assert!(Rc::strong_count(&key_one) == 1 && Rc::strong_count(&key_two) == 2);
pub fn remove(self) -> V
pub fn remove(self) -> V
Takes the value out of the entry, and returns it.
§Examples
use hashbrown::hash_map::{HashMap, RawEntryMut};
let mut map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into();
match map.raw_entry_mut().from_key(&"a") {
RawEntryMut::Vacant(_) => panic!(),
RawEntryMut::Occupied(o) => assert_eq!(o.remove(), 100),
}
assert_eq!(map.get(&"a"), None);
pub fn remove_entry(self) -> (K, V) ⓘ
pub fn remove_entry(self) -> (K, V) ⓘ
Take the ownership of the key and value from the map.
§Examples
use hashbrown::hash_map::{HashMap, RawEntryMut};
let mut map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into();
match map.raw_entry_mut().from_key(&"a") {
RawEntryMut::Vacant(_) => panic!(),
RawEntryMut::Occupied(o) => assert_eq!(o.remove_entry(), ("a", 100)),
}
assert_eq!(map.get(&"a"), None);
pub fn replace_entry_with<F>(self, f: F) -> RawEntryMut<'a, K, V, S, A>
pub fn replace_entry_with<F>(self, f: F) -> RawEntryMut<'a, K, V, S, A>
Provides shared access to the key and owned access to the value of the entry and allows to replace or remove it based on the value of the returned option.
§Examples
use hashbrown::hash_map::{HashMap, RawEntryMut};
let mut map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into();
let raw_entry = match map.raw_entry_mut().from_key(&"a") {
RawEntryMut::Vacant(_) => panic!(),
RawEntryMut::Occupied(o) => o.replace_entry_with(|k, v| {
assert_eq!(k, &"a");
assert_eq!(v, 100);
Some(v + 900)
}),
};
let raw_entry = match raw_entry {
RawEntryMut::Vacant(_) => panic!(),
RawEntryMut::Occupied(o) => o.replace_entry_with(|k, v| {
assert_eq!(k, &"a");
assert_eq!(v, 1000);
None
}),
};
match raw_entry {
RawEntryMut::Vacant(_) => { },
RawEntryMut::Occupied(_) => panic!(),
};
assert_eq!(map.get(&"a"), None);
Trait Implementations§
§impl<K, V, S, A> Debug for RawOccupiedEntryMut<'_, K, V, S, A>
impl<K, V, S, A> Debug for RawOccupiedEntryMut<'_, K, V, S, A>
impl<K, V, S, A> Send for RawOccupiedEntryMut<'_, K, V, S, A>
impl<K, V, S, A> Sync for RawOccupiedEntryMut<'_, K, V, S, A>
Auto Trait Implementations§
impl<'a, K, V, S, A> Freeze for RawOccupiedEntryMut<'a, K, V, S, A>
impl<'a, K, V, S, A> RefUnwindSafe for RawOccupiedEntryMut<'a, K, V, S, A>
impl<'a, K, V, S, A> Unpin for RawOccupiedEntryMut<'a, K, V, S, A>
impl<'a, K, V, S, A = Global> !UnwindSafe for RawOccupiedEntryMut<'a, K, V, S, A>
Blanket Implementations§
§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
§type ArchivedMetadata = ()
type ArchivedMetadata = ()
§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> ByteSized for T
impl<T> ByteSized for T
Source§const BYTE_ALIGN: usize = _
const BYTE_ALIGN: usize = _
Source§fn byte_align(&self) -> usize ⓘ
fn byte_align(&self) -> usize ⓘ
Source§fn ptr_size_ratio(&self) -> [usize; 2]
fn ptr_size_ratio(&self) -> [usize; 2]
Source§impl<T, R> Chain<R> for Twhere
T: ?Sized,
impl<T, R> Chain<R> for Twhere
T: ?Sized,
Source§impl<T> ExtAny for T
impl<T> ExtAny for T
Source§fn as_any_mut(&mut self) -> &mut dyn Anywhere
Self: Sized,
fn as_any_mut(&mut self) -> &mut dyn Anywhere
Self: Sized,
Source§impl<T> ExtMem for Twhere
T: ?Sized,
impl<T> ExtMem for Twhere
T: ?Sized,
Source§const NEEDS_DROP: bool = _
const NEEDS_DROP: bool = _
Source§fn mem_align_of_val(&self) -> usize ⓘ
fn mem_align_of_val(&self) -> usize ⓘ
Source§fn mem_size_of_val(&self) -> usize ⓘ
fn mem_size_of_val(&self) -> usize ⓘ
Source§fn mem_needs_drop(&self) -> bool
fn mem_needs_drop(&self) -> bool
true
if dropping values of this type matters. Read moreSource§fn mem_forget(self)where
Self: Sized,
fn mem_forget(self)where
Self: Sized,
self
without running its destructor. Read moreSource§fn mem_replace(&mut self, other: Self) -> Selfwhere
Self: Sized,
fn mem_replace(&mut self, other: Self) -> Selfwhere
Self: Sized,
Source§unsafe fn mem_zeroed<T>() -> T
unsafe fn mem_zeroed<T>() -> T
unsafe_layout
only.T
represented by the all-zero byte-pattern. Read moreSource§unsafe fn mem_transmute_copy<Src, Dst>(src: &Src) -> Dst
unsafe fn mem_transmute_copy<Src, Dst>(src: &Src) -> Dst
unsafe_layout
only.T
represented by the all-zero byte-pattern. Read moreSource§fn mem_as_bytes(&self) -> &[u8] ⓘ
fn mem_as_bytes(&self) -> &[u8] ⓘ
unsafe_slice
only.§impl<S> FromSample<S> for S
impl<S> FromSample<S> for S
fn from_sample_(s: S) -> S
Source§impl<T> Hook for T
impl<T> Hook for T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more§impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
fn into_sample(self) -> T
§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError> ⓘ
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError> ⓘ
§impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
§unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
§fn resolve_niched(out: Place<NichedOption<T, N1>>)
fn resolve_niched(out: Place<NichedOption<T, N1>>)
out
indicating that a T
is niched.