module: rename NamespacedComponents -> ComponentTypesByName

Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
This commit is contained in:
Stephen Gutekanst 2024-03-27 10:42:23 -07:00 committed by Stephen Gutekanst
parent 2e7cb30bc9
commit a83f9d5be8
3 changed files with 16 additions and 13 deletions

View file

@ -7,7 +7,7 @@ const query_mod = @import("query.zig");
const Archetype = @import("Archetype.zig"); const Archetype = @import("Archetype.zig");
const StringTable = @import("StringTable.zig"); const StringTable = @import("StringTable.zig");
const comp = @import("comptime.zig"); const comp = @import("comptime.zig");
const NamespacedComponents = @import("../module.zig").NamespacedComponents; const ComponentTypesByName = @import("../module.zig").ComponentTypesByName;
/// An entity ID uniquely identifies an entity globally within an Entities set. /// An entity ID uniquely identifies an entity globally within an Entities set.
pub const EntityID = u64; pub const EntityID = u64;
@ -750,7 +750,7 @@ test "example" {
const Rotation = struct { degrees: f32 }; const Rotation = struct { degrees: f32 };
const all_components = NamespacedComponents(.{ const all_components = ComponentTypesByName(.{
struct { struct {
pub const name = .game; pub const name = .game;
pub const events = .{}; pub const events = .{};
@ -855,7 +855,7 @@ test "many entities" {
const Rotation = struct { degrees: f32 }; const Rotation = struct { degrees: f32 };
const all_components = NamespacedComponents(.{ const all_components = ComponentTypesByName(.{
struct { struct {
pub const name = .game; pub const name = .game;
pub const events = .{}; pub const events = .{};

View file

@ -1,6 +1,6 @@
const std = @import("std"); const std = @import("std");
const testing = std.testing; const testing = std.testing;
const NamespacedComponents = @import("../module.zig").NamespacedComponents; const ComponentTypesByName = @import("../module.zig").ComponentTypesByName;
pub const QueryTag = enum { pub const QueryTag = enum {
any, any,
@ -70,7 +70,7 @@ test "query" {
const Rotation = struct { degrees: f32 }; const Rotation = struct { degrees: f32 };
const all_components = NamespacedComponents(.{ const all_components = ComponentTypesByName(.{
struct { struct {
pub const name = .game; pub const name = .game;
pub const events = .{}; pub const events = .{};

View file

@ -43,6 +43,11 @@ pub fn Modules(comptime mods: anytype) type {
pub const GlobalEvent = GlobalEventEnum(mods); pub const GlobalEvent = GlobalEventEnum(mods);
pub const LocalEvent = LocalEventEnum(mods); pub const LocalEvent = LocalEventEnum(mods);
/// Enables looking up a component type by module name and component name.
/// e.g. @field(@field(ComponentTypesByName, "module_name"), "component_name")
pub const component_types_by_name = ComponentTypesByName(mods){};
const ModulesT = @This();
const Event = struct { const Event = struct {
module_name: ?ModuleID, module_name: ?ModuleID,
event_name: EventID, event_name: EventID,
@ -50,24 +55,22 @@ pub fn Modules(comptime mods: anytype) type {
}; };
const EventQueue = std.fifo.LinearFifo(Event, .Dynamic); const EventQueue = std.fifo.LinearFifo(Event, .Dynamic);
const ModulesT = @This();
events_mu: std.Thread.RwLock = .{}, events_mu: std.Thread.RwLock = .{},
args_queue: std.ArrayListUnmanaged(u8) = .{}, args_queue: std.ArrayListUnmanaged(u8) = .{},
events: EventQueue, events: EventQueue,
mod: ModsByName(mods, ModulesT), mod: ModsByName(mods, ModulesT),
// TODO: pass mods directly instead of NamespacedComponents? // TODO: pass mods directly instead of ComponentTypesByName?
entities: Entities(NamespacedComponents(mods){}), entities: Entities(component_types_by_name),
pub fn Mod(comptime M: type) type { pub fn Mod(comptime M: type) type {
const StateT = NamespacedState(ModulesT.modules); const StateT = NamespacedState(ModulesT.modules);
const NSComponents = NamespacedComponents(ModulesT.modules); const NSComponents = ComponentTypesByName(ModulesT.modules);
return Module(M, ModulesT, StateT, NSComponents); return Module(M, ModulesT, StateT, NSComponents);
} }
pub fn init(m: *@This(), allocator: std.mem.Allocator) !void { pub fn init(m: *@This(), allocator: std.mem.Allocator) !void {
// TODO: switch Entities to stack allocation like Modules is // TODO: switch Entities to stack allocation like Modules is
var entities = try Entities(NamespacedComponents(mods){}).init(allocator); var entities = try Entities(component_types_by_name).init(allocator);
errdefer entities.deinit(); errdefer entities.deinit();
// TODO: custom event queue allocation sizes // TODO: custom event queue allocation sizes
@ -344,7 +347,7 @@ pub fn ModsByName(comptime mods: anytype, comptime ModulesT: type) type {
var fields: []const std.builtin.Type.StructField = &[0]std.builtin.Type.StructField{}; var fields: []const std.builtin.Type.StructField = &[0]std.builtin.Type.StructField{};
for (mods) |M| { for (mods) |M| {
const StateT = NamespacedState(mods); const StateT = NamespacedState(mods);
const NSComponents = NamespacedComponents(mods); const NSComponents = ComponentTypesByName(mods);
const Mod = Module(M, ModulesT, StateT, NSComponents); const Mod = Module(M, ModulesT, StateT, NSComponents);
fields = fields ++ [_]std.builtin.Type.StructField{.{ fields = fields ++ [_]std.builtin.Type.StructField{.{
.name = @tagName(M.name), .name = @tagName(M.name),
@ -695,7 +698,7 @@ fn validateEvents(comptime error_prefix: anytype, comptime events: anytype) void
/// }, /// },
/// } /// }
/// ``` /// ```
pub fn NamespacedComponents(comptime modules: anytype) type { pub fn ComponentTypesByName(comptime modules: anytype) type {
var fields: []const std.builtin.Type.StructField = &[0]std.builtin.Type.StructField{}; var fields: []const std.builtin.Type.StructField = &[0]std.builtin.Type.StructField{};
inline for (modules) |M| { inline for (modules) |M| {
const MC = MComponents(M); const MC = MComponents(M);