sharded_slab::pool

Struct RefMut

Source
pub struct RefMut<'a, T, C = DefaultConfig>
where T: Clear + Default, C: Config,
{ /* private fields */ }
Expand description

A guard that allows exclusive mutable access to an object in a pool.

While the guard exists, it indicates to the pool that the item the guard references is currently being accessed. If the item is removed from the pool while a guard exists, the removal will be deferred until the guard is dropped. The slot cannot be accessed by other threads while it is accessed mutably.

Implementations§

Source§

impl<'a, T, C> RefMut<'a, T, C>
where T: Clear + Default, C: Config,

Source

pub fn key(&self) -> usize

Returns the key used to access the guard.

Source

pub fn downgrade(self) -> Ref<'a, T, C>

Downgrades the mutable guard to an immutable guard, allowing access to the pooled value from other threads.

§Examples
let pool = Arc::new(Pool::<String>::new());

let mut guard_mut = pool.clone().create_owned().unwrap();
let key = guard_mut.key();
guard_mut.push_str("Hello");

// The pooled string is currently borrowed mutably, so other threads
// may not access it.
let pool2 = pool.clone();
thread::spawn(move || {
    assert!(pool2.get(key).is_none())
}).join().unwrap();

// Downgrade the guard to an immutable reference.
let guard = guard_mut.downgrade();

// Now, other threads may also access the pooled value.
let pool2 = pool.clone();
thread::spawn(move || {
    let guard = pool2.get(key)
        .expect("the item may now be referenced by other threads");
    assert_eq!(guard, String::from("Hello"));
}).join().unwrap();

// We can still access the value immutably through the downgraded guard.
assert_eq!(guard, String::from("Hello"));

Trait Implementations§

Source§

impl<'a, T, C> Debug for RefMut<'a, T, C>
where T: Debug + Clear + Default, C: Config,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'a, T, C> DerefMut for RefMut<'a, T, C>
where T: Clear + Default, C: Config,

Source§

fn deref_mut(&mut self) -> &mut Self::Target

Mutably dereferences the value.
Source§

impl<'a, T, C> Drop for RefMut<'a, T, C>
where T: Clear + Default, C: Config,

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

impl<'a, T, C> PartialEq<T> for RefMut<'a, T, C>
where T: PartialEq<T> + Clear + Default, C: Config,

Source§

fn eq(&self, other: &T) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl<'a, T, C> Deref for RefMut<'a, T, C>
where T: Clear + Default, C: Config,

Source§

type Target = T

The resulting type after dereferencing.
Source§

fn deref(&self) -> &Self::Target

Dereferences the value.

Auto Trait Implementations§

§

impl<'a, T, C> Freeze for RefMut<'a, T, C>

§

impl<'a, T, C = DefaultConfig> !RefUnwindSafe for RefMut<'a, T, C>

§

impl<'a, T, C = DefaultConfig> !Send for RefMut<'a, T, C>

§

impl<'a, T, C = DefaultConfig> !Sync for RefMut<'a, T, C>

§

impl<'a, T, C> Unpin for RefMut<'a, T, C>

§

impl<'a, T, C = DefaultConfig> !UnwindSafe for RefMut<'a, T, C>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.