WFL: Cleanup of min() and max() function, and allow them to work on strings etc

It was already possibly for them to work on strings by using a list, but this is more consistent.
This commit is contained in:
Celtic Minstrel 2017-04-17 02:39:12 -04:00
parent 94e73a7ccc
commit eccd3d8e7e

View file

@ -200,22 +200,17 @@ public:
private:
variant execute(const formula_callable& variables, formula_debugger *fdb) const {
bool found = false;
variant res(0);
for(size_t n = 0; n != args().size(); ++n) {
const variant v = args()[n]->evaluate(variables,fdb);
variant res = args()[0]->evaluate(variables, fdb);
if(res.is_list()) {
res = *std::min_element(res.begin(), res.end());
}
for(size_t n = 1; n < args().size(); ++n) {
variant v = args()[n]->evaluate(variables,fdb);
if(v.is_list()) {
for(size_t m = 0; m != v.num_elements(); ++m) {
if(!found || v[m] < res) {
res = v[m];
found = true;
}
}
} else if(v.is_int() || v.is_decimal()) {
if(!found || v < res) {
res = v;
found = true;
}
v = *std::min_element(v.begin(), v.end());
}
if(res.is_null() || v < res) {
res = v;
}
}
@ -231,22 +226,17 @@ public:
private:
variant execute(const formula_callable& variables, formula_debugger *fdb) const {
bool found = false;
variant res(0);
for(size_t n = 0; n != args().size(); ++n) {
const variant v = args()[n]->evaluate(variables,fdb);
variant res = args()[0]->evaluate(variables, fdb);
if(res.is_list()) {
res = *std::max_element(res.begin(), res.end());
}
for(size_t n = 1; n < args().size(); ++n) {
variant v = args()[n]->evaluate(variables, fdb);
if(v.is_list()) {
for(size_t m = 0; m != v.num_elements(); ++m) {
if(!found || v[m] > res) {
res = v[m];
found = true;
}
}
} else if(v.is_int() || v.is_decimal()) {
if(!found || v > res) {
res = v;
found = true;
}
v = *std::max_element(v.begin(), v.end());
}
if(res.is_null() || v > res) {
res = v;
}
}