App: improve FunctionExpression forward compatibility

Remove runtime check when constructing FunctionExpression, in order to
support future built-in function. Exception will be thrown when
evaluating the expression to inform user about the error.
This commit is contained in:
Zheng, Lei
2020-06-01 11:45:51 +08:00
committed by wwmayer
parent 63bdb75a32
commit 3beb1bff21
6 changed files with 17 additions and 69 deletions

View File

@@ -1766,66 +1766,12 @@ bool OperatorExpression::isRightAssociative() const
TYPESYSTEM_SOURCE(App::FunctionExpression, App::UnitExpression)
FunctionExpression::FunctionExpression(const DocumentObject *_owner, Function _f, std::vector<Expression *> _args)
FunctionExpression::FunctionExpression(const DocumentObject *_owner, Function _f, std::string &&name, std::vector<Expression *> _args)
: UnitExpression(_owner)
, f(_f)
, fname(std::move(name))
, args(_args)
{
switch (f) {
case ACOS:
case ASIN:
case ATAN:
case ABS:
case EXP:
case LOG:
case LOG10:
case SIN:
case SINH:
case TAN:
case TANH:
case SQRT:
case COS:
case COSH:
case ROUND:
case TRUNC:
case CEIL:
case FLOOR:
case MINVERT:
if (args.size() != 1)
EXPR_THROW("Invalid number of arguments: exactly one required.");
break;
case MOD:
case ATAN2:
case POW:
if (args.size() != 2)
EXPR_THROW("Invalid number of arguments: exactly two required.");
break;
case HYPOT:
case CATH:
if (args.size() < 2 || args.size() > 3)
EXPR_THROW("Invalid number of arguments: exactly two, or three required.");
break;
case STDDEV:
case SUM:
case AVERAGE:
case COUNT:
case MIN:
case MAX:
case CREATE:
case MSCALE:
if (args.size() == 0)
EXPR_THROW("Invalid number of arguments: at least one required.");
break;
case LIST:
case TUPLE:
break;
case NONE:
case AGGREGATES:
case LAST:
default:
EXPR_THROW("Unknown function");
break;
}
}
FunctionExpression::~FunctionExpression()
@@ -2392,7 +2338,7 @@ Expression *FunctionExpression::simplify() const
return eval();
}
else
return new FunctionExpression(owner, f, a);
return new FunctionExpression(owner, f, std::string(fname), a);
}
/**
@@ -2473,7 +2419,7 @@ void FunctionExpression::_toString(std::ostream &ss, bool persistent,int) const
case CREATE:
ss << "create("; break;;
default:
assert(0);
ss << fname << "("; break;;
}
for (size_t i = 0; i < args.size(); ++i) {
ss << args[i]->toString(persistent);
@@ -2498,7 +2444,7 @@ Expression *FunctionExpression::_copy() const
a.push_back((*i)->copy());
++i;
}
return new FunctionExpression(owner, f, a);
return new FunctionExpression(owner, f, std::string(fname), a);
}
void FunctionExpression::_visit(ExpressionVisitor &v)