oxygengine_core/ecs/pipeline/engines/
sequence.rs

1use 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}