1use std::hash::{BuildHasher, Hash};
8
9pub(crate) const MAX_BATCH_KEYS: usize = 4;
10
11pub trait KeyBatch<K, H>
13where
14 H: BuildHasher,
15 K: Hash,
16{
17 fn into_hash_array(self, hasher_builder: &H) -> ([u64; MAX_BATCH_KEYS], usize);
19}
20
21impl<K, H> KeyBatch<K, H> for (K,)
22where
23 H: BuildHasher,
24 K: Hash,
25{
26 fn into_hash_array(self, hasher_builder: &H) -> ([u64; MAX_BATCH_KEYS], usize) {
27 let mut buf = [0; MAX_BATCH_KEYS];
28 buf[0] = hasher_builder.hash_one(self.0);
29 (buf, 1)
30 }
31}
32
33impl<K, H> KeyBatch<K, H> for (K, K)
34where
35 H: BuildHasher,
36 K: Hash,
37{
38 fn into_hash_array(self, hasher_builder: &H) -> ([u64; MAX_BATCH_KEYS], usize) {
39 let mut buf = [0; MAX_BATCH_KEYS];
40 buf[0] = hasher_builder.hash_one(self.0);
41 buf[1] = hasher_builder.hash_one(self.1);
42 (buf, 2)
43 }
44}
45
46impl<K, H> KeyBatch<K, H> for (K, K, K)
47where
48 H: BuildHasher,
49 K: Hash,
50{
51 fn into_hash_array(self, hasher_builder: &H) -> ([u64; MAX_BATCH_KEYS], usize) {
52 let mut buf = [0; MAX_BATCH_KEYS];
53 buf[0] = hasher_builder.hash_one(self.0);
54 buf[1] = hasher_builder.hash_one(self.1);
55 buf[2] = hasher_builder.hash_one(self.2);
56 (buf, 3)
57 }
58}
59
60impl<K, H> KeyBatch<K, H> for (K, K, K, K)
61where
62 H: BuildHasher,
63 K: Hash,
64{
65 fn into_hash_array(self, hasher_builder: &H) -> ([u64; MAX_BATCH_KEYS], usize) {
66 let mut buf = [0; MAX_BATCH_KEYS];
67 buf[0] = hasher_builder.hash_one(self.0);
68 buf[1] = hasher_builder.hash_one(self.1);
69 buf[2] = hasher_builder.hash_one(self.2);
70 buf[3] = hasher_builder.hash_one(self.3);
71 (buf, 4)
72 }
73}