1use core::hash::{Hash, Hasher};
2
3pub 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}