luaur_vm/functions/
hashvec.rs1use crate::macros::lua_vector_size::LUA_VECTOR_SIZE;
2use crate::records::lua_node::LuaNode;
3use crate::records::lua_table::LuaTable;
4
5#[allow(non_snake_case)]
6pub unsafe fn hashvec(t: *const LuaTable, v: *const f32) -> *mut LuaNode {
7 let mut i = [0u32; 4];
8
9 core::ptr::copy_nonoverlapping(v as *const u32, i.as_mut_ptr(), LUA_VECTOR_SIZE as usize);
10
11 i[0] = if i[0] == 0x80000000 { 0 } else { i[0] };
12 i[1] = if i[1] == 0x80000000 { 0 } else { i[1] };
13 i[2] = if i[2] == 0x80000000 { 0 } else { i[2] };
14
15 i[0] ^= i[0] >> 17;
16 i[1] ^= i[1] >> 17;
17 i[2] ^= i[2] >> 17;
18
19 let mut h = (i[0].wrapping_mul(73856093))
20 ^ (i[1].wrapping_mul(19349663))
21 ^ (i[2].wrapping_mul(83492791));
22
23 if LUA_VECTOR_SIZE == 4 {
24 i[3] = if i[3] == 0x80000000 { 0 } else { i[3] };
25 i[3] ^= i[3] >> 17;
26 h ^= i[3].wrapping_mul(39916801);
27 }
28
29 let size = 1i32 << (*t).lsizenode;
30 let index = (h as i32) & (size - 1);
31 (*t).node.add(index as usize)
32}