nog_rom/
lib.rs

1use core::panic;
2use std::{
3    collections::{hash_map::DefaultHasher, HashMap},
4    hash::{Hash, Hasher},
5    rc::Rc,
6};
7
8#[derive(Debug, Clone, Default, PartialEq, Eq)]
9pub struct HashSetMap<T> {
10    register: HashMap<Rc<u64>, Rc<T>>,
11}
12
13pub struct HashSetMapBuilder<T> {
14    hash_register: HashSetMap<T>,
15    hasher: Option<Rc<dyn Hasher>>,
16}
17impl<'a, T> HashSetMapBuilder<T>
18where
19    T: Hash + Eq + Clone + Default + ToString,
20    HashSetMapBuilder<T>: Default,
21{
22    pub fn insert(&mut self, hasher: &'a mut dyn Hasher, input: T) -> Option<Rc<T>> {
23        if self.hasher.is_none() {
24            panic!("HashSetMapBuilder::insert() -> hasher is None")
25        };
26        hasher.write(input.to_string().as_bytes());
27        let key = hasher.finish();
28        self.hash_register
29            .register
30            .insert(Rc::new(key), Rc::new(input))
31    }
32    pub fn new() -> Self {
33        Default::default()
34    }
35    pub fn new_with_capacity(capacity: usize) -> Self {
36        let mut hash_register = HashSetMap::default();
37        hash_register.register = HashMap::with_capacity(capacity);
38        Self {
39            hash_register,
40            hasher: None,
41        }
42    }
43    pub fn new_with_hasher(hasher: Rc<dyn Hasher>) -> Self {
44        Self {
45            hash_register: Default::default(),
46            hasher: Some(hasher),
47        }
48    }
49
50    pub fn new_with_capacity_and_hasher(capacity: usize, hasher: Rc<dyn Hasher>) -> Self {
51        let mut hash_register = HashSetMap::default();
52        hash_register.register = HashMap::with_capacity_and_hasher(capacity, Default::default());
53        Self {
54            hash_register,
55            hasher: Some(hasher),
56        }
57    }
58    pub fn build(self) -> HashMap<Rc<u64>, Rc<T>> {
59        self.hash_register.register
60    }
61
62    pub fn with_hasher(mut self, hasher: Rc<dyn Hasher>) -> Self {
63        self.hasher = Some(hasher);
64        self
65    }
66    pub fn hasher(&mut self, hasher: Rc<dyn Hasher>) -> &mut Self {
67        self.hasher = Some(hasher);
68        self
69    }
70
71    pub fn len(&self) -> usize {
72        self.hash_register.register.len()
73    }
74    pub fn is_empty(&self) -> bool {
75        self.hash_register.register.is_empty()
76    }
77    pub fn clear(&mut self) {
78        self.hash_register.register.clear();
79    }
80}
81impl<T> Default for HashSetMapBuilder<T>
82where
83    T: Hash + Eq + Clone + Default + ToString,
84{
85    fn default() -> Self {
86        Self {
87            hash_register: HashSetMap {
88                register: HashMap::new(),
89            },
90            hasher: Some(Rc::new(DefaultHasher::new())),
91        }
92    }
93}