diff --git a/lib/std/core/builtin_comparison.c3 b/lib/std/core/builtin_comparison.c3 index 079b1d937..ec90dde36 100644 --- a/lib/std/core/builtin_comparison.c3 +++ b/lib/std/core/builtin_comparison.c3 @@ -74,3 +74,36 @@ macro bool equals(a, b) @builtin return a == b; $endif; } + +macro min(x, ...) @builtin +{ + $if ($vacount == 1): + return less(x, $vaarg(0)) ? x : $vaarg(0); + $else: + $typeof(x) result = x; + $for (var $i = 0; $i < $vacount; $i++): + if (less($vaarg($i), result)) + { + result = $vaarg($i); + } + $endfor; + return result; + $endif; +} + +macro max(x, ...) @builtin +{ + $if ($vacount == 1): + return greater(x, $vaarg(0)) ? x : $vaarg(0); + $else: + $typeof(x) result = x; + $for (var $i = 0; $i < $vacount; $i++): + if (greater($vaarg($i), result)) + { + result = $vaarg($i); + } + $endfor; + return result; + $endif; +} + diff --git a/lib/std/math.c3 b/lib/std/math.c3 index 5f4babd49..7fbd0e648 100644 --- a/lib/std/math.c3 +++ b/lib/std/math.c3 @@ -71,17 +71,6 @@ const QUAD_EPSILON = 1.92592994438723585305597794258492732e-34; define Complex32 = Complex; define Complex64 = Complex; -macro max(x, y) @builtin -{ - return x > y ? x : y; -} - -macro min(x, y) @builtin -{ - return x < y ? x : y; -} - - fn double log10(double x) @inline { return $$log10(x); diff --git a/test/test_suite/stdlib/minmax.c3 b/test/test_suite/stdlib/minmax.c3 new file mode 100644 index 000000000..517d76a24 --- /dev/null +++ b/test/test_suite/stdlib/minmax.c3 @@ -0,0 +1,9 @@ +import std::io; + +fn void main() +{ + io::printfln("min(-1, 1) == %s", min(-1, 1)); + io::printfln("max(-1, 1) == %s", max(-1, 1)); + io::printfln("min(-1, 0, 1) == %s", min(-1, 0, 1)); + io::printfln("max(-1, 0, 1) == %s", max(-1, 0, 1)); +} diff --git a/test/test_suite2/stdlib/minmax.c3 b/test/test_suite2/stdlib/minmax.c3 new file mode 100644 index 000000000..517d76a24 --- /dev/null +++ b/test/test_suite2/stdlib/minmax.c3 @@ -0,0 +1,9 @@ +import std::io; + +fn void main() +{ + io::printfln("min(-1, 1) == %s", min(-1, 1)); + io::printfln("max(-1, 1) == %s", max(-1, 1)); + io::printfln("min(-1, 0, 1) == %s", min(-1, 0, 1)); + io::printfln("max(-1, 0, 1) == %s", max(-1, 0, 1)); +}