Skip to main content

shipyard/
delete.rs

1use crate::component::Component;
2use crate::entity_id::EntityId;
3use crate::views::ViewMut;
4
5/// Deletes components from an entity.
6pub trait Delete {
7    /// Deletes component in `entity`, return `true` if the entity had this component.  
8    /// Multiple components can be deleted at the same time using a tuple.
9    ///
10    /// ### Example
11    /// ```
12    /// use shipyard::{Component, Delete, ViewMut, World};
13    ///
14    /// #[derive(Component, Debug, PartialEq, Eq)]
15    /// struct U32(u32);
16    ///
17    /// #[derive(Component, Debug, PartialEq, Eq)]
18    /// struct USIZE(usize);
19    ///
20    /// let mut world = World::new();
21    ///
22    /// let entity = world.add_entity((USIZE(0), U32(1)));
23    ///
24    /// let (mut usizes, mut u32s) = world.borrow::<(ViewMut<USIZE>, ViewMut<U32>)>().unwrap();
25    ///
26    /// assert!((&mut usizes, &mut u32s).delete(entity));
27    /// ```
28    fn delete(&mut self, entity: EntityId) -> bool;
29}
30
31impl Delete for () {
32    #[inline]
33    fn delete(&mut self, _: EntityId) -> bool {
34        false
35    }
36}
37
38impl<T: Component, TRACK> Delete for ViewMut<'_, T, TRACK> {
39    #[inline]
40    fn delete(&mut self, entity: EntityId) -> bool {
41        let current = self.current;
42        self.dyn_delete(entity, current)
43    }
44}
45
46impl<T: Component, TRACK> Delete for &mut ViewMut<'_, T, TRACK> {
47    #[inline]
48    fn delete(&mut self, entity: EntityId) -> bool {
49        let current = self.current;
50        self.dyn_delete(entity, current)
51    }
52}
53
54macro_rules! impl_delete_component {
55    ($(($storage: ident, $index: tt))+) => {
56        impl<$($storage: Delete),+> Delete for ($($storage,)+) {
57            #[inline]
58            fn delete(&mut self, entity: EntityId) -> bool {
59                $(
60                    self.$index.delete(entity)
61                )|+
62            }
63        }
64    }
65}
66
67macro_rules! delete_component {
68    ($(($storage: ident, $index: tt))+; ($storage1: ident, $index1: tt) $(($queue_type: ident, $queue_index: tt))*) => {
69        impl_delete_component![$(($storage, $index))*];
70        delete_component![$(($storage, $index))* ($storage1, $index1); $(($queue_type, $queue_index))*];
71    };
72    ($(($storage: ident, $index: tt))+;) => {
73        impl_delete_component![$(($storage, $index))*];
74    }
75}
76
77#[cfg(not(feature = "extended_tuple"))]
78delete_component![(ViewA, 0); (ViewB, 1) (ViewC, 2) (ViewD, 3) (ViewE, 4) (ViewF, 5) (ViewG, 6) (ViewH, 7) (ViewI, 8) (ViewJ, 9)];
79#[cfg(feature = "extended_tuple")]
80delete_component![
81    (ViewA, 0); (ViewB, 1) (ViewC, 2) (ViewD, 3) (ViewE, 4) (ViewF, 5) (ViewG, 6) (ViewH, 7) (ViewI, 8) (ViewJ, 9)
82    (ViewK, 10) (ViewL, 11) (ViewM, 12) (ViewN, 13) (ViewO, 14) (ViewP, 15) (ViewQ, 16) (ViewR, 17) (ViewS, 18) (ViewT, 19)
83    (ViewU, 20) (ViewV, 21) (ViewW, 22) (ViewX, 23) (ViewY, 24) (ViewZ, 25) (ViewAA, 26) (ViewBB, 27) (ViewCC, 28) (ViewDD, 29)
84    (ViewEE, 30) (ViewFF, 31)
85];