]> git.proxmox.com Git - rustc.git/blame - src/tools/rust-analyzer/crates/stdx/src/hash.rs
New upstream version 1.68.2+dfsg1
[rustc.git] / src / tools / rust-analyzer / crates / stdx / src / hash.rs
CommitLineData
f2b60f7d
FG
1//! A none hashing [`Hasher`] implementation.
2use std::{
3 hash::{BuildHasher, Hasher},
4 marker::PhantomData,
5};
6
7pub type NoHashHashMap<K, V> = std::collections::HashMap<K, V, NoHashHasherBuilder<K>>;
8pub type NoHashHashSet<K> = std::collections::HashSet<K, NoHashHasherBuilder<K>>;
9
10#[derive(Copy, Clone, Debug, PartialEq, Eq)]
11pub struct NoHashHasherBuilder<T>(PhantomData<T>);
12
13impl<T> Default for NoHashHasherBuilder<T> {
14 fn default() -> Self {
15 Self(Default::default())
16 }
17}
18
19pub trait NoHashHashable {}
20impl NoHashHashable for usize {}
21impl NoHashHashable for u32 {}
22
23pub struct NoHashHasher(u64);
24
25impl<T: NoHashHashable> BuildHasher for NoHashHasherBuilder<T> {
26 type Hasher = NoHashHasher;
27 fn build_hasher(&self) -> Self::Hasher {
28 NoHashHasher(0)
29 }
30}
31
32impl 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}