solana_feature_set_interface/
lib.rs

1#![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/// `FeatureSet` holds the set of currently active/inactive runtime features
13#[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    /// Activate a feature
30    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    /// Deactivate a feature
36    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}