]>
Commit | Line | Data |
---|---|---|
f2b60f7d FG |
1 | //! A none hashing [`Hasher`] implementation. |
2 | use std::{ | |
3 | hash::{BuildHasher, Hasher}, | |
4 | marker::PhantomData, | |
5 | }; | |
6 | ||
7 | pub type NoHashHashMap<K, V> = std::collections::HashMap<K, V, NoHashHasherBuilder<K>>; | |
8 | pub type NoHashHashSet<K> = std::collections::HashSet<K, NoHashHasherBuilder<K>>; | |
9 | ||
10 | #[derive(Copy, Clone, Debug, PartialEq, Eq)] | |
11 | pub struct NoHashHasherBuilder<T>(PhantomData<T>); | |
12 | ||
13 | impl<T> Default for NoHashHasherBuilder<T> { | |
14 | fn default() -> Self { | |
15 | Self(Default::default()) | |
16 | } | |
17 | } | |
18 | ||
19 | pub trait NoHashHashable {} | |
20 | impl NoHashHashable for usize {} | |
21 | impl NoHashHashable for u32 {} | |
22 | ||
23 | pub struct NoHashHasher(u64); | |
24 | ||
25 | impl<T: NoHashHashable> BuildHasher for NoHashHasherBuilder<T> { | |
26 | type Hasher = NoHashHasher; | |
27 | fn build_hasher(&self) -> Self::Hasher { | |
28 | NoHashHasher(0) | |
29 | } | |
30 | } | |
31 | ||
32 | impl Hasher for NoHashHasher { | |
33 | fn finish(&self) -> u64 { | |
34 | self.0 | |
35 | } | |
36 | ||
37 | fn write(&mut self, _: &[u8]) { | |
38 | unimplemented!("NoHashHasher should only be used for hashing primitive integers") | |
39 | } | |
40 | ||
41 | fn write_u8(&mut self, i: u8) { | |
42 | self.0 = i as u64; | |
43 | } | |
44 | ||
45 | fn write_u16(&mut self, i: u16) { | |
46 | self.0 = i as u64; | |
47 | } | |
48 | ||
49 | fn write_u32(&mut self, i: u32) { | |
50 | self.0 = i as u64; | |
51 | } | |
52 | ||
53 | fn write_u64(&mut self, i: u64) { | |
f25598a0 | 54 | self.0 = i; |
f2b60f7d FG |
55 | } |
56 | ||
57 | fn write_usize(&mut self, i: usize) { | |
58 | self.0 = i as u64; | |
59 | } | |
60 | ||
61 | fn write_i8(&mut self, i: i8) { | |
62 | self.0 = i as u64; | |
63 | } | |
64 | ||
65 | fn write_i16(&mut self, i: i16) { | |
66 | self.0 = i as u64; | |
67 | } | |
68 | ||
69 | fn write_i32(&mut self, i: i32) { | |
70 | self.0 = i as u64; | |
71 | } | |
72 | ||
73 | fn write_i64(&mut self, i: i64) { | |
74 | self.0 = i as u64; | |
75 | } | |
76 | ||
77 | fn write_isize(&mut self, i: isize) { | |
78 | self.0 = i as u64; | |
79 | } | |
80 | } |