midenc_hir/
hash.rs

1use core::hash::{Hash, Hasher};
2
3/// A type-erased version of [core::hash::Hash]
4pub trait DynHash {
5    fn dyn_hash(&self, hasher: &mut dyn Hasher);
6}
7
8impl<H: Hash> DynHash for H {
9    #[inline]
10    fn dyn_hash(&self, hasher: &mut dyn Hasher) {
11        let mut hasher = DynHasher(hasher);
12        <Self as Hash>::hash(self, &mut hasher)
13    }
14}
15
16pub struct DynHasher<'a>(&'a mut dyn Hasher);
17
18impl<'a> DynHasher<'a> {
19    pub fn new<H>(hasher: &'a mut H) -> Self
20    where
21        H: Hasher,
22    {
23        Self(hasher)
24    }
25}
26
27impl Hasher for DynHasher<'_> {
28    #[inline]
29    fn finish(&self) -> u64 {
30        self.0.finish()
31    }
32
33    #[inline]
34    fn write(&mut self, bytes: &[u8]) {
35        self.0.write(bytes)
36    }
37
38    #[inline]
39    fn write_u8(&mut self, i: u8) {
40        self.0.write_u8(i);
41    }
42
43    #[inline]
44    fn write_i8(&mut self, i: i8) {
45        self.0.write_i8(i);
46    }
47
48    #[inline]
49    fn write_u16(&mut self, i: u16) {
50        self.0.write_u16(i);
51    }
52
53    #[inline]
54    fn write_i16(&mut self, i: i16) {
55        self.0.write_i16(i);
56    }
57
58    #[inline]
59    fn write_u32(&mut self, i: u32) {
60        self.0.write_u32(i);
61    }
62
63    #[inline]
64    fn write_i32(&mut self, i: i32) {
65        self.0.write_i32(i);
66    }
67
68    #[inline]
69    fn write_u64(&mut self, i: u64) {
70        self.0.write_u64(i);
71    }
72
73    #[inline]
74    fn write_i64(&mut self, i: i64) {
75        self.0.write_i64(i);
76    }
77
78    #[inline]
79    fn write_u128(&mut self, i: u128) {
80        self.0.write_u128(i);
81    }
82
83    #[inline]
84    fn write_i128(&mut self, i: i128) {
85        self.0.write_i128(i);
86    }
87
88    #[inline]
89    fn write_usize(&mut self, i: usize) {
90        self.0.write_usize(i);
91    }
92
93    #[inline]
94    fn write_isize(&mut self, i: isize) {
95        self.0.write_isize(i);
96    }
97}