use primitives::{Event};
use service::ServiceBase;
use downcast::Downcast;
use std::ops::DerefMut;
pub trait BufferBase: ServiceBase {
fn len(&self) -> usize;
fn clear(&mut self);
}
impl_downcast!(BufferBase);
downcast_methods!(BufferBase);
pub trait _EventBuffer<'a>: BufferBase {
type _Value: Event;
type Iter: Iterator<Item = &'a Self::_Value> + 'a;
}
pub trait EventBuffer: BufferBase
where Self: for<'a> _EventBuffer<'a, _Value = <Self as EventBuffer>::Value>
{
type Value: Event;
fn write<T>(&mut self, ev: T)
where T: Into<Self::Value>;
fn iter<'a>(&'a self) -> <Self as _EventBuffer<'a>>::Iter;
}
impl<B> BufferBase for B
where B: DerefMut + ServiceBase, B::Target: BufferBase
{
fn len(&self) -> usize { (**self).len() }
fn clear(&mut self){ (**self).clear() }
}
impl<'a, B> _EventBuffer<'a> for B
where B: DerefMut + ServiceBase, B::Target: _EventBuffer<'a>
{
type _Value = <B::Target as _EventBuffer<'a>>::_Value;
type Iter = <B::Target as _EventBuffer<'a>>::Iter;
}
impl<B> EventBuffer for B
where B: DerefMut + ServiceBase, B::Target: EventBuffer
{
type Value = <B::Target as EventBuffer>::Value;
fn write<T>(&mut self, ev: T)
where T: Into<Self::Value>
{
(**self).write(ev)
}
fn iter<'a>(&'a self) -> <Self as _EventBuffer<'a>>::Iter {
(**self).iter()
}
}