@@ -518,7 +518,15 @@ test wrap {
518
518
/// ```
519
519
/// Limit val to the inclusive range [lower, upper].
520
520
pub 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
+ }
522
530
return @max (lower , @min (val , upper ));
523
531
}
524
532
test clamp {
@@ -533,6 +541,9 @@ test clamp {
533
541
try testing .expect (std .math .clamp (@as (f32 , 1.1 ), @as (f32 , 0.0 ), @as (f32 , 1.0 )) == 1.0 );
534
542
try testing .expect (std .math .clamp (@as (f32 , -127.5 ), @as (f32 , -200 ), @as (f32 , -100 )) == -127.5 );
535
543
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
+
536
547
// Mix of comptime and non-comptime
537
548
var i : i32 = 1 ;
538
549
_ = & i ;
0 commit comments