From 519a73f83848ea668fe79895e6643cff4c5c51be Mon Sep 17 00:00:00 2001 From: HampusM Date: Sat, 6 Apr 2024 12:30:49 +0200 Subject: feat(ecs): add stopping event loop --- ecs/src/flags.rs | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 ecs/src/flags.rs (limited to 'ecs/src/flags.rs') diff --git a/ecs/src/flags.rs b/ecs/src/flags.rs new file mode 100644 index 0000000..ad10a0f --- /dev/null +++ b/ecs/src/flags.rs @@ -0,0 +1,66 @@ +use std::any::Any; + +use crate::lock::WriteGuard; +use crate::system::{ + NoInitParamFlag as NoInitSystemParamFlag, + Param as SystemParam, + System, +}; +use crate::tuple::FilterExclude as TupleFilterExclude; +use crate::{WorldData, WorldFlags}; + +#[derive(Debug)] +pub struct Flags<'world> +{ + world_flags: WriteGuard<'world, WorldFlags>, +} + +impl<'world> Flags<'world> +{ + /// Calling this function makes the loop in [`Engine::event_loop`] stop at the next + /// opportune time. + pub fn stop(&mut self) + { + self.world_flags.stop = true; + } +} + +unsafe impl<'world> SystemParam<'world> for Flags<'world> +{ + type Flags = NoInitSystemParamFlag; + type Input = TupleFilterExclude; + + fn initialize( + _system: &mut impl System<'world, SystemImpl>, + _input: Self::Input, + ) + { + } + + fn new( + _system: &'world impl System<'world, SystemImpl>, + world_data: &'world WorldData, + ) -> Self + { + Self { + world_flags: world_data + .flags + .write_nonblock() + .expect("Failed to acquire read-write world flags lock"), + } + } + + fn is_compatible>() -> bool + { + let other_comparable = Other::get_comparable(); + + other_comparable.downcast_ref::().is_none() + } + + fn get_comparable() -> Box + { + Box::new(Comparable) + } +} + +struct Comparable; -- cgit v1.2.3-18-g5258