use crate::*;
pub enum LockStatus {
Mine,
Taken,
Open,
}
pub trait ConcreteLock {
fn status(&self) -> SimpleLockResult<LockStatus>;
fn try_lock(&mut self) -> SimpleLockResult<()>;
fn hang_lock(&mut self) -> SimpleLockResult<()>;
fn try_unlock(&mut self) -> SimpleLockResult<()>;
}
pub trait Lock {
fn status(&self) -> SimpleLockResult<LockStatus>;
fn lock(&mut self) -> SimpleLockResult<()>;
fn unlock(&mut self) -> SimpleLockResult<()>;
}
impl ConcreteLock for Box<dyn ConcreteLock> {
fn status(&self) -> SimpleLockResult<LockStatus> {
self.as_ref().status()
}
fn try_lock(&mut self) -> SimpleLockResult<()> {
self.as_mut().try_lock()
}
fn hang_lock(&mut self) -> SimpleLockResult<()> {
self.as_mut().hang_lock()
}
fn try_unlock(&mut self) -> SimpleLockResult<()> {
self.as_mut().try_unlock()
}
}
impl Lock for Box<dyn Lock> {
fn status(&self) -> SimpleLockResult<LockStatus> {
self.as_ref().status()
}
fn lock(&mut self) -> SimpleLockResult<()> {
self.as_mut().lock()
}
fn unlock(&mut self) -> SimpleLockResult<()> {
self.as_mut().unlock()
}
}