Skip to main content

wiwi_collections/
hash_builder.rs

1use core::hash::{ BuildHasher, Hash, Hasher };
2
3pub struct DefaultHashBuilder {
4	inner: ahash::RandomState
5}
6
7impl DefaultHashBuilder {
8	#[inline]
9	pub fn new() -> Self {
10		Self { inner: ahash::RandomState::new() }
11	}
12}
13
14impl BuildHasher for DefaultHashBuilder {
15	type Hasher = DefaultHasher;
16
17	#[inline]
18	fn build_hasher(&self) -> DefaultHasher {
19		DefaultHasher { inner: self.inner.build_hasher() }
20	}
21
22	#[inline]
23	fn hash_one<T: Hash>(&self, x: T) -> u64
24	where
25		Self: Sized
26	{
27		self.inner.hash_one(x)
28	}
29}
30
31impl Default for DefaultHashBuilder {
32	#[inline]
33	fn default() -> Self {
34		Self::new()
35	}
36}
37
38pub struct DefaultHasher {
39	inner: ahash::AHasher
40}
41
42impl Hasher for DefaultHasher {
43	fn finish(&self) -> u64 {
44		self.inner.finish()
45	}
46
47	forward_hasher_to_inner! {
48		fn write(&mut self, bytes: &[u8])(bytes);
49		fn write_u8(&mut self, i: u8)(i);
50		fn write_u16(&mut self, i: u16)(i);
51		fn write_u32(&mut self, i: u32)(i);
52		fn write_u64(&mut self, i: u64)(i);
53		fn write_u128(&mut self, i: u128)(i);
54		fn write_usize(&mut self, i: usize)(i);
55		fn write_i8(&mut self, i: i8)(i);
56		fn write_i16(&mut self, i: i16)(i);
57		fn write_i32(&mut self, i: i32)(i);
58		fn write_i64(&mut self, i: i64)(i);
59		fn write_i128(&mut self, i: i128)(i);
60		fn write_isize(&mut self, i: isize)(i);
61		#[cfg(feature = "nightly")]
62		fn write_length_prefix(&mut self, len: usize)(len);
63		#[cfg(feature = "nightly")]
64		fn write_str(&mut self, s: &str)(s);
65	}
66}
67
68macro_rules! forward_hasher_to_inner {
69	(
70		$(
71			$(#[$meta:meta])*
72			fn $fn:ident
73			(&mut self $($params:tt)*)
74			($($args:tt)*);
75		)*
76	) => {
77		$(
78			$(#[$meta])*
79			fn $fn(&mut self $($params)*) {
80				self.inner.$fn($($args)*)
81			}
82		)*
83	}
84}
85use forward_hasher_to_inner;