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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
mod multi_threaded;
mod simple;
mod single_threaded;
pub use self::multi_threaded::{MainThreadExecutor, MultiThreadedExecutor};
pub use self::simple::SimpleExecutor;
pub use self::single_threaded::SingleThreadedExecutor;
use fixedbitset::FixedBitSet;
use crate::{
schedule::{BoxedCondition, NodeId},
system::BoxedSystem,
world::World,
};
pub(super) trait SystemExecutor: Send + Sync {
fn kind(&self) -> ExecutorKind;
fn init(&mut self, schedule: &SystemSchedule);
fn run(&mut self, schedule: &mut SystemSchedule, world: &mut World);
fn set_apply_final_buffers(&mut self, value: bool);
}
#[derive(PartialEq, Eq, Default)]
pub enum ExecutorKind {
#[cfg_attr(target_arch = "wasm32", default)]
SingleThreaded,
Simple,
#[cfg_attr(not(target_arch = "wasm32"), default)]
MultiThreaded,
}
#[derive(Default)]
pub struct SystemSchedule {
pub(super) systems: Vec<BoxedSystem>,
pub(super) system_conditions: Vec<Vec<BoxedCondition>>,
pub(super) set_conditions: Vec<Vec<BoxedCondition>>,
pub(super) system_ids: Vec<NodeId>,
pub(super) set_ids: Vec<NodeId>,
pub(super) system_dependencies: Vec<usize>,
pub(super) system_dependents: Vec<Vec<usize>>,
pub(super) sets_with_conditions_of_systems: Vec<FixedBitSet>,
pub(super) systems_in_sets_with_conditions: Vec<FixedBitSet>,
}
impl SystemSchedule {
pub const fn new() -> Self {
Self {
systems: Vec::new(),
system_conditions: Vec::new(),
set_conditions: Vec::new(),
system_ids: Vec::new(),
set_ids: Vec::new(),
system_dependencies: Vec::new(),
system_dependents: Vec::new(),
sets_with_conditions_of_systems: Vec::new(),
systems_in_sets_with_conditions: Vec::new(),
}
}
}
#[allow(unused_variables)]
pub fn apply_system_buffers(world: &mut World) {}
pub(super) fn is_apply_system_buffers(system: &BoxedSystem) -> bool {
use std::any::Any;
system.as_ref().type_id() == apply_system_buffers.type_id()
}