/**
* Copyright 2015 Santhosh Kumar Tekuri
*
* The JLibs authors license this file to you under the Apache License,
* version 2.0 (the "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
package jlibs.xml.sax.dog.expr.func;
import jlibs.core.lang.ArrayUtil;
import jlibs.xml.sax.dog.DataType;
/**
* @author Santhosh Kumar T
*/
public abstract class Function{
public final String namespace;
public final String name;
public final DataType resultType;
public final DataType memberTypes[];
public final boolean varArgs;
/**
* tells how many arguments from beginning are mandatory.
* in case varArgs is :
* o false: varArgs==membterTypes.lenth
* o true: varArgs==memberTypes.length or varArgs==memberTypes.length-1
*/
public final int mandatory;
protected Function(String name, DataType resultType, boolean varArgs, DataType... memberTypes){
this("", name, resultType, varArgs, memberTypes.length, memberTypes);
}
protected Function(String namespace, String name, DataType resultType, boolean varArgs, DataType... memberTypes){
this(namespace, name, resultType, varArgs, memberTypes.length, memberTypes);
}
protected Function(String namespace, String name, DataType resultType, boolean varArgs, int mandatory, DataType... memberTypes){
this.namespace = namespace;
this.name = name;
this.resultType = resultType;
this.memberTypes = memberTypes;
this.varArgs = varArgs;
this.mandatory = mandatory;
}
public final boolean canAccept(int noOfMembers){
return noOfMembers>=mandatory && (varArgs || noOfMembers<=memberTypes.length);
}
public final DataType memberType(int i){
return i<memberTypes.length ? memberTypes[i] : memberTypes[memberTypes.length-1];
}
public abstract Object evaluate(Object... args);
private static final String operators[] = { "+", "-", "*", "div", "mod", "and", "or", "|", "=", "!=", ">", ">=", "<", "<=" };
public final boolean isOperator(){
return ArrayUtil.indexOf(operators, name)!=-1;
}
}