Skip to main content

luaur_common/methods/
dense_hash_table_dense_hash_table_dense_hash.rs

1use crate::macros::luau_assert::LUAU_ASSERT;
2use crate::records::dense_hash_table::{DenseEq, DenseHashTable, DenseHasher, ItemInterface};
3use alloc::vec::Vec;
4use core::marker::PhantomData;
5
6impl<K, I, Iface, H, E> DenseHashTable<K, I, Iface, H, E>
7where
8    K: Clone,
9    Iface: ItemInterface<K, I>,
10    H: DenseHasher<K> + Default,
11    E: DenseEq<K> + Default,
12{
13    #[allow(non_snake_case)]
14    pub fn dense_hash_table_key_usize(empty_key: K, buckets: usize) -> Self {
15        let hasher = H::default();
16        let eq = E::default();
17
18        // validate that equality operator is at least somewhat functional
19        LUAU_ASSERT!(eq.eq(&empty_key, &empty_key));
20        // buckets has to be power-of-two or zero
21        LUAU_ASSERT!((buckets & (buckets.wrapping_sub(1))) == 0);
22
23        let mut data = Vec::new();
24        let mut capacity = 0;
25
26        if buckets > 0 {
27            data.reserve_exact(buckets);
28            for _ in 0..buckets {
29                data.push(Iface::make_empty(&empty_key));
30            }
31            capacity = buckets;
32        }
33
34        Self {
35            data,
36            capacity,
37            count: 0,
38            empty_key,
39            hasher,
40            eq,
41            _iface: PhantomData,
42        }
43    }
44}