Trait splitmut::SplitMut

source ·
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§

source

fn get1_mut(&mut self, k1: K) -> Option<&mut V>

Wrapper for get_mut, used internally.

source

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§

source

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.

source

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.

source

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.

source

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"));
source

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)]);
source

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.

source

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.

source

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.

Object Safety§

This trait is not object safe.

Implementations on Foreign Types§

source§

impl<'a, K: Ord + Borrow<Q>, Q: Ord + ?Sized, V> SplitMut<&'a Q, V> for BTreeMap<K, V>

source§

fn get1_mut(&mut self, k: &'a Q) -> Option<&mut V>

source§

unsafe fn get1_unchecked_mut(&mut self, k: &'a Q) -> &mut V

source§

impl<'a, K: Hash + Eq + Borrow<Q>, Q: Hash + Eq + ?Sized, V, S: BuildHasher> SplitMut<&'a Q, V> for HashMap<K, V, S>

source§

fn get1_mut(&mut self, k: &'a Q) -> Option<&mut V>

source§

unsafe fn get1_unchecked_mut(&mut self, k: &'a Q) -> &mut V

source§

impl<'a, V> SplitMut<usize, V> for &'a mut [V]

source§

fn get1_mut(&mut self, k: usize) -> Option<&mut V>

source§

unsafe fn get1_unchecked_mut(&mut self, k: usize) -> &mut V

source§

impl<'a, V> SplitMut<usize, V> for VecDeque<V>

source§

fn get1_mut(&mut self, k: usize) -> Option<&mut V>

source§

unsafe fn get1_unchecked_mut(&mut self, k: usize) -> &mut V

source§

impl<'a, V> SplitMut<usize, V> for Vec<V>

source§

fn get1_mut(&mut self, k: usize) -> Option<&mut V>

source§

unsafe fn get1_unchecked_mut(&mut self, k: usize) -> &mut V

Implementors§