shine_input/
modifiermask.rs

1use crate::ModifierId;
2
3pub const MAX_MODIFIER_COUNT: u32 = 128;
4
5#[derive(Clone, Debug)]
6pub struct ModifierMask(pub(crate) u128);
7
8impl ModifierMask {
9    pub fn new() -> ModifierMask {
10        ModifierMask(0)
11    }
12
13    pub fn new_from(filter: &[ModifierId]) -> ModifierMask {
14        let mut mask = ModifierMask(0);
15        mask.set_from_slice(filter);
16        mask
17    }
18
19    pub fn from_masked_clear(mask: &ModifierMask, clear_mask: &ModifierMask) -> ModifierMask {
20        ModifierMask(mask.0 & !clear_mask.0)
21    }
22
23    pub fn clear(&mut self) {
24        self.0 = 0;
25    }
26
27    pub fn get(&self, modifier: ModifierId) -> bool {
28        let m = 1_u128 << modifier.id();
29        (self.0 & m) != 0
30    }
31
32    pub fn set(&mut self, modifier: ModifierId, value: bool) {
33        let m = 1_u128 << modifier.id();
34        if value {
35            self.0 |= m;
36        } else {
37            self.0 &= !m;
38        }
39    }
40
41    pub fn set_from_slice(&mut self, filter: &[ModifierId]) {
42        for i in filter {
43            let m = 1_u128 << i.id();
44            self.0 |= m;
45        }
46    }
47}
48
49impl Default for ModifierMask {
50    fn default() -> ModifierMask {
51        ModifierMask::new()
52    }
53}
54
55impl From<&[ModifierId]> for ModifierMask {
56    fn from(value: &[ModifierId]) -> ModifierMask {
57        ModifierMask::new_from(value)
58    }
59}
60
61impl From<[ModifierId; 1]> for ModifierMask {
62    fn from(value: [ModifierId; 1]) -> ModifierMask {
63        ModifierMask::new_from(&value)
64    }
65}
66
67#[derive(Clone, Debug)]
68pub struct ModifierFilterMask {
69    /// Tha mask to consider in the required mask
70    filter: ModifierMask,
71
72    /// The required value for each modifiers
73    required: ModifierMask,
74}
75
76impl ModifierFilterMask {
77    pub fn new() -> ModifierFilterMask {
78        ModifierFilterMask {
79            filter: ModifierMask::new(),
80            required: ModifierMask::new(),
81        }
82    }
83
84    pub fn new_from(filter: &[(ModifierId, bool)]) -> ModifierFilterMask {
85        let mut mask = ModifierFilterMask::new();
86
87        for (i, f) in filter {
88            log::trace!("{:?}", mask.filter);
89            assert!(!mask.filter.get(*i), "filter already set for {:?}", i);
90            mask.filter.set(*i, true);
91            mask.required.set(*i, *f);
92        }
93        mask
94    }
95
96    pub fn check(&self, mask: &ModifierMask) -> bool {
97        (mask.0 & self.filter.0) == self.required.0
98    }
99}
100
101impl Default for ModifierFilterMask {
102    fn default() -> ModifierFilterMask {
103        ModifierFilterMask::new()
104    }
105}
106
107impl From<&[(ModifierId, bool)]> for ModifierFilterMask {
108    fn from(value: &[(ModifierId, bool)]) -> ModifierFilterMask {
109        ModifierFilterMask::new_from(value)
110    }
111}
112
113impl From<[(ModifierId, bool); 1]> for ModifierFilterMask {
114    fn from(value: [(ModifierId, bool); 1]) -> ModifierFilterMask {
115        ModifierFilterMask::new_from(&value)
116    }
117}