1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
use qecs_core::{Event, ServiceBase
    , BufferBase, EventBuffer, _EventBuffer};

use std::slice;

pub struct VecBuffer<E> {
    storage: Vec<E>,
}

impl<E> From<Vec<E>> for VecBuffer<E>
    where E: Event
{
    fn from(storage: Vec<E>) -> Self {
        VecBuffer{ storage: storage }
    }
}

impl<E> Default for VecBuffer<E>
    where E: Event
{
    fn default() -> Self {
        VecBuffer{ storage: Vec::default() }
    }
}

impl<E> ServiceBase for VecBuffer<E> 
    where E: Event
{
    fn on_before_frame(&mut self){
        self.storage.clear();
    }
}

impl<E> BufferBase for VecBuffer<E> 
    where E: Event
{
    fn len(&self) -> usize { self.storage.len() }

    fn clear(&mut self) { self.storage.clear() }
}

pub type Iter<'a, E> = slice::Iter<'a, E>;

impl<'a, E> _EventBuffer<'a> for VecBuffer<E> 
    where E: Event
{
    type _Value = E;

    type Iter = Iter<'a, E>;
}

impl<E> EventBuffer for VecBuffer<E> 
    where E: Event
{
    type Value = E;

    fn write<T>(&mut self, ev: T)
        where T: Into<Self::Value>
    {
        self.storage.push(ev.into());
    }

    fn iter<'a>(&'a self) -> <Self as _EventBuffer<'a>>::Iter {
        self.storage.iter()
    }
}

impl<'a, E> IntoIterator for &'a VecBuffer<E> 
    where E: Event
{
    type Item = <Self::IntoIter as Iterator>::Item;
    type IntoIter = Iter<'a, E>;
    fn into_iter(self) -> Self::IntoIter { self.iter() }
}