@@ -518,7 +518,15 @@ test wrap {
518518/// ```
519519/// Limit val to the inclusive range [lower, upper].
520520pub fn clamp (val : anytype , lower : anytype , upper : anytype ) @TypeOf (val , lower , upper ) {
521- assert (lower <= upper );
521+ const T = @TypeOf (val , lower , upper );
522+ switch (@typeInfo (T )) {
523+ .Int , .Float , .ComptimeInt , .ComptimeFloat = > assert (lower <= upper ),
524+ .Vector = > | vinfo | switch (@typeInfo (vinfo .child )) {
525+ .Int , .Float = > assert (@reduce (.And , lower <= upper )),
526+ else = > @compileError ("Expected vector of ints or floats, found " ++ @typeName (T )),
527+ },
528+ else = > @compileError ("Expected an int, float or vector of one, found " ++ @typeName (T )),
529+ }
522530 return @max (lower , @min (val , upper ));
523531}
524532test clamp {
@@ -533,6 +541,9 @@ test clamp {
533541 try testing .expect (std .math .clamp (@as (f32 , 1.1 ), @as (f32 , 0.0 ), @as (f32 , 1.0 )) == 1.0 );
534542 try testing .expect (std .math .clamp (@as (f32 , -127.5 ), @as (f32 , -200 ), @as (f32 , -100 )) == -127.5 );
535543
544+ // Vector
545+ 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 })));
546+
536547 // Mix of comptime and non-comptime
537548 var i : i32 = 1 ;
538549 _ = & i ;
0 commit comments