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