diff --git a/lib/std/math/math.c3 b/lib/std/math/math.c3 index 7771e3494..2afa0650c 100644 --- a/lib/std/math/math.c3 +++ b/lib/std/math/math.c3 @@ -845,6 +845,46 @@ macro int128 int128.sat_sub(int128 x, int128 y) => $$sat_sub(x, y); macro int128 int128.sat_mul(int128 x, int128 y) => $$sat_mul(x, y); macro int128 int128.sat_shl(int128 x, int128 y) => $$sat_shl(x, y); +/** + * @require values::@is_int(x) `The input must be an integer` + **/ +macro bool is_odd(x) => (bool)(x & 1); + +/** + * @require values::@is_int(x) `The input must be an integer` + **/ +macro bool is_even(x) => !is_odd(x); + +macro bool char.is_even(char x) => is_even(x); +macro bool char.is_odd(char x) => is_odd(x); + +macro bool ichar.is_even(ichar x) => is_even(x); +macro bool ichar.is_odd(ichar x) => is_odd(x); + +macro bool ushort.is_even(ushort x) => is_even(x); +macro bool ushort.is_odd(ushort x) => is_odd(x); + +macro bool short.is_even(short x) => is_even(x); +macro bool short.is_odd(short x) => is_odd(x); + +macro bool uint.is_even(uint x) => is_even(x); +macro bool uint.is_odd(uint x) => is_odd(x); + +macro bool int.is_even(int x) => is_even(x); +macro bool int.is_odd(int x) => is_odd(x); + +macro bool ulong.is_even(ulong x) => is_even(x); +macro bool ulong.is_odd(ulong x) => is_odd(x); + +macro bool long.is_even(long x) => is_even(x); +macro bool long.is_odd(long x) => is_odd(x); + +macro bool uint128.is_even(uint128 x) => is_even(x); +macro bool uint128.is_odd(uint128 x) => is_odd(x); + +macro bool int128.is_even(int128 x) => is_even(x); +macro bool int128.is_odd(int128 x) => is_odd(x); + /** * @checked x & 1 */ diff --git a/test/unit/stdlib/math/math_is_even_odd.c3 b/test/unit/stdlib/math/math_is_even_odd.c3 new file mode 100644 index 000000000..8c4977942 --- /dev/null +++ b/test/unit/stdlib/math/math_is_even_odd.c3 @@ -0,0 +1,23 @@ +module math_is_even_odd_tests; +import std::math; +import std::io; + +macro test(start, ...) +{ + $for (var $i = 0; $i < $vacount; $i++) + for ($vatype($i) i = ($vatype($i))start; i < 5; i+=2) + { + assert(math::is_even(i)); + assert(i.is_even()); + + assert(!math::is_odd(i)); + assert(!i.is_odd()); + } + $endfor; +} + +fn void! tests() @test +{ + test(0, char, ushort, uint, ulong, uptr, usz, uint128); + test(-4, ichar, short, int, long, iptr, isz, int128); +}