summaryrefslogtreecommitdiff
path: root/src/ecs/sparse.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/ecs/sparse.zig')
-rw-r--r--src/ecs/sparse.zig36
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;
+ }
+ };
+}