use std::cell::RefMut;
use std::ops::{Deref, DerefMut};
use super::wakers::WakeGuard;
#[derive(Debug)]
pub struct RwLockWriteGuard<'a, T: ?Sized> {
pub(super) wake_guard: WakeGuard<'a>,
pub(super) val: RefMut<'a, T>,
}
impl<'a, T> RwLockWriteGuard<'a, T>
where
T: ?Sized,
{
pub fn map<U, F>(this: Self, f: F) -> RwLockWriteGuard<'a, U>
where
F: FnOnce(&mut T) -> &mut U,
U: ?Sized,
{
let Self { wake_guard, val } = this;
let val = RefMut::map(val, f);
RwLockWriteGuard { wake_guard, val }
}
#[rustversion::since(1.63)]
pub fn filter_map<U, F>(this: Self, f: F) -> Result<RwLockWriteGuard<'a, U>, Self>
where
F: FnOnce(&mut T) -> Option<&mut U>,
U: ?Sized,
{
let Self { wake_guard, val } = this;
match RefMut::filter_map(val, f) {
Ok(val) => Ok(RwLockWriteGuard { wake_guard, val }),
Err(val) => Err(RwLockWriteGuard { wake_guard, val }),
}
}
}
impl<T> Deref for RwLockWriteGuard<'_, T>
where
T: ?Sized,
{
type Target = T;
fn deref(&self) -> &Self::Target {
self.val.deref()
}
}
impl<T> DerefMut for RwLockWriteGuard<'_, T> {
fn deref_mut(&mut self) -> &mut <Self as Deref>::Target {
self.val.deref_mut()
}
}