// vim:fileencoding=utf-8:foldmethod=marker #ifndef PROP_TABLE_H #define PROP_TABLE_H #include "entity_id.h" #include "wapp/wapp.h" template struct PropTable { PropTable(const Allocator *allocator, u64 capacity) { index = wapp_array_alloc_capacity(i32, allocator, capacity, ARRAY_INIT_FILLED); values = wapp_array_alloc_capacity(Value, allocator, capacity, ARRAY_INIT_NONE); for (u64 i = 0; i < wapp_array_count(index); ++i) { index[i] = -1; } } void add_prop(EntityID id, T prop) { if (IS_INVALID_ID(id)) { return; } i32 idx = (i32)wapp_array_count(values); Value v = {prop, id.index}; wapp_array_set(i32, index, id.index, &idx); wapp_array_append_capped(Value, values, &v); } void remove_prop(EntityID id) { if (IS_INVALID_ID(id) || *wapp_array_get(i32, index, id.index) == -1) { return; } // Get indices for swapping i32 idx1 = *wapp_array_get(i32, index, id.index); i32 idx2 = ((i32)wapp_array_count(values)) - 1; // Swap values values[idx1] = values[idx2]; wapp_array_pop(Value, values); // Update index index[id.index] = -1; index[values[idx1].index_location] = idx1; } struct Value { T value; u32 index_location; }; typedef Value *ValueArray; I32Array index; ValueArray values; }; #endif // !PROP_TABLE_H