From 1d39fc475fddf8e031dd04be3e2b64e2ddd242f1 Mon Sep 17 00:00:00 2001 From: Dmitry Atamanov Date: Tue, 4 Oct 2022 20:08:01 +0500 Subject: [PATCH] Added `max` and `min` macros to builtin_comparison module. --- lib/std/core/builtin_comparison.c3 | 33 ++++++++++++++++++++++++++++++ lib/std/math.c3 | 11 ---------- test/test_suite/stdlib/minmax.c3 | 9 ++++++++ test/test_suite2/stdlib/minmax.c3 | 9 ++++++++ 4 files changed, 51 insertions(+), 11 deletions(-) create mode 100644 test/test_suite/stdlib/minmax.c3 create mode 100644 test/test_suite2/stdlib/minmax.c3 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)); +}