motiejus/zig

fork of https://codeberg.org/ziglang/zig
git clone https://git.jakstys.lt/motiejus/zig.git
Log | Tree | Refs | README | LICENSE

commit 64ef45eb059328ac8579c22506fa7574e8cf45f2 (tree)
parent e09963d8544c19812db20e520f09f6e5d9a57d64
Author: koenditor <koend@tuta.io>
Date:   Sat,  1 Jun 2024 08:21:48 +0300

Support Vectors in std.math.clamp

Diffstat:
Mlib/std/math.zig | 13++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/lib/std/math.zig b/lib/std/math.zig @@ -518,7 +518,15 @@ test wrap { /// ``` /// Limit val to the inclusive range [lower, upper]. pub fn clamp(val: anytype, lower: anytype, upper: anytype) @TypeOf(val, lower, upper) { - assert(lower <= upper); + const T = @TypeOf(val, lower, upper); + switch (@typeInfo(T)) { + .Int, .Float, .ComptimeInt, .ComptimeFloat => assert(lower <= upper), + .Vector => |vinfo| switch (@typeInfo(vinfo.child)) { + .Int, .Float => assert(@reduce(.And, lower <= upper)), + else => @compileError("Expected vector of ints or floats, found " ++ @typeName(T)), + }, + else => @compileError("Expected an int, float or vector of one, found " ++ @typeName(T)), + } return @max(lower, @min(val, upper)); } test clamp { @@ -533,6 +541,9 @@ test clamp { try testing.expect(std.math.clamp(@as(f32, 1.1), @as(f32, 0.0), @as(f32, 1.0)) == 1.0); try testing.expect(std.math.clamp(@as(f32, -127.5), @as(f32, -200), @as(f32, -100)) == -127.5); + // Vector + try testing.expect(@reduce(.And, std.math.clamp(@as(@Vector(3, f32), .{ 1.4, 15.23, 28.3 }), @as(@Vector(3, f32), .{ 9.8, 13.2, 15.6 }), @as(@Vector(3, f32), .{ 15.2, 22.8, 26.3 })) == @as(@Vector(3, f32), .{ 9.8, 15.23, 26.3 }))); + // Mix of comptime and non-comptime var i: i32 = 1; _ = &i;