solana_feature_set_interface/
lib.rs1#![cfg_attr(feature = "frozen-abi", feature(min_specialization))]
2#![deprecated(
3 since = "4.0.1",
4 note = "DO NOT USE. Crates that need to break consensus should expose their own minimal configuration type"
5)]
6
7use {
8 ahash::{AHashMap, AHashSet},
9 solana_pubkey::Pubkey,
10};
11
12#[cfg_attr(feature = "frozen-abi", derive(solana_frozen_abi_macro::AbiExample))]
14#[derive(Debug, Clone, Eq, PartialEq)]
15pub struct FeatureSet {
16 pub active: AHashMap<Pubkey, u64>,
17 pub inactive: AHashSet<Pubkey>,
18}
19
20impl FeatureSet {
21 pub fn is_active(&self, feature_id: &Pubkey) -> bool {
22 self.active.contains_key(feature_id)
23 }
24
25 pub fn activated_slot(&self, feature_id: &Pubkey) -> Option<u64> {
26 self.active.get(feature_id).copied()
27 }
28
29 pub fn activate(&mut self, feature_id: &Pubkey, slot: u64) {
31 self.inactive.remove(feature_id);
32 self.active.insert(*feature_id, slot);
33 }
34
35 pub fn deactivate(&mut self, feature_id: &Pubkey) {
37 self.active.remove(feature_id);
38 self.inactive.insert(*feature_id);
39 }
40}
41
42#[cfg(test)]
43mod test {
44 use super::*;
45
46 #[test]
47 fn test_feature_set_activate_deactivate() {
48 let mut feature_set = FeatureSet {
49 active: AHashMap::new(),
50 inactive: AHashSet::new(),
51 };
52
53 let feature = Pubkey::new_unique();
54 assert!(!feature_set.is_active(&feature));
55 feature_set.activate(&feature, 0);
56 assert!(feature_set.is_active(&feature));
57 feature_set.deactivate(&feature);
58 assert!(!feature_set.is_active(&feature));
59 }
60}