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
use shred::{Fetch, FetchMut, ResourceId, Resources, SystemData};

use storage::MaskedStorage;
use {Component, EntitiesRes, Storage};

/// A storage with read access.
pub type ReadStorage<'a, T> = Storage<'a, T, Fetch<'a, MaskedStorage<T>>>;

impl<'a, T> SystemData<'a> for ReadStorage<'a, T>
    where T: Component
{
    fn fetch(res: &'a Resources, id: usize) -> Self {
        Storage::new(res.fetch(0), res.fetch(id))
    }

    fn reads(id: usize) -> Vec<ResourceId> {
        vec![ResourceId::new::<EntitiesRes>(),
             ResourceId::new_with_id::<MaskedStorage<T>>(id)]
    }

    fn writes(_: usize) -> Vec<ResourceId> {
        vec![]
    }
}

/// A storage with read and write access.
pub type WriteStorage<'a, T> = Storage<'a, T, FetchMut<'a, MaskedStorage<T>>>;

impl<'a, T> SystemData<'a> for WriteStorage<'a, T>
    where T: Component
{
    fn fetch(res: &'a Resources, id: usize) -> Self {
        Storage::new(res.fetch(0), res.fetch_mut(id))
    }

    fn reads(_: usize) -> Vec<ResourceId> {
        vec![ResourceId::new::<EntitiesRes>()]
    }

    fn writes(id: usize) -> Vec<ResourceId> {
        vec![ResourceId::new_with_id::<MaskedStorage<T>>(id)]
    }
}