36 lines
1.2 KiB
Zig
36 lines
1.2 KiB
Zig
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;
|
|
}
|
|
};
|
|
}
|