luaur_common/methods/
dense_hash_table_dense_hash_table_dense_hash.rs1use 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 LUAU_ASSERT!(eq.eq(&empty_key, &empty_key));
20 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}