summaryrefslogtreecommitdiff
path: root/src/ecs/sparse.zig
blob: 1202e9b6c9c0b14eac53adb95c7e81ebc2ad82b4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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 deinit(self: *@This()) void {
            self.sparse.deinit();
            self.dense.deinit();
            self.components.deinit();
        }

        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;
        }
    };
}