solana_stake_interface/
stake_flags.rs1#[cfg(feature = "borsh")]
2use borsh::{BorshDeserialize, BorshSchema, BorshSerialize};
3
4#[repr(transparent)]
6#[cfg_attr(feature = "codama", derive(codama_macros::CodamaType))]
7#[derive(Copy, PartialEq, Eq, Clone, PartialOrd, Ord, Hash, Debug)]
8#[cfg_attr(feature = "frozen-abi", derive(solana_frozen_abi_macro::AbiExample))]
9#[cfg_attr(
10 feature = "borsh",
11 derive(BorshSerialize, BorshDeserialize, BorshSchema),
12 borsh(crate = "borsh")
13)]
14#[cfg_attr(
15 feature = "serde",
16 derive(serde_derive::Deserialize, serde_derive::Serialize)
17)]
18#[cfg_attr(feature = "wincode", derive(wincode::SchemaRead, wincode::SchemaWrite))]
19pub struct StakeFlags {
20 bits: u8,
21}
22
23impl StakeFlags {
25 #[deprecated(
27 since = "2.1.0",
28 note = "This flag will be removed because it was only used for `redelegate`, which will not be enabled."
29 )]
30 pub const MUST_FULLY_ACTIVATE_BEFORE_DEACTIVATION_IS_PERMITTED: Self =
31 Self { bits: 0b0000_0001 };
32
33 pub const fn empty() -> Self {
34 Self { bits: 0 }
35 }
36
37 pub const fn contains(&self, other: Self) -> bool {
38 (self.bits & other.bits) == other.bits
39 }
40
41 pub fn remove(&mut self, other: Self) {
42 self.bits &= !other.bits;
43 }
44
45 pub fn set(&mut self, other: Self) {
46 self.bits |= other.bits;
47 }
48
49 pub const fn union(self, other: Self) -> Self {
50 Self {
51 bits: self.bits | other.bits,
52 }
53 }
54}
55
56impl Default for StakeFlags {
57 fn default() -> Self {
58 StakeFlags::empty()
59 }
60}
61
62#[cfg(test)]
63mod tests {
64 use super::*;
65
66 #[test]
67 #[allow(deprecated)]
68 fn test_stake_flags() {
69 let mut f = StakeFlags::empty();
70 assert!(!f.contains(StakeFlags::MUST_FULLY_ACTIVATE_BEFORE_DEACTIVATION_IS_PERMITTED));
71
72 f.set(StakeFlags::MUST_FULLY_ACTIVATE_BEFORE_DEACTIVATION_IS_PERMITTED);
73 assert!(f.contains(StakeFlags::MUST_FULLY_ACTIVATE_BEFORE_DEACTIVATION_IS_PERMITTED));
74
75 f.remove(StakeFlags::MUST_FULLY_ACTIVATE_BEFORE_DEACTIVATION_IS_PERMITTED);
76 assert!(!f.contains(StakeFlags::MUST_FULLY_ACTIVATE_BEFORE_DEACTIVATION_IS_PERMITTED));
77
78 let f1 = StakeFlags::empty();
79 let f2 = StakeFlags::empty();
80 let f3 = f1.union(f2);
81 assert!(!f3.contains(StakeFlags::MUST_FULLY_ACTIVATE_BEFORE_DEACTIVATION_IS_PERMITTED));
82
83 let f1 = StakeFlags::MUST_FULLY_ACTIVATE_BEFORE_DEACTIVATION_IS_PERMITTED;
84 let f2 = StakeFlags::empty();
85 let f3 = f1.union(f2);
86 assert!(f3.contains(StakeFlags::MUST_FULLY_ACTIVATE_BEFORE_DEACTIVATION_IS_PERMITTED));
87
88 let f1 = StakeFlags::empty();
89 let f2 = StakeFlags::MUST_FULLY_ACTIVATE_BEFORE_DEACTIVATION_IS_PERMITTED;
90 let f3 = f1.union(f2);
91 assert!(f3.contains(StakeFlags::MUST_FULLY_ACTIVATE_BEFORE_DEACTIVATION_IS_PERMITTED));
92
93 let f1 = StakeFlags::MUST_FULLY_ACTIVATE_BEFORE_DEACTIVATION_IS_PERMITTED;
94 let f2 = StakeFlags::MUST_FULLY_ACTIVATE_BEFORE_DEACTIVATION_IS_PERMITTED;
95 let f3 = f1.union(f2);
96 assert!(f3.contains(StakeFlags::MUST_FULLY_ACTIVATE_BEFORE_DEACTIVATION_IS_PERMITTED));
97 }
98}