diff --git a/src/main.zig b/src/main.zig index 8163614..2306eeb 100644 --- a/src/main.zig +++ b/src/main.zig @@ -324,6 +324,14 @@ pub const Component = struct { }; } + pub fn getInput(self: *Component, idx: usize) ?*Signal { + return self.inputs.items[idx].signal; + } + + pub fn getOutput(self: *Component, idx: usize) *Signal { + return &self.outputs.items[idx].signal; + } + fn connect(self: *Component, allocator: std.mem.Allocator, self_idx: usize, to: *Component, to_idx: usize) !void { const input = &to.inputs.items[to_idx]; input.signal = &self.outputs.items[self_idx].signal; @@ -424,7 +432,7 @@ pub const Battery = struct { pub fn update(component: *Component) AllocatorError!void { const self: *Battery = @fieldParentPtr("component", component); - const output = &component.outputs.items[0].signal; + const output = component.getOutput(0); output.digital = @intFromFloat(std.math.sign(self.value)); output.analog = self.value; } @@ -450,8 +458,8 @@ pub const Not = struct { pub fn update(component: *Component) AllocatorError!void { const self: *Not = @fieldParentPtr("component", component); - const output = &component.outputs.items[0].signal; - const input = if (component.inputs.items[0].signal) |s| s else &Signal{}; + const output = component.getOutput(0); + const input = if (component.getInput(0)) |s| s else &Signal{}; if (self.invert_output) { output.digital = 1 - @as(i2, @intCast(@abs(input.digital))); output.analog = 1.0 - @abs(input.analog); @@ -486,8 +494,8 @@ pub const And = struct { // TODO check implementation pub fn update(component: *Component) AllocatorError!void { const self: *And = @fieldParentPtr("component", component); - const output = &component.outputs.items[0].signal; - const input0 = if (component.inputs.items[0].signal) |s| s else &Signal{}; + const output = component.getOutput(0); + const input0 = if (component.getInput(0)) |s| s else &Signal{}; if (self.arithmetic_mode) { output.digital = input0.digital; output.analog = input0.analog; @@ -554,8 +562,8 @@ pub const Or = struct { // TODO check implementation pub fn update(component: *Component) AllocatorError!void { const self: *Or = @fieldParentPtr("component", component); - const output = &component.outputs.items[0].signal; - const input0 = if (component.inputs.items[0].signal) |s| s else &Signal{}; + const output = component.getOutput(0); + const input0 = if (component.getInput(0)) |s| s else &Signal{}; if (self.arithmetic_mode) { output.digital = input0.digital; output.analog = input0.analog; @@ -591,12 +599,12 @@ test "max" { or1.component.inputs.items[1].signal = &b; try or1.component.update(); - try std.testing.expectEqual(1.0, or1.component.outputs.items[0].signal.analog); + try std.testing.expectEqual(1.0, or1.component.getOutput(0).analog); a.analog = -0.5; b.analog = -0.2; try or1.component.update(); - try std.testing.expectEqual(-0.5, or1.component.outputs.items[0].signal.analog); + try std.testing.expectEqual(-0.5, or1.component.getOutput(0).analog); } const AllocatorError = std.mem.Allocator.Error;