use std::sync::*;
pub trait EditLog<Edit> {
fn length(&self) -> usize;
fn read(&self, indices: &mut Iterator<Item=usize>) -> Vec<Edit>;
}
pub trait PendingEditLog<Edit> {
fn pending(&self) -> Vec<Edit>;
fn set_pending(&mut self, edits: &[Edit]);
fn commit_pending(&mut self);
fn cancel_pending(&mut self);
}
pub trait EditLogUtils<Edit> {
fn read_iter<ToIterator: IntoIterator<Item=usize>>(&self, items: ToIterator) -> Vec<Edit>;
}
impl<TEditLog: EditLog<Edit>, Edit> EditLogUtils<Edit> for TEditLog {
#[inline]
fn read_iter<ToIterator: IntoIterator<Item=usize>>(&self, items: ToIterator) -> Vec<Edit> {
self.read(&mut items.into_iter())
}
}
impl<'a, Edit, Log: EditLog<Edit>> EditLog<Edit> for &'a mut Log {
#[inline]
fn length(&self) -> usize {
(**self).length()
}
#[inline]
fn read(&self, indices: &mut Iterator<Item=usize>) -> Vec<Edit> {
(**self).read(indices)
}
}
impl<'a, Edit, Log: PendingEditLog<Edit>> PendingEditLog<Edit> for &'a mut Log {
#[inline]
fn pending(&self) -> Vec<Edit> {
(**self).pending()
}
#[inline]
fn set_pending(&mut self, edits: &[Edit]) {
(**self).set_pending(edits)
}
#[inline]
fn commit_pending(&mut self) {
(**self).commit_pending()
}
#[inline]
fn cancel_pending(&mut self) {
(**self).cancel_pending()
}
}
impl<'a, Edit, Log: EditLog<Edit>> EditLog<Edit> for RwLockReadGuard<'a, Log> {
#[inline]
fn length(&self) -> usize {
(**self).length()
}
#[inline]
fn read(&self, indices: &mut Iterator<Item=usize>) -> Vec<Edit> {
(**self).read(indices)
}
}
impl<'a, Edit, Log: EditLog<Edit>> EditLog<Edit> for RwLockWriteGuard<'a, Log> {
#[inline]
fn length(&self) -> usize {
(**self).length()
}
#[inline]
fn read(&self, indices: &mut Iterator<Item=usize>) -> Vec<Edit> {
(**self).read(indices)
}
}
impl<'a, Edit, Log: PendingEditLog<Edit>> PendingEditLog<Edit> for RwLockWriteGuard<'a, Log> {
#[inline]
fn pending(&self) -> Vec<Edit> {
(**self).pending()
}
#[inline]
fn set_pending(&mut self, edits: &[Edit]) {
(**self).set_pending(edits)
}
#[inline]
fn commit_pending(&mut self) {
(**self).commit_pending()
}
#[inline]
fn cancel_pending(&mut self) {
(**self).cancel_pending()
}
}
impl<'a, Edit, Log: EditLog<Edit>> EditLog<Edit> for RwLock<Log> {
#[inline]
fn length(&self) -> usize {
self.read().unwrap().length()
}
#[inline]
fn read(&self, indices: &mut Iterator<Item=usize>) -> Vec<Edit> {
self.read().unwrap().read(indices)
}
}
impl<'a, Edit, Log: PendingEditLog<Edit>> PendingEditLog<Edit> for RwLock<Log> {
#[inline]
fn pending(&self) -> Vec<Edit> {
self.read().unwrap().pending()
}
#[inline]
fn set_pending(&mut self, edits: &[Edit]) {
self.write().unwrap().set_pending(edits)
}
#[inline]
fn commit_pending(&mut self) {
self.write().unwrap().commit_pending()
}
#[inline]
fn cancel_pending(&mut self) {
self.write().unwrap().cancel_pending()
}
}
impl<'a, Edit, Log: EditLog<Edit>> EditLog<Edit> for Arc<RwLock<Log>> {
#[inline]
fn length(&self) -> usize {
(**self).read().unwrap().length()
}
#[inline]
fn read(&self, indices: &mut Iterator<Item=usize>) -> Vec<Edit> {
(**self).read().unwrap().read(indices)
}
}
impl<'a, Edit, Log: PendingEditLog<Edit>> PendingEditLog<Edit> for Arc<RwLock<Log>> {
#[inline]
fn pending(&self) -> Vec<Edit> {
(**self).read().unwrap().pending()
}
#[inline]
fn set_pending(&mut self, edits: &[Edit]) {
(**self).write().unwrap().set_pending(edits)
}
#[inline]
fn commit_pending(&mut self) {
(**self).write().unwrap().commit_pending()
}
#[inline]
fn cancel_pending(&mut self) {
(**self).write().unwrap().cancel_pending()
}
}