PArray :: struct (Data_Type : Type, Handle_Type : Type) { data: [..] Data_Type; indices: [..] u32; } parray_reset :: (using array: *PArray) { array_reset(*array.data); array_reset(*array.indices); } parray_free :: (using array: PArray) { array_free(array.data); array_free(array.indices); } parray_reserve :: (using parray: *PArray, capacity: s32) { if capacity > 0 { array_reserve(*data, capacity); array_reserve(*indices, capacity); } } parray_get :: (using parray: PArray, handle: parray.Handle_Type) -> *parray.Data_Type { index := indices[handle - 1] - 1; return *data[index]; } parray_get_val :: (using parray: PArray, handle: parray.Handle_Type) -> parray.Data_Type { assert(xx handle > 0 && xx handle <= indices.count); index := indices[handle - 1] - 1; return data[index]; } parray_add :: (using parray: *PArray, value: parray.Data_Type) -> parray.Handle_Type { array_add(*data, value); index := cast(u32)data.count; handle : Handle_Type = 0; // find the next empty index for *val, i: indices { if <