unity_native_plugin/
bitflag.rs

1#[macro_export]
2macro_rules! bitflag {
3    ($flag_type:ident, $flag_enum_type:ty, $flag_value_type:ty) => {
4        #[derive(Copy, Clone, Debug)]
5        pub struct $flag_type {
6            pub flag: $flag_value_type,
7        }
8
9        impl From<$flag_enum_type> for $flag_type {
10            fn from(value: $flag_enum_type) -> Self {
11                $flag_type::new(value)
12            }
13        }
14        
15        impl From<$flag_value_type> for $flag_type {
16            fn from(value: $flag_value_type) -> Self {
17                $flag_type { flag: value }
18            }
19        }
20        
21        impl Into<$flag_value_type> for $flag_type {
22            fn into(self) -> $flag_value_type {
23                self.flag as $flag_value_type
24            }
25        }
26        
27        impl $flag_type {
28            pub fn new(flag: $flag_enum_type) -> $flag_type {
29                $flag_type { flag: flag as $flag_value_type }
30            }
31        
32            pub const fn is_default(&self) -> bool {
33                self.flag == 0 as $flag_value_type
34            }
35        
36            pub const fn has_flag(&self, flag: $flag_enum_type) -> bool {
37                (self.flag & flag as $flag_value_type) != 0
38            }
39        
40            pub const fn set_flag(&self, flag: $flag_enum_type) -> $flag_type {
41                $flag_type {
42                    flag: self.flag | flag as $flag_value_type,
43                }
44            }
45        
46            pub const fn unset_flag(&self, flag: $flag_enum_type) -> $flag_type {
47                $flag_type {
48                    flag: self.flag & !(flag as $flag_value_type),
49                }
50            }
51        }
52    };
53}