1use std::collections::HashMap;
2use std::hash::{Hash, Hasher};
3
4#[derive(Debug, Clone, Eq, PartialEq)]
5struct SubtreeKey {
6 hash: u64,
7 len: usize,
8 subtrees: Vec<usize>,
9}
10
11impl Hash for SubtreeKey {
12 fn hash<H: Hasher>(&self, state: &mut H) {
13 self.hash.hash(state);
14 self.len.hash(state);
15 }
16}
17
18impl SubtreeKey {
19 fn new(subtrees: &[usize]) -> Self {
20 let mut hasher = std::collections::hash_map::DefaultHasher::new();
21 for &id in subtrees {
22 id.hash(&mut hasher);
23 }
24 SubtreeKey {
25 hash: hasher.finish(),
26 len: subtrees.len(),
27 subtrees: subtrees.to_vec(),
28 }
29 }
30}
31
32fn main() {
33 let mut memoo: HashMap<(SubtreeKey, SubtreeKey), u64> = HashMap::new();
34 let before_subtrees = vec![1, 2, 3];
35 let after_subtrees = vec![4, 5, 6];
36
37 let before_key = SubtreeKey::new(&before_subtrees);
38 let after_key = SubtreeKey::new(&after_subtrees);
39 let key = (before_key.clone(), after_key.clone());
40 memoo.insert(key, 42);
41}