diff options
Diffstat (limited to 'src/ecs/sparse.zig')
-rw-r--r-- | src/ecs/sparse.zig | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/ecs/sparse.zig b/src/ecs/sparse.zig new file mode 100644 index 0000000..28915a5 --- /dev/null +++ b/src/ecs/sparse.zig @@ -0,0 +1,36 @@ +const std = @import("std"); +const Allocator = std.mem.Allocator; + +pub fn SparseSet(comptime T: type) type { + return struct { + sparse: std.ArrayList(usize), + dense: std.ArrayList(usize), + components: std.ArrayList(T), + + pub fn init(allocator: Allocator) @This() { + return @This(){ + .sparse = std.ArrayList(usize).init(allocator), + .dense = std.ArrayList(usize).init(allocator), + .components = std.ArrayList(T).init(allocator), + }; + } + + pub fn addEntity(self: *@This(), entity: usize, component: T) !void { + if (entity >= self.sparse.items.len) { + try self.sparse.resize(entity + 10); + } + + self.sparse.items[entity] = self.dense.items.len; + try self.dense.append(entity); + try self.components.append(component); + } + + pub fn removeEntity(self: *@This(), entity: usize) void { + const last_index = self.dense.getLast(); + const dense_index = self.sparse.items[entity]; + self.dense.swapRemove(dense_index); + self.components.swapRemove(dense_index); + self.sparse.items[last_index] = dense_index; + } + }; +} |