Files
ent_prop_test/prop_table.hpp
T
2026-06-06 20:18:55 +01:00

57 lines
1.3 KiB
C++

// vim:fileencoding=utf-8:foldmethod=marker
#ifndef PROP_TABLE_H
#define PROP_TABLE_H
#include "entity_id.h"
#include "wapp/wapp.h"
template<typename T>
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