Skip to main content

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 From<$flag_type> for $flag_value_type {
22            fn from(value: $flag_type) -> Self {
23                value.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 {
30                    flag: flag as $flag_value_type,
31                }
32            }
33
34            pub const fn is_default(&self) -> bool {
35                self.flag == 0 as $flag_value_type
36            }
37
38            pub const fn has_flag(&self, flag: $flag_enum_type) -> bool {
39                (self.flag & flag as $flag_value_type) != 0
40            }
41
42            pub const fn set_flag(&self, flag: $flag_enum_type) -> $flag_type {
43                $flag_type {
44                    flag: self.flag | flag as $flag_value_type,
45                }
46            }
47
48            pub const fn unset_flag(&self, flag: $flag_enum_type) -> $flag_type {
49                $flag_type {
50                    flag: self.flag & !(flag as $flag_value_type),
51                }
52            }
53        }
54    };
55}