Skip to content

Commit b5ee909

Browse files
committed
MIN and MAX now take up to 24 arguments
1 parent bae60b2 commit b5ee909

File tree

2 files changed

+115
-6
lines changed

2 files changed

+115
-6
lines changed

tests/tetests.cpp

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1996,6 +1996,41 @@ TEST_CASE("Statistics", "[stats]")
19961996
CHECK_THAT(-87, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
19971997
p.compile(("MIN(-9, 2, 0, -5.8, 9, 8, -87)"));
19981998
CHECK_THAT(-87, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
1999+
p.compile(("MIN(-9, 2, 0, -5.8, 9, 8, -87, -90)"));
2000+
CHECK_THAT(-90, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
2001+
p.compile(("MIN(-9, 2, 0, -5.8, 9, 8, -87, -90, -99)"));
2002+
CHECK_THAT(-99, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
2003+
p.compile(("MIN(-9, 2, 0, -5.8, 9, 8, -87, -90, -99, -101)"));
2004+
CHECK_THAT(-101, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
2005+
p.compile(("MIN(-9, 2, 0, -5.8, 9, 8, -87, -90, -99, -101, -103)"));
2006+
CHECK_THAT(-103, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
2007+
p.compile(("MIN(-9, 2, 0, -5.8, 9, 8, -87, -90, -99, -101, -103, -111)"));
2008+
CHECK_THAT(-111, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
2009+
p.compile(("MIN(-9, 2, 0, -5.8, 9, 8, -87, -90, -99, -101, -103, -111, -113)"));
2010+
CHECK_THAT(-113, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
2011+
p.compile(("MIN(-9, 2, 0, -5.8, 9, 8, -87, -90, -99, -101, -103, -111, -113, -150)"));
2012+
CHECK_THAT(-150, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
2013+
p.compile(("MIN(-9, 2, 0, -5.8, 9, 8, -87, -90, -99, -101, -103, -111, -113, -150, -175)"));
2014+
CHECK_THAT(-175, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
2015+
p.compile(("MIN(-9, 2, 0, -5.8, 9, 8, -87, -90, -99, -101, -103, -111, -113, -150, -175, -199)"));
2016+
CHECK_THAT(-199, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
2017+
p.compile(("MIN(-9, 2, 0, -5.8, 9, 8, -87, -90, -99, -101, -103, -111, -113, -150, -175, -199, -220)"));
2018+
CHECK_THAT(-220, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
2019+
p.compile(("MIN(-9, 2, 0, -5.8, 9, 8, -87, -90, -99, -101, -103, -111, -113, -150, -175, -199, -220, -222)"));
2020+
CHECK_THAT(-222, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
2021+
p.compile(("MIN(-9, 2, 0, -5.8, 9, 8, -87, -90, -99, -101, -103, -111, -113, -150, -175, -199, -220, -222, -233)"));
2022+
CHECK_THAT(-233, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
2023+
p.compile(("MIN(-9, 2, 0, -5.8, 9, 8, -87, -90, -99, -101, -103, -111, -113, -150, -175, -199, -220, -222, -233, -245)"));
2024+
CHECK_THAT(-245, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
2025+
p.compile(("MIN(-9, 2, 0, -5.8, 9, 8, -87, -90, -99, -101, -103, -111, -113, -150, -175, -199, -220, -222, -233, -245, -255)"));
2026+
CHECK_THAT(-255, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
2027+
p.compile(("MIN(-9, 2, 0, -5.8, 9, 8, -87, -90, -99, -101, -103, -111, -113, -150, -175, -199, -220, -222, -233, -245, -255, -300)"));
2028+
CHECK_THAT(-300, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
2029+
p.compile(("MIN(-9, 2, 0, -5.8, 9, 8, -87, -90, -99, -101, -103, -111, -113, -150, -175, -199, -220, -222, -233, -245, -255, -300, -320)"));
2030+
CHECK_THAT(-320, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
2031+
p.compile(("MIN(-9, 2, 0, -5.8, 9, 8, -87, -90, -99, -101, -103, -111, -113, -150, -175, -199, -220, -222, -233, -245, -255, -300, -320, -450)"));
2032+
CHECK_THAT(-450, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
2033+
19992034
p.compile(("MAX(1.1)"));
20002035
CHECK_THAT(1.1, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
20012036
p.compile(("MAX(1.1, 1.2)"));
@@ -2018,6 +2053,40 @@ TEST_CASE("Statistics", "[stats]")
20182053
CHECK_THAT(127, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
20192054
p.compile(("MAX(9.1, 1.2, 0, 5.8, 80, -1, 127)"));
20202055
CHECK_THAT(127, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
2056+
p.compile(("MAX(9.1, 1.2, 0, 5.8, 80, -1, 127, 156)"));
2057+
CHECK_THAT(156, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
2058+
p.compile(("MAX(9.1, 1.2, 0, 5.8, 80, -1, 127, 156, 201)"));
2059+
CHECK_THAT(201, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
2060+
p.compile(("MAX(9.1, 1.2, 0, 5.8, 80, -1, 127, 156, 201, 207)"));
2061+
CHECK_THAT(207, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
2062+
p.compile(("MAX(9.1, 1.2, 0, 5.8, 80, -1, 127, 156, 201, 207, 209)"));
2063+
CHECK_THAT(209, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
2064+
p.compile(("MAX(9.1, 1.2, 0, 5.8, 80, -1, 127, 156, 201, 207, 209, 226)"));
2065+
CHECK_THAT(226, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
2066+
p.compile(("MAX(9.1, 1.2, 0, 5.8, 80, -1, 127, 156, 201, 207, 209, 226, 256)"));
2067+
CHECK_THAT(256, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
2068+
p.compile(("MAX(9.1, 1.2, 0, 5.8, 80, -1, 127, 156, 201, 207, 209, 226, 256, 300)"));
2069+
CHECK_THAT(300, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
2070+
p.compile(("MAX(9.1, 1.2, 0, 5.8, 80, -1, 127, 156, 201, 207, 209, 226, 256, 300, 301)"));
2071+
CHECK_THAT(301, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
2072+
p.compile(("MAX(9.1, 1.2, 0, 5.8, 80, -1, 127, 156, 201, 207, 209, 226, 256, 300, 301, 303)"));
2073+
CHECK_THAT(303, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
2074+
p.compile(("MAX(9.1, 1.2, 0, 5.8, 80, -1, 127, 156, 201, 207, 209, 226, 256, 300, 301, 303, 309)"));
2075+
CHECK_THAT(309, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
2076+
p.compile(("MAX(9.1, 1.2, 0, 5.8, 80, -1, 127, 156, 201, 207, 209, 226, 256, 300, 301, 303, 309, 326)"));
2077+
CHECK_THAT(326, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
2078+
p.compile(("MAX(9.1, 1.2, 0, 5.8, 80, -1, 127, 156, 201, 207, 209, 226, 256, 300, 301, 303, 309, 326, 350)"));
2079+
CHECK_THAT(350, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
2080+
p.compile(("MAX(9.1, 1.2, 0, 5.8, 80, -1, 127, 156, 201, 207, 209, 226, 256, 300, 301, 303, 309, 326, 350, 388)"));
2081+
CHECK_THAT(388, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
2082+
p.compile(("MAX(9.1, 1.2, 0, 5.8, 80, -1, 127, 156, 201, 207, 209, 226, 256, 300, 301, 303, 309, 326, 350, 388, 390)"));
2083+
CHECK_THAT(390, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
2084+
p.compile(("MAX(9.1, 1.2, 0, 5.8, 80, -1, 127, 156, 201, 207, 209, 226, 256, 300, 301, 303, 309, 326, 350, 388, 390, 401)"));
2085+
CHECK_THAT(401, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
2086+
p.compile(("MAX(9.1, 1.2, 0, 5.8, 80, -1, 127, 156, 201, 207, 209, 226, 256, 300, 301, 303, 309, 326, 350, 388, 390, 401, 403)"));
2087+
CHECK_THAT(403, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
2088+
p.compile(("MAX(9.1, 1.2, 0, 5.8, 80, -1, 127, 156, 201, 207, 209, 226, 256, 300, 301, 303, 309, 326, 350, 388, 390, 401, 403, 777)"));
2089+
CHECK_THAT(777, Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(p.evaluate())));
20212090
}
20222091

20232092
TEST_CASE("Round higher precision", "[round]")

tinyexpr.cpp

Lines changed: 46 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1026,7 +1026,10 @@ namespace te_builtins
10261026

10271027
[[nodiscard]]
10281028
static te_type te_max(te_type val1, te_type val2, te_type val3, te_type val4, te_type val5,
1029-
te_type val6, te_type val7) noexcept
1029+
te_type val6, te_type val7, te_type val8, te_type val9, te_type val10,
1030+
te_type val11, te_type val12, te_type val13, te_type val14, te_type val15,
1031+
te_type val16, te_type val17, te_type val18, te_type val19, te_type val20,
1032+
te_type val21, te_type val22, te_type val23, te_type val24) noexcept
10301033
{
10311034
// assumes that at least val1 is a number, rest can be NaN
10321035
// NOLINTBEGIN
@@ -1035,7 +1038,24 @@ namespace te_builtins
10351038
maxVal = te_max_maybe_nan(maxVal, val4);
10361039
maxVal = te_max_maybe_nan(maxVal, val5);
10371040
maxVal = te_max_maybe_nan(maxVal, val6);
1038-
return te_max_maybe_nan(maxVal, val7);
1041+
maxVal = te_max_maybe_nan(maxVal, val7);
1042+
maxVal = te_max_maybe_nan(maxVal, val8);
1043+
maxVal = te_max_maybe_nan(maxVal, val9);
1044+
maxVal = te_max_maybe_nan(maxVal, val10);
1045+
maxVal = te_max_maybe_nan(maxVal, val11);
1046+
maxVal = te_max_maybe_nan(maxVal, val12);
1047+
maxVal = te_max_maybe_nan(maxVal, val13);
1048+
maxVal = te_max_maybe_nan(maxVal, val14);
1049+
maxVal = te_max_maybe_nan(maxVal, val15);
1050+
maxVal = te_max_maybe_nan(maxVal, val16);
1051+
maxVal = te_max_maybe_nan(maxVal, val17);
1052+
maxVal = te_max_maybe_nan(maxVal, val18);
1053+
maxVal = te_max_maybe_nan(maxVal, val19);
1054+
maxVal = te_max_maybe_nan(maxVal, val20);
1055+
maxVal = te_max_maybe_nan(maxVal, val21);
1056+
maxVal = te_max_maybe_nan(maxVal, val22);
1057+
maxVal = te_max_maybe_nan(maxVal, val23);
1058+
return te_max_maybe_nan(maxVal, val24);
10391059
// NOLINTEND
10401060
}
10411061

@@ -1047,7 +1067,10 @@ namespace te_builtins
10471067

10481068
[[nodiscard]]
10491069
static te_type te_min(te_type val1, te_type val2, te_type val3, te_type val4, te_type val5,
1050-
te_type val6, te_type val7) noexcept
1070+
te_type val6, te_type val7, te_type val8, te_type val9, te_type val10,
1071+
te_type val11, te_type val12, te_type val13, te_type val14, te_type val15,
1072+
te_type val16, te_type val17, te_type val18, te_type val19, te_type val20,
1073+
te_type val21, te_type val22, te_type val23, te_type val24) noexcept
10511074
{
10521075
// assumes that at least val1 is legit, rest can be NaN
10531076
// NOLINTBEGIN
@@ -1056,7 +1079,24 @@ namespace te_builtins
10561079
minVal = te_min_maybe_nan(minVal, val4);
10571080
minVal = te_min_maybe_nan(minVal, val5);
10581081
minVal = te_min_maybe_nan(minVal, val6);
1059-
return te_min_maybe_nan(minVal, val7);
1082+
minVal = te_min_maybe_nan(minVal, val7);
1083+
minVal = te_min_maybe_nan(minVal, val8);
1084+
minVal = te_min_maybe_nan(minVal, val9);
1085+
minVal = te_min_maybe_nan(minVal, val10);
1086+
minVal = te_min_maybe_nan(minVal, val11);
1087+
minVal = te_min_maybe_nan(minVal, val12);
1088+
minVal = te_min_maybe_nan(minVal, val13);
1089+
minVal = te_min_maybe_nan(minVal, val14);
1090+
minVal = te_min_maybe_nan(minVal, val15);
1091+
minVal = te_min_maybe_nan(minVal, val16);
1092+
minVal = te_min_maybe_nan(minVal, val17);
1093+
minVal = te_min_maybe_nan(minVal, val18);
1094+
minVal = te_min_maybe_nan(minVal, val19);
1095+
minVal = te_min_maybe_nan(minVal, val20);
1096+
minVal = te_min_maybe_nan(minVal, val21);
1097+
minVal = te_min_maybe_nan(minVal, val22);
1098+
minVal = te_min_maybe_nan(minVal, val23);
1099+
return te_min_maybe_nan(minVal, val24);
10601100
// NOLINTEND
10611101
}
10621102

@@ -1265,10 +1305,10 @@ const std::set<te_variable> te_parser::m_functions = { // NOLINT
12651305
static_cast<te_variable_flags>(TE_PURE | TE_VARIADIC) },
12661306
{ "ln", static_cast<te_fun1>(te_builtins::te_log), TE_PURE },
12671307
{ "log10", static_cast<te_fun1>(te_builtins::te_log10), TE_PURE },
1268-
{ "max", static_cast<te_fun7>(te_builtins::te_max),
1308+
{ "max", static_cast<te_fun24>(te_builtins::te_max),
12691309
static_cast<te_variable_flags>(TE_PURE | TE_VARIADIC) },
12701310
{ "maxint", static_cast<te_fun0>(te_builtins::te_max_integer), TE_PURE },
1271-
{ "min", static_cast<te_fun7>(te_builtins::te_min),
1311+
{ "min", static_cast<te_fun24>(te_builtins::te_min),
12721312
static_cast<te_variable_flags>(TE_PURE | TE_VARIADIC) },
12731313
{ "mod", static_cast<te_fun2>(te_builtins::te_modulus), TE_PURE },
12741314
{ "nan", static_cast<te_fun0>(te_builtins::te_nan_value), TE_PURE },

0 commit comments

Comments
 (0)