oxygengine_core/ecs/pipeline/engines/
sequence.rs1use crate::ecs::{
2 pipeline::{PipelineEngine, PipelineGraph},
3 System, Universe,
4};
5#[derive(Default, Clone)]
6pub struct SequencePipelineEngine {
7 pub(crate) systems: Vec<System>,
8}
9
10impl PartialEq for SequencePipelineEngine {
11 fn eq(&self, other: &Self) -> bool {
12 if self.systems.len() != other.systems.len() {
13 return false;
14 }
15 for (a, b) in self.systems.iter().zip(other.systems.iter()) {
16 let a = *a as *const ();
17 let b = *b as *const ();
18 if a != b {
19 return false;
20 }
21 }
22 true
23 }
24}
25
26impl std::fmt::Debug for SequencePipelineEngine {
27 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
28 f.debug_struct("SequencePipelineEngine")
29 .field(
30 "systems",
31 &self
32 .systems
33 .iter()
34 .map(|s| format!("{:p}", *s as *const ()))
35 .collect::<Vec<_>>(),
36 )
37 .finish()
38 }
39}
40
41impl PipelineEngine for SequencePipelineEngine {
42 fn setup(&mut self, graph: PipelineGraph) {
43 match graph {
44 PipelineGraph::System(system) => self.systems.push(system.system),
45 PipelineGraph::Sequence(list) | PipelineGraph::Parallel(list) => {
46 for item in list {
47 self.setup(item);
48 }
49 }
50 }
51 }
52
53 fn run(&self, universe: &mut Universe) {
54 for system in &self.systems {
55 system(universe);
56 }
57 }
58}