use specs::prelude::*;
use std::sync::atomic::{AtomicBool, Ordering};
pub trait TaskComponent<'a>: Component {
type Data: SystemData<'a>;
fn run(&mut self, data: &mut Self::Data) -> bool;
}
#[doc(hidden)]
#[derive(Default)]
pub struct TaskProgress {
is_complete: AtomicBool,
is_unblocked: AtomicBool,
}
impl Component for TaskProgress {
type Storage = VecStorage<Self>;
}
impl TaskProgress {
pub(crate) fn is_complete(&self) -> bool {
self.is_complete.load(Ordering::Relaxed)
}
pub(crate) fn complete(&self) {
self.is_complete.store(true, Ordering::Relaxed);
}
pub(crate) fn is_unblocked(&self) -> bool {
self.is_unblocked.load(Ordering::Relaxed)
}
pub(crate) fn unblock(&self) {
self.is_unblocked.store(true, Ordering::Relaxed);
}
}
#[doc(hidden)]
#[derive(Clone)]
pub struct SingleEdge {
pub(crate) child: Entity,
}
impl Component for SingleEdge {
type Storage = VecStorage<Self>;
}
#[doc(hidden)]
#[derive(Clone, Default)]
pub struct MultiEdge {
pub(crate) children: Vec<Entity>,
}
impl MultiEdge {
pub(crate) fn add_child(&mut self, entity: Entity) {
self.children.push(entity);
}
}
impl Component for MultiEdge {
type Storage = VecStorage<Self>;
}
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum OnCompletion {
None,
Delete,
}
impl Default for OnCompletion {
fn default() -> Self {
OnCompletion::None
}
}
#[doc(hidden)]
#[derive(Clone, Copy, Default)]
pub struct FinalTag {
pub(crate) on_completion: OnCompletion,
}
impl Component for FinalTag {
type Storage = VecStorage<Self>;
}