authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-03-27 15:20:07-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-03-27 15:20:07-04:00
log5b00dee0c27ae5a8547d6a4063331302cdc7b0be
treee9310e709e2c537f27499568a8192539e250451e
parent6cb99fdac3fb02d7e4e5a363295bae0dd3641a45

std.math.cast handles signed integers


1 files changed, 15 insertions(+), 2 deletions(-)

std/math/index.zig+15-2
...@@ -515,15 +515,28 @@ test "math.negateCast" {...@@ -515,15 +515,28 @@ test "math.negateCast" {
515515
516/// Cast an integer to a different integer type. If the value doesn't fit, 516/// Cast an integer to a different integer type. If the value doesn't fit,
517/// return an error.517/// return an error.
518pub fn cast(comptime T: type, x: var) !T {518pub fn cast(comptime T: type, x: var) (error{Overflow}!T) {
519 comptime assert(@typeId(T) == builtin.TypeId.Int); // must pass an integer519 comptime assert(@typeId(T) == builtin.TypeId.Int); // must pass an integer
520 if (x > @maxValue(T)) {520 comptime assert(@typeId(@typeOf(x)) == builtin.TypeId.Int); // must pass an integer
521 if (@maxValue(@typeOf(x)) > @maxValue(T) and x > @maxValue(T)) {
522 return error.Overflow;
523 } else if (@minValue(@typeOf(x)) < @minValue(T) and x < @minValue(T)) {
521 return error.Overflow;524 return error.Overflow;
522 } else {525 } else {
523 return T(x);526 return T(x);
524 }527 }
525}528}
526529
530test "math.cast" {
531 if (cast(u8, u32(300))) |_| @panic("fail") else |err| assert(err == error.Overflow);
532 if (cast(i8, i32(-200))) |_| @panic("fail") else |err| assert(err == error.Overflow);
533 if (cast(u8, i8(-1))) |_| @panic("fail") else |err| assert(err == error.Overflow);
534 if (cast(u64, i8(-1))) |_| @panic("fail") else |err| assert(err == error.Overflow);
535
536 assert((try cast(u8, u32(255))) == u8(255));
537 assert(@typeOf(try cast(u8, u32(255))) == u8);
538}
539
527pub fn floorPowerOfTwo(comptime T: type, value: T) T {540pub fn floorPowerOfTwo(comptime T: type, value: T) T {
528 var x = value;541 var x = value;
529542