use parking_lot::{MutexGuard, RwLockReadGuard, RwLockWriteGuard};
use std::{
borrow::{Borrow, BorrowMut},
ops::{Deref, DerefMut},
};
macro_rules! guard_struct {
($HcGuard:ident, $Guard:ident) => {
pub struct $HcGuard<'a, T: ?Sized> {
inner: $Guard<'a, T>,
}
impl<'a, T: ?Sized> $HcGuard<'a, T> {
pub fn new(inner: $Guard<'a, T>) -> Self {
Self { inner }
}
pub fn annotate<S: Into<String>>(self, _annotation: S) -> Self {
self
}
pub fn use_fair_unlocking(self) -> Self {
self
}
pub fn unlock_fair(self) {}
}
};
}
guard_struct!(HcMutexGuard, MutexGuard);
guard_struct!(HcRwLockReadGuard, RwLockReadGuard);
guard_struct!(HcRwLockWriteGuard, RwLockWriteGuard);
impl<'a, T: ?Sized> Borrow<T> for HcMutexGuard<'a, T> {
fn borrow(&self) -> &T {
&self.inner
}
}
impl<'a, T: ?Sized> BorrowMut<T> for HcMutexGuard<'a, T> {
fn borrow_mut(&mut self) -> &mut T {
&mut self.inner
}
}
impl<'a, T: ?Sized> Deref for HcMutexGuard<'a, T> {
type Target = T;
fn deref(&self) -> &T {
&self.inner
}
}
impl<'a, T: ?Sized> DerefMut for HcMutexGuard<'a, T> {
fn deref_mut(&mut self) -> &mut T {
&mut self.inner
}
}
impl<'a, T: ?Sized> Borrow<T> for HcRwLockReadGuard<'a, T> {
fn borrow(&self) -> &T {
&self.inner
}
}
impl<'a, T: ?Sized> Deref for HcRwLockReadGuard<'a, T> {
type Target = T;
fn deref(&self) -> &T {
&self.inner
}
}
impl<'a, T: ?Sized> Borrow<T> for HcRwLockWriteGuard<'a, T> {
fn borrow(&self) -> &T {
&self.inner
}
}
impl<'a, T: ?Sized> BorrowMut<T> for HcRwLockWriteGuard<'a, T> {
fn borrow_mut(&mut self) -> &mut T {
&mut self.inner
}
}
impl<'a, T: ?Sized> Deref for HcRwLockWriteGuard<'a, T> {
type Target = T;
fn deref(&self) -> &T {
&self.inner
}
}
impl<'a, T: ?Sized> DerefMut for HcRwLockWriteGuard<'a, T> {
fn deref_mut(&mut self) -> &mut T {
&mut self.inner
}
}