Skip to content

Commit 69a7c22

Browse files
committed
Add 24-parameter support to AND and OR
1 parent 1f4d7ec commit 69a7c22

File tree

2 files changed

+93
-7
lines changed

2 files changed

+93
-7
lines changed

tests/tetests.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -720,11 +720,55 @@ TEST_CASE("Main tests", "[main]")
720720
CHECK(tep.evaluate("AND(-1, 5)") == 1);
721721
CHECK(tep.evaluate("AND(1, 1)") == 1);
722722
CHECK(tep.evaluate("AND(5, 2)") == 1);
723+
CHECK_FALSE(tep.evaluate("AND(5, 0)"));
724+
CHECK_FALSE(tep.evaluate("AND(5,5,0)"));
725+
CHECK_FALSE(tep.evaluate("AND(5,5,5,0)"));
726+
CHECK_FALSE(tep.evaluate("AND(5,5,5,5,0)"));
727+
CHECK_FALSE(tep.evaluate("AND(5,5,5,5,5,0)"));
728+
CHECK_FALSE(tep.evaluate("AND(5,5,5,5,5,5,0)"));
729+
CHECK_FALSE(tep.evaluate("AND(5,5,5,5,5,5,5,0)"));
730+
CHECK_FALSE(tep.evaluate("AND(5,5,5,5,5,5,5,5,0)"));
731+
CHECK_FALSE(tep.evaluate("AND(5,5,5,5,5,5,5,5,5,0)"));
732+
CHECK_FALSE(tep.evaluate("AND(5,5,5,5,5,5,5,5,5,5,0)"));
733+
CHECK_FALSE(tep.evaluate("AND(5,5,5,5,5,5,5,5,5,5,5,0)"));
734+
CHECK_FALSE(tep.evaluate("AND(5,5,5,5,5,5,5,5,5,5,5,5,0)"));
735+
CHECK_FALSE(tep.evaluate("AND(5,5,5,5,5,5,5,5,5,5,5,5,5,0)"));
736+
CHECK_FALSE(tep.evaluate("AND(5,5,5,5,5,5,5,5,5,5,5,5,5,5,0)"));
737+
CHECK_FALSE(tep.evaluate("AND(5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0)"));
738+
CHECK_FALSE(tep.evaluate("AND(5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0)"));
739+
CHECK_FALSE(tep.evaluate("AND(5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0)"));
740+
CHECK_FALSE(tep.evaluate("AND(5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0)"));
741+
CHECK_FALSE(tep.evaluate("AND(5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0)"));
742+
CHECK_FALSE(tep.evaluate("AND(5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0)"));
743+
CHECK_FALSE(tep.evaluate("AND(5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0)"));
744+
CHECK_FALSE(tep.evaluate("AND(5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0)"));
745+
CHECK_FALSE(tep.evaluate("AND(5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0)"));
723746
CHECK(tep.evaluate("or(-1, 0.0)") == 1);
724747
CHECK(tep.evaluate("or(0.0, 5)") == 1);
725748
CHECK_FALSE(tep.evaluate("or(0.0, 0)"));
726749
CHECK(tep.evaluate("OR(-1, 5)") == 1);
727750
CHECK(tep.evaluate("OR(1, 1)") == 1);
751+
CHECK(tep.evaluate("OR(0,0,1)") == 1);
752+
CHECK(tep.evaluate("OR(0,0,0,1)") == 1);
753+
CHECK(tep.evaluate("OR(0,0,0,0,1)") == 1);
754+
CHECK(tep.evaluate("OR(0,0,0,0,0,0,1)") == 1);
755+
CHECK(tep.evaluate("OR(0,0,0,0,0,0,0,1)") == 1);
756+
CHECK(tep.evaluate("OR(0,0,0,0,0,0,0,0,1)") == 1);
757+
CHECK(tep.evaluate("OR(0,0,0,0,0,0,0,0,0,1)") == 1);
758+
CHECK(tep.evaluate("OR(0,0,0,0,0,0,0,0,0,0,1)") == 1);
759+
CHECK(tep.evaluate("OR(0,0,0,0,0,0,0,0,0,0,0,1)") == 1);
760+
CHECK(tep.evaluate("OR(0,0,0,0,0,0,0,0,0,0,0,0,1)") == 1);
761+
CHECK(tep.evaluate("OR(0,0,0,0,0,0,0,0,0,0,0,0,0,1)") == 1);
762+
CHECK(tep.evaluate("OR(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1)") == 1);
763+
CHECK(tep.evaluate("OR(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1)") == 1);
764+
CHECK(tep.evaluate("OR(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1)") == 1);
765+
CHECK(tep.evaluate("OR(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1)") == 1);
766+
CHECK(tep.evaluate("OR(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1)") == 1);
767+
CHECK(tep.evaluate("OR(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1)") == 1);
768+
CHECK(tep.evaluate("OR(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1)") == 1);
769+
CHECK(tep.evaluate("OR(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1)") == 1);
770+
CHECK(tep.evaluate("OR(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1)") == 1);
771+
CHECK(tep.evaluate("OR(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1)") == 1);
728772
CHECK_FALSE(tep.evaluate("not(-1)"));
729773
CHECK(tep.evaluate("not(0.0)") == 1);
730774
CHECK(tep.evaluate("NOT(0)") == 1);

tinyexpr.cpp

Lines changed: 49 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1133,7 +1133,11 @@ namespace te_builtins
11331133

11341134
[[nodiscard]]
11351135
static te_type te_and_variadic(te_type val1, te_type val2, te_type val3, te_type val4,
1136-
te_type val5, te_type val6, te_type val7)
1136+
te_type val5, te_type val6, te_type val7, te_type val8,
1137+
te_type val9, te_type val10, te_type val11, te_type val12,
1138+
te_type val13, te_type val14, te_type val15, te_type val16,
1139+
te_type val17, te_type val18, te_type val19, te_type val20,
1140+
te_type val21, te_type val22, te_type val23, te_type val24)
11371141
{
11381142
// at least val1 must be legit, rest can be NaN
11391143
if (!std::isfinite(val1))
@@ -1146,7 +1150,24 @@ namespace te_builtins
11461150
andVal = te_and_maybe_nan(andVal, val4);
11471151
andVal = te_and_maybe_nan(andVal, val5);
11481152
andVal = te_and_maybe_nan(andVal, val6);
1149-
return te_and_maybe_nan(andVal, val7);
1153+
andVal = te_and_maybe_nan(andVal, val7);
1154+
andVal = te_and_maybe_nan(andVal, val8);
1155+
andVal = te_and_maybe_nan(andVal, val9);
1156+
andVal = te_and_maybe_nan(andVal, val10);
1157+
andVal = te_and_maybe_nan(andVal, val11);
1158+
andVal = te_and_maybe_nan(andVal, val12);
1159+
andVal = te_and_maybe_nan(andVal, val13);
1160+
andVal = te_and_maybe_nan(andVal, val14);
1161+
andVal = te_and_maybe_nan(andVal, val15);
1162+
andVal = te_and_maybe_nan(andVal, val16);
1163+
andVal = te_and_maybe_nan(andVal, val17);
1164+
andVal = te_and_maybe_nan(andVal, val18);
1165+
andVal = te_and_maybe_nan(andVal, val19);
1166+
andVal = te_and_maybe_nan(andVal, val20);
1167+
andVal = te_and_maybe_nan(andVal, val21);
1168+
andVal = te_and_maybe_nan(andVal, val22);
1169+
andVal = te_and_maybe_nan(andVal, val23);
1170+
return te_and_maybe_nan(andVal, val24);
11501171
// NOLINTEND
11511172
}
11521173

@@ -1161,7 +1182,11 @@ namespace te_builtins
11611182

11621183
[[nodiscard]]
11631184
static te_type te_or_variadic(te_type val1, te_type val2, te_type val3, te_type val4,
1164-
te_type val5, te_type val6, te_type val7)
1185+
te_type val5, te_type val6, te_type val7, te_type val8,
1186+
te_type val9, te_type val10, te_type val11, te_type val12,
1187+
te_type val13, te_type val14, te_type val15, te_type val16,
1188+
te_type val17, te_type val18, te_type val19, te_type val20,
1189+
te_type val21, te_type val22, te_type val23, te_type val24)
11651190
{
11661191
// at least val1 must be legit, rest can be NaN
11671192
if (!std::isfinite(val1))
@@ -1174,7 +1199,24 @@ namespace te_builtins
11741199
orVal = te_or_maybe_nan(orVal, val4);
11751200
orVal = te_or_maybe_nan(orVal, val5);
11761201
orVal = te_or_maybe_nan(orVal, val6);
1177-
return te_or_maybe_nan(orVal, val7);
1202+
orVal = te_or_maybe_nan(orVal, val7);
1203+
orVal = te_or_maybe_nan(orVal, val8);
1204+
orVal = te_or_maybe_nan(orVal, val9);
1205+
orVal = te_or_maybe_nan(orVal, val10);
1206+
orVal = te_or_maybe_nan(orVal, val11);
1207+
orVal = te_or_maybe_nan(orVal, val12);
1208+
orVal = te_or_maybe_nan(orVal, val13);
1209+
orVal = te_or_maybe_nan(orVal, val14);
1210+
orVal = te_or_maybe_nan(orVal, val15);
1211+
orVal = te_or_maybe_nan(orVal, val16);
1212+
orVal = te_or_maybe_nan(orVal, val17);
1213+
orVal = te_or_maybe_nan(orVal, val18);
1214+
orVal = te_or_maybe_nan(orVal, val19);
1215+
orVal = te_or_maybe_nan(orVal, val20);
1216+
orVal = te_or_maybe_nan(orVal, val21);
1217+
orVal = te_or_maybe_nan(orVal, val22);
1218+
orVal = te_or_maybe_nan(orVal, val23);
1219+
return te_or_maybe_nan(orVal, val24);
11781220
// NOLINTEND
11791221
}
11801222

@@ -1268,8 +1310,8 @@ void te_parser::te_free_parameters(te_expr* texp)
12681310
const std::set<te_variable> te_parser::m_functions = { // NOLINT
12691311
{ "abs", static_cast<te_fun1>(te_builtins::te_absolute_value), TE_PURE },
12701312
{ "acos", static_cast<te_fun1>(te_builtins::te_acos), TE_PURE },
1271-
// variadic, accepts 1-7 arguments
1272-
{ "and", static_cast<te_fun7>(te_builtins::te_and_variadic),
1313+
// variadic, accepts 1-24 arguments
1314+
{ "and", static_cast<te_fun24>(te_builtins::te_and_variadic),
12731315
static_cast<te_variable_flags>(TE_PURE | TE_VARIADIC) },
12741316
{ "asin", static_cast<te_fun1>(te_builtins::te_asin), TE_PURE },
12751317
{ "atan", static_cast<te_fun1>(te_builtins::te_atan), TE_PURE },
@@ -1338,7 +1380,7 @@ const std::set<te_variable> te_parser::m_functions = { // NOLINT
13381380
{ "not", static_cast<te_fun1>(te_builtins::te_not), TE_PURE },
13391381
{ "npr", static_cast<te_fun2>(te_builtins::te_npr), TE_PURE },
13401382
{ "odd", static_cast<te_fun1>(te_builtins::te_odd), TE_PURE },
1341-
{ "or", static_cast<te_fun7>(te_builtins::te_or_variadic),
1383+
{ "or", static_cast<te_fun24>(te_builtins::te_or_variadic),
13421384
static_cast<te_variable_flags>(TE_PURE | TE_VARIADIC) },
13431385
{ "permut", static_cast<te_fun2>(te_builtins::te_npr), TE_PURE },
13441386
{ "pi", static_cast<te_fun0>(te_builtins::te_pi), TE_PURE },

0 commit comments

Comments
 (0)