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