entity and ID manager
parent
2875fc285d
commit
74e4abd8fd
|
@ -6,13 +6,13 @@ pub fn build(b: *Builder) void {
|
||||||
lib.setBuildMode(mode);
|
lib.setBuildMode(mode);
|
||||||
lib.install();
|
lib.install();
|
||||||
|
|
||||||
var entity_test = b.addTest("src/entity.zig");
|
|
||||||
entity_test.setBuildMode(mode);
|
|
||||||
|
|
||||||
var component_store_test = b.addTest("src/component_store.zig");
|
var component_store_test = b.addTest("src/component_store.zig");
|
||||||
component_store_test.setBuildMode(mode);
|
component_store_test.setBuildMode(mode);
|
||||||
|
|
||||||
|
var entity_manager_test = b.addTest("src/entity_manager.zig");
|
||||||
|
entity_manager_test.setBuildMode(mode);
|
||||||
|
|
||||||
const test_step = b.step("test", "Run library tests");
|
const test_step = b.step("test", "Run library tests");
|
||||||
test_step.dependOn(&entity_test.step);
|
|
||||||
test_step.dependOn(&component_store_test.step);
|
test_step.dependOn(&component_store_test.step);
|
||||||
|
test_step.dependOn(&entity_manager_test.step);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,16 +2,12 @@ const std = @import("std");
|
||||||
const testing = std.testing;
|
const testing = std.testing;
|
||||||
|
|
||||||
pub const Entity = struct {
|
pub const Entity = struct {
|
||||||
ID: u32,
|
ID: usize
|
||||||
|
|
||||||
pub fn init(id: u32) Entity {
|
|
||||||
return .{ .ID = id };
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
test "entity init" {
|
test "entity init" {
|
||||||
const e1 = Entity.init(12);
|
const e1 = Entity { .ID = 12 };
|
||||||
const e2 = Entity.init(21);
|
const e2 = Entity { .ID = 21 };
|
||||||
|
|
||||||
testing.expect(e1.ID == 12);
|
testing.expect(e1.ID == 12);
|
||||||
testing.expect(e2.ID == 21);
|
testing.expect(e2.ID == 21);
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
const IDManager = @import("id_manager.zig").IDManager;
|
||||||
|
const Entity = @import("entity.zig").Entity;
|
||||||
|
|
||||||
|
const std = @import("std");
|
||||||
|
const mem = std.mem;
|
||||||
|
const testing = std.testing;
|
||||||
|
const Allocator = mem.Allocator;
|
||||||
|
|
||||||
|
pub const EntityManager = struct {
|
||||||
|
const Self = @This();
|
||||||
|
|
||||||
|
allocator: *Allocator,
|
||||||
|
idManager: IDManager,
|
||||||
|
ids: std.AutoHashMap(usize, bool),
|
||||||
|
|
||||||
|
pub fn init(allocator: *Allocator) Self {
|
||||||
|
return Self {
|
||||||
|
.allocator = allocator,
|
||||||
|
.idManager = IDManager.init(allocator),
|
||||||
|
.ids = std.AutoHashMap(usize, bool).init(allocator)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn create(self: *Self) !Entity {
|
||||||
|
const id = self.idManager.next();
|
||||||
|
var entity = Entity { .ID = id };
|
||||||
|
self.ids.put(id, true) catch |err| return err;
|
||||||
|
return entity;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn exists(self: Self, entityID: usize) bool {
|
||||||
|
return self.ids.contains(entityID);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
test "create" {
|
||||||
|
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
||||||
|
defer arena.deinit();
|
||||||
|
|
||||||
|
const allocator = &arena.allocator;
|
||||||
|
|
||||||
|
var entity_manager = EntityManager.init(allocator);
|
||||||
|
|
||||||
|
var entity = try entity_manager.create();
|
||||||
|
|
||||||
|
testing.expect(entity.ID == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
test "exists" {
|
||||||
|
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
||||||
|
defer arena.deinit();
|
||||||
|
|
||||||
|
const allocator = &arena.allocator;
|
||||||
|
|
||||||
|
var entity_manager = EntityManager.init(allocator);
|
||||||
|
|
||||||
|
var entity = try entity_manager.create();
|
||||||
|
|
||||||
|
testing.expect(entity_manager.exists(0));
|
||||||
|
}
|
|
@ -0,0 +1,66 @@
|
||||||
|
const std = @import("std");
|
||||||
|
const testing = std.testing;
|
||||||
|
const mem = std.mem;
|
||||||
|
const Allocator = mem.Allocator;
|
||||||
|
|
||||||
|
pub const IDManager = struct {
|
||||||
|
const Self = @This();
|
||||||
|
|
||||||
|
allocator: *Allocator,
|
||||||
|
nextID: usize = 0,
|
||||||
|
availableIDs: std.ArrayList(usize),
|
||||||
|
|
||||||
|
pub fn init(allocator: *Allocator) Self {
|
||||||
|
return Self {
|
||||||
|
.allocator = allocator,
|
||||||
|
.availableIDs = std.ArrayList(usize).init(allocator),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn next(self: *Self) usize {
|
||||||
|
if (self.availableIDs.items.len > 0)
|
||||||
|
{
|
||||||
|
return self.availableIDs.pop();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var result = self.nextID;
|
||||||
|
self.nextID += 1;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn free(self: *Self, id: usize) !void {
|
||||||
|
self.availableIDs.append(id) catch |err| return err;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
test "next" {
|
||||||
|
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
||||||
|
defer arena.deinit();
|
||||||
|
|
||||||
|
const allocator = &arena.allocator;
|
||||||
|
|
||||||
|
var id_manager = IDManager.init(allocator);
|
||||||
|
|
||||||
|
testing.expect(id_manager.next() == 0);
|
||||||
|
testing.expect(id_manager.next() == 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
test "free" {
|
||||||
|
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
||||||
|
defer arena.deinit();
|
||||||
|
|
||||||
|
const allocator = &arena.allocator;
|
||||||
|
|
||||||
|
var id_manager = IDManager.init(allocator);
|
||||||
|
|
||||||
|
var id_zero = id_manager.next();
|
||||||
|
var id_one = id_manager.next();
|
||||||
|
var id_two = id_manager.next();
|
||||||
|
|
||||||
|
try id_manager.free(id_one);
|
||||||
|
|
||||||
|
testing.expect(id_manager.next() == id_one);
|
||||||
|
testing.expect(id_manager.next() == 3);
|
||||||
|
}
|
Loading…
Reference in New Issue