shine_input/
modifiermask.rs1use 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 filter: ModifierMask,
71
72 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}