Struct MappedMutexGuard

#[must_use = "if unused the Mutex will immediately unlock"]
pub struct MappedMutexGuard<'a, T: ?Sized + 'a> { pub(in ::sync::nonpoison::mutex) data: NonNull<T>, pub(in ::sync::nonpoison::mutex) inner: &'a Mutex, pub(in ::sync::nonpoison::mutex) _variance: PhantomData<&'a mut T> }

An RAII mutex guard returned by MutexGuard::map, which can point to a subfield of the protected data. When this structure is dropped (falls out of scope), the lock will be unlocked.

The main difference between MappedMutexGuard and MutexGuard is that the former cannot be used with Condvar, since that could introduce soundness issues if the locked object is modified by another thread while the Mutex is unlocked.

The data protected by the mutex can be accessed through this guard via its Deref and DerefMut implementations.

This structure is created by the map and filter_map methods on MutexGuard.

Fields

data: NonNull<T>
inner: &'a Mutex
_variance: PhantomData<&'a mut T>

Implementations

impl<'a, T: ?Sized> MappedMutexGuard<'a, T>

fn map<U, F>(orig: Self, f: F) -> MappedMutexGuard<'a, U>
where
    F: FnOnce(&mut T) -> &mut U,
    U: ?Sized,

Makes a MappedMutexGuard for a component of the borrowed data, e.g. an enum variant.

The Mutex is already locked, so this cannot fail.

This is an associated function that needs to be used as MappedMutexGuard::map(...). A method would interfere with methods of the same name on the contents of the MutexGuard used through Deref.

fn filter_map<U, F>(orig: Self, f: F) -> Result<MappedMutexGuard<'a, U>, Self>
where
    F: FnOnce(&mut T) -> Option<&mut U>,
    U: ?Sized,

Makes a MappedMutexGuard for a component of the borrowed data. The original guard is returned as an Err(...) if the closure returns None.

The Mutex is already locked, so this cannot fail.

This is an associated function that needs to be used as MappedMutexGuard::filter_map(...). A method would interfere with methods of the same name on the contents of the MutexGuard used through Deref.

Trait Implementations

impl<T: ?Sized + Debug> Debug for MappedMutexGuard<'_, T>

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

impl<T: ?Sized + Display> Display for MappedMutexGuard<'_, T>

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

impl<T: ?Sized + Sync> Sync for MappedMutexGuard<'_, T>

impl<T: ?Sized> !Send for MappedMutexGuard<'_, T>

impl<T: ?Sized> Deref for MappedMutexGuard<'_, T>

type Target = T;
fn deref(&self) -> &T

impl<T: ?Sized> DerefMut for MappedMutexGuard<'_, T>

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

impl<T: ?Sized> Drop for MappedMutexGuard<'_, T>

fn drop(&mut self)

Auto Trait Implementations

impl<'a, T> !UnwindSafe for MappedMutexGuard<'a, T>

impl<'a, T> Freeze for MappedMutexGuard<'a, T> where NonNull<T>: Freeze, PhantomData<&'a mut T>: Freeze, T: ?Sized,

impl<'a, T> RefUnwindSafe for MappedMutexGuard<'a, T> where NonNull<T>: RefUnwindSafe, PhantomData<&'a mut T>: RefUnwindSafe, T: ?Sized,

impl<'a, T> Unpin for MappedMutexGuard<'a, T> where NonNull<T>: Unpin, PhantomData<&'a mut T>: Unpin, T: ?Sized,

impl<'a, T> UnsafeUnpin for MappedMutexGuard<'a, T> where NonNull<T>: UnsafeUnpin, PhantomData<&'a mut T>: UnsafeUnpin, T: ?Sized,

Blanket Implementations

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

type Target = T;

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

fn type_id(&self) -> TypeId

impl<T> Borrow<T> for MappedMutexGuard<'a, T> where T: ?Sized,

fn borrow(&self) -> &T

impl<T> BorrowMut<T> for MappedMutexGuard<'a, T> where T: ?Sized,

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

impl<T> From<T> for MappedMutexGuard<'a, T>

fn from(t: T) -> T

Returns the argument unchanged.

impl<T> SizeHint for MappedMutexGuard<'a, T> where T: ?Sized,

fn lower_bound(&self) -> usize
fn upper_bound(&self) -> Option<usize>

impl<T> SizedTypeProperties for MappedMutexGuard<'a, T>

impl<T> ToString for MappedMutexGuard<'a, T> where T: Display + ?Sized,

fn to_string(&self) -> String

impl<T, U> Into<U> for MappedMutexGuard<'a, T> where U: From<T>,

fn into(self) -> U

Calls U::from(self).

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

impl<T, U> TryFrom<U> for MappedMutexGuard<'a, T> where U: Into<T>,

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

impl<T, U> TryInto<U> for MappedMutexGuard<'a, T> where U: TryFrom<T>,

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