qecs-core 0.0.17

Soon to be highly flexible Entity-Component-System framework, core lib.
use primitives::{Event};
use service::ServiceBase;

use downcast::Downcast;

use std::ops::DerefMut;

// ++++++++++++++++++++ BufferBase ++++++++++++++++++++

pub trait BufferBase: ServiceBase {
    fn len(&self) -> usize;

    fn clear(&mut self);
}

impl_downcast!(BufferBase);
downcast_methods!(BufferBase);

// ++++++++++++++++++++ EventBuffer ++++++++++++++++++++

/// Workaround for lack of HK-lifetimes.
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;
}

// ++++++++++++++++++++ newtype-impls ++++++++++++++++++++

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()
    }
}