// 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) { lookup = 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(lookup); ++i) { lookup[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, lookup, id.index, &idx); wapp_array_append_capped(Value, values, &v); } void remove_prop(EntityID id) { if (IS_INVALID_ID(id) || *wapp_array_get(i32, lookup, id.index) == -1) { return; } // Get indices for swapping i32 idx1 = *wapp_array_get(i32, lookup, id.index); i32 idx2 = ((i32)wapp_array_count(values)) - 1; // Swap values values[idx1] = values[idx2]; wapp_array_pop(Value, values); // Update index lookup[id.index] = -1; lookup[values[idx1].index] = idx1; } struct Value { T value; u32 index; }; typedef Value *ValueArray; I32Array lookup; ValueArray values; }; #endif // !PROP_TABLE_H