#![no_std]
#![feature(const_fn)]
use core::{cell::UnsafeCell, ops::{Deref, DerefMut}};
pub mod raw;
pub struct RwLock<T: ?Sized, Lock> {
lock: Lock,
valu: UnsafeCell<T>,
}
impl<T, Lock: raw::Lock> RwLock<T, Lock> {
#[inline]
pub const fn new(x: T) -> Self {
Self {
lock: Lock::new,
valu: UnsafeCell::new(x),
}
}
}
impl<T: ?Sized, Lock: raw::Lock> RwLock<T, Lock> {
#[inline]
pub fn lock(&self) -> Guard<T, Lock> { unsafe {
self.lock.lock(false);
Guard {
lock: &self.lock,
valu: &*self.valu.get(),
}
} }
#[inline]
pub fn lock_mut(&self) -> GuardMut<T, Lock> { unsafe {
self.lock.lock(true);
GuardMut {
lock: &self.lock,
valu: &mut *self.valu.get(),
}
} }
#[inline]
pub fn try_lock(&self) -> Option<Guard<T, Lock>> { unsafe {
if self.lock.try_lock(false) {
Some(Guard {
lock: &self.lock,
valu: &*self.valu.get(),
})
} else { None }
} }
#[inline]
pub fn try_lock_mut(&self) -> Option<GuardMut<T, Lock>> { unsafe {
if self.lock.try_lock(true) {
Some(GuardMut {
lock: &self.lock,
valu: &mut *self.valu.get(),
})
} else { None }
} }
}
pub struct Guard<'a, T: ?Sized + 'a, Lock: 'a + raw::Lock> {
lock: &'a Lock,
valu: &'a T,
}
impl<'a, T: ?Sized, Lock: raw::Lock> Deref for Guard<'a, T, Lock> {
type Target = T;
#[inline] fn deref(&self) -> &T { self.valu }
}
impl<'a, T: ?Sized, Lock: raw::Lock> Drop for Guard<'a, T, Lock> {
#[inline] fn drop(&mut self) { self.lock.unlock(false) }
}
pub struct GuardMut<'a, T: ?Sized + 'a, Lock: 'a + raw::Lock> {
lock: &'a Lock,
valu: &'a mut T,
}
impl<'a, T: ?Sized, Lock: raw::Lock> Deref for GuardMut<'a, T, Lock> {
type Target = T;
#[inline] fn deref(&self) -> &T { self.valu }
}
impl<'a, T: ?Sized, Lock: raw::Lock> DerefMut for GuardMut<'a, T, Lock> {
#[inline] fn deref_mut(&mut self) -> &mut T { self.valu }
}
impl<'a, T: ?Sized, Lock: raw::Lock> Drop for GuardMut<'a, T, Lock> {
#[inline] fn drop(&mut self) { self.lock.unlock(true) }
}