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}