/** * Calculates function value * * @return Function value as double. */ public double calculate() { if (functionBodyType == BODY_RUNTIME) return functionExpression.calculate(); else if (isVariadic == false) return functionExtension.calculate(); else { List<Double> paramsList = functionExpression.UDFVariadicParamsAtRunTime; if (paramsList != null) { int n = paramsList.size(); double[] parameters = new double[n]; for (int i = 0; i < n; i++) parameters[i] = paramsList.get(i); return functionExtensionVariadic.calculate(parameters); } else return Double.NaN; } } /**
/** * Gets user defined function parameter name * * @param parameterIndex Parameter index between 0 and n-1 * @return If parameter exists returns parameters name, otherwise empty string is returned. */ public String getParameterName(int parameterIndex) { if (parameterIndex < 0) return ""; if (parameterIndex >= parametersNumber) return ""; if (functionBodyType == BODY_RUNTIME) return getArgument(parameterIndex).getArgumentName(); if (functionBodyType == BODY_EXTENDED) return this.functionExtension.getParameterName(parameterIndex); return ""; } /**
/** * Sets value of function argument (function parameter). * * @param argumentIndex the argument index (in accordance to * arguments declaration sequence) * @param argumentValue the argument value */ public void setArgumentValue(int argumentIndex, double argumentValue) { if (isVariadic == false) if (functionBodyType == BODY_RUNTIME) functionExpression.argumentsList.get(argumentIndex).argumentValue = argumentValue; else if (isVariadic == false) functionExtension.setParameterValue(argumentIndex, argumentValue); } /**
} else { for (int p = 0; p < parameters.length; p++) functionExtension.setParameterValue(p, parameters[p]); return functionExtension.calculate();
/** * Private constructor used for function cloning. * * @param function the function, which is going * to be cloned. */ private Function(Function function) { super(Function.TYPE_ID); functionName = function.functionName; description = function.description; parametersNumber = function.parametersNumber; functionExpression = function.functionExpression.clone(); functionBodyType = function.functionBodyType; isVariadic = function.isVariadic; if (functionBodyType == BODY_EXTENDED) { if (function.functionExtension != null) functionExtension = function.functionExtension.clone(); if (function.functionExtensionVariadic != null) functionExtensionVariadic = function.functionExtensionVariadic.clone(); } } /**
/** * Constructor for function definition based on * your own source code - this is via implementation * of FunctionExtension interface. * * @param functionName Function name * @param functionExtension Your own source code */ public Function(String functionName, FunctionExtension functionExtension) { super(Function.TYPE_ID); if ( mXparser.regexMatch(functionName, ParserSymbol.nameOnlyTokenRegExp) ) { this.functionName = functionName; functionExpression = new Expression("{body-ext}"); isVariadic = false; parametersNumber = functionExtension.getParametersNumber(); description = ""; this.functionExtension = functionExtension; functionBodyType = BODY_EXTENDED; } else { parametersNumber = 0; description = ""; functionExpression = new Expression(""); functionExpression.setSyntaxStatus(SYNTAX_ERROR_OR_STATUS_UNKNOWN, "[" + functionName + "]" + "Invalid function name, pattern not matches: " + ParserSymbol.nameTokenRegExp); } } /**
} else { for (int p = 0; p < arguments.length; p++) functionExtension.setParameterValue(p, arguments[p].getArgumentValue()); return functionExtension.calculate();