shipyard 0.11.2

Entity Component System
Documentation
use shipyard::borrow::{NonSend, NonSendSync, NonSync};
use shipyard::*;
use std::cell::RefCell;
use std::rc::Rc;

struct MyRc(Rc<RefCell<Vec<u32>>>);
impl Component for MyRc {
    type Tracking = track::Untracked;
}

#[allow(unused)]
struct NotSend(*const ());
impl Component for NotSend {
    type Tracking = track::Untracked;
}
unsafe impl Sync for NotSend {}

#[allow(unused)]
struct NotSync(*const ());
impl Component for NotSync {
    type Tracking = track::Untracked;
}
unsafe impl Send for NotSync {}

#[test]
fn basic() {
    fn push(vecs: NonSendSync<View<MyRc>>) {
        vecs.iter().next().unwrap().0.borrow_mut().push(0);
    }

    let world = World::default();

    world.run(
        |mut entities: EntitiesViewMut, mut vecs: NonSendSync<ViewMut<MyRc>>| {
            entities.add_entity(&mut *vecs, MyRc(Rc::new(RefCell::new(Vec::new()))));
        },
    );

    Workload::new("Push")
        .with_system(push)
        .add_to_world(&world)
        .unwrap();
    world.run_default_workload().unwrap();

    world.run(|vecs: NonSendSync<ViewMut<MyRc>>| {
        assert_eq!(&**vecs.iter().next().unwrap().0.borrow(), &[0][..]);
    });
}

#[test]
fn tracking_enabled() {
    fn w() -> Workload {
        (
            |_: NonSend<View<NotSend, track::All>>| {},
            |_: NonSend<ViewMut<NotSend, track::All>>| {},
            |_: NonSync<View<NotSync, track::All>>| {},
            |_: NonSync<ViewMut<NotSync, track::All>>| {},
            |_: NonSendSync<View<MyRc, track::All>>| {},
            |_: NonSendSync<ViewMut<MyRc, track::All>>| {},
        )
            .into_workload()
    }

    let world = World::new();

    world.add_workload(w);

    world.run_workload(w).unwrap();
}