pub unsafe trait SplitMut<K, V> {
// Required methods
fn get1_mut(&mut self, k1: K) -> Option<&mut V>;
unsafe fn get1_unchecked_mut(&mut self, k1: K) -> &mut V;
// Provided methods
fn get2_mut(
&mut self,
k1: K,
k2: K
) -> (Result<&mut V, SplitMutError>, Result<&mut V, SplitMutError>) { ... }
fn get3_mut(
&mut self,
k1: K,
k2: K,
k3: K
) -> (Result<&mut V, SplitMutError>, Result<&mut V, SplitMutError>, Result<&mut V, SplitMutError>) { ... }
fn get4_mut(
&mut self,
k1: K,
k2: K,
k3: K,
k4: K
) -> (Result<&mut V, SplitMutError>, Result<&mut V, SplitMutError>, Result<&mut V, SplitMutError>, Result<&mut V, SplitMutError>) { ... }
fn get_muts(&mut self) -> GetMuts<'_, K, V, Self> { ... }
fn get_mut_iter<I: Iterator<Item = K>>(
&mut self,
i: I
) -> GetMutIter<'_, K, V, Self, I> ⓘ { ... }
unsafe fn get2_unchecked_mut(&mut self, k1: K, k2: K) -> (&mut V, &mut V) { ... }
unsafe fn get3_unchecked_mut(
&mut self,
k1: K,
k2: K,
k3: K
) -> (&mut V, &mut V, &mut V) { ... }
unsafe fn get4_unchecked_mut(
&mut self,
k1: K,
k2: K,
k3: K,
k4: K
) -> (&mut V, &mut V, &mut V, &mut V) { ... }
}
Expand description
Just add use splitmut::SplitMut;
to have these methods working on
mutable slices, Vec, VecDeque, HashMap and BTreeMap.
In case you want to implement SplitMut
for your own collection, just
implement get1_mut
and get1_unchecked_mut
and the other methods will
be provided for you. If you do so, you must make sure that these functions
do not mutate your collection in ways that would invalidate previously returned
values from get1_mut
and get1_unchecked_mut
.
Required Methods§
sourceunsafe fn get1_unchecked_mut(&mut self, k1: K) -> &mut V
unsafe fn get1_unchecked_mut(&mut self, k1: K) -> &mut V
Wrapper for get_unchecked_mut, used internally.
Undefined behaviour
It is undefined behaviour to call this with a key that does not correspond to a value. You have been warned.
Provided Methods§
sourcefn get2_mut(
&mut self,
k1: K,
k2: K
) -> (Result<&mut V, SplitMutError>, Result<&mut V, SplitMutError>)
fn get2_mut( &mut self, k1: K, k2: K ) -> (Result<&mut V, SplitMutError>, Result<&mut V, SplitMutError>)
Returns two mutable references to two distinct values within the same collection.
sourcefn get3_mut(
&mut self,
k1: K,
k2: K,
k3: K
) -> (Result<&mut V, SplitMutError>, Result<&mut V, SplitMutError>, Result<&mut V, SplitMutError>)
fn get3_mut( &mut self, k1: K, k2: K, k3: K ) -> (Result<&mut V, SplitMutError>, Result<&mut V, SplitMutError>, Result<&mut V, SplitMutError>)
Returns three mutable references to three distinct values within the same collection.
sourcefn get4_mut(
&mut self,
k1: K,
k2: K,
k3: K,
k4: K
) -> (Result<&mut V, SplitMutError>, Result<&mut V, SplitMutError>, Result<&mut V, SplitMutError>, Result<&mut V, SplitMutError>)
fn get4_mut( &mut self, k1: K, k2: K, k3: K, k4: K ) -> (Result<&mut V, SplitMutError>, Result<&mut V, SplitMutError>, Result<&mut V, SplitMutError>, Result<&mut V, SplitMutError>)
Returns four mutable references to four distinct values within the same collection.
sourcefn get_muts(&mut self) -> GetMuts<'_, K, V, Self>
fn get_muts(&mut self) -> GetMuts<'_, K, V, Self>
Returns any number mutable references to distinct values within the same collection. A HashSet is used internally to keep track of values already returned.
Example
use splitmut::SplitMut;
let mut h = vec!["Hello", "world", "!"];
let mut z = h.get_muts();
let a = z.at(0);
let b = z.at(1);
assert_eq!(a, Ok(&mut "Hello"));
assert_eq!(b, Ok(&mut "world"));
sourcefn get_mut_iter<I: Iterator<Item = K>>(
&mut self,
i: I
) -> GetMutIter<'_, K, V, Self, I> ⓘ
fn get_mut_iter<I: Iterator<Item = K>>( &mut self, i: I ) -> GetMutIter<'_, K, V, Self, I> ⓘ
Returns an iterator adapter that maps from a K to a Result<V, SplitMutError>. A HashSet is used internally to keep track of values already returned.
Example
use std::collections::BTreeMap;
use splitmut::{SplitMut, SplitMutError};
let mut h = BTreeMap::new();
h.insert(String::from("borrow"), 1);
h.insert(String::from("me"), 2);
let slice = ["me", "borrow", "me"];
let z: Vec<_> = h.get_mut_iter(slice.into_iter().map(|&k| k)).collect();
assert_eq!(&*z, [Ok(&mut 2), Ok(&mut 1), Err(SplitMutError::SameValue)]);
sourceunsafe fn get2_unchecked_mut(&mut self, k1: K, k2: K) -> (&mut V, &mut V)
unsafe fn get2_unchecked_mut(&mut self, k1: K, k2: K) -> (&mut V, &mut V)
Returns two mutable references to two distinct values within the same collection.
Undefined behaviour
It is undefined behaviour to call this with a key that does not correspond to a value, or with keys pointing to the same value. You have been warned.
sourceunsafe fn get3_unchecked_mut(
&mut self,
k1: K,
k2: K,
k3: K
) -> (&mut V, &mut V, &mut V)
unsafe fn get3_unchecked_mut( &mut self, k1: K, k2: K, k3: K ) -> (&mut V, &mut V, &mut V)
Returns three mutable references to three distinct values within the same collection.
Undefined behaviour
It is undefined behaviour to call this with a key that does not correspond to a value, or with any two keys pointing to the same value. You have been warned.
sourceunsafe fn get4_unchecked_mut(
&mut self,
k1: K,
k2: K,
k3: K,
k4: K
) -> (&mut V, &mut V, &mut V, &mut V)
unsafe fn get4_unchecked_mut( &mut self, k1: K, k2: K, k3: K, k4: K ) -> (&mut V, &mut V, &mut V, &mut V)
Returns four mutable references to four distinct values within the same collection.
Undefined behaviour
It is undefined behaviour to call this with a key that does not correspond to a value, or with any two keys pointing to the same value. You have been warned.