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