striped_lock/
batch.rs

1// Copyright (c) 2024 Mek101
2//
3// This Source Code Form is subject to the terms of the Mozilla Public
4// License, v. 2.0. If a copy of the MPL was not distributed with this
5// file, You can obtain one at https://mozilla.org/MPL/2.0/.
6
7use std::hash::{BuildHasher, Hash};
8
9pub(crate) const MAX_BATCH_KEYS: usize = 4;
10
11/// A batch of keys.
12pub trait KeyBatch<K, H>
13where
14    H: BuildHasher,
15    K: Hash,
16{
17    /// Transform the batch into an array of hashes.
18    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}