use crate::macros::luau_assert::LUAU_ASSERT;
use crate::records::dense_hash_table::{
DenseDefault, DenseEq, DenseEqDefault, DenseHashTable, DenseHasher, ItemInterface,
};
pub fn dense_hash_table_insert_unsafe<K, I, Iface, H, E>(
table: &mut DenseHashTable<K, I, Iface, H, E>,
key: K,
) -> *mut I
where
K: Clone,
Iface: ItemInterface<K, I>,
H: DenseHasher<K> + Default,
E: DenseEq<K> + Default,
{
LUAU_ASSERT!(!table.eq.eq(&key, &table.empty_key));
let hash_mod = table.capacity - 1;
let mut bucket = table.hasher.hash(&key) & hash_mod;
for probe in 0..=hash_mod {
let probe_item = &mut table.data[bucket];
if table.eq.eq(Iface::get_key(probe_item), &table.empty_key) {
Iface::set_key(probe_item, key);
table.count += 1;
return probe_item as *mut I;
}
if table.eq.eq(Iface::get_key(probe_item), &key) {
return probe_item as *mut I;
}
bucket = (bucket + probe + 1) & hash_mod;
}
LUAU_ASSERT!(false);
core::ptr::null_mut()
}