package org.nfunk.jep;

import org.nfunk.jep.function.Add;
import org.nfunk.jep.function.Assign;
import org.nfunk.jep.function.Comparative;
import org.nfunk.jep.function.Cross;
import org.nfunk.jep.function.Divide;
import org.nfunk.jep.function.Dot;
import org.nfunk.jep.function.List;
import org.nfunk.jep.function.Logical;
import org.nfunk.jep.function.Modulus;
import org.nfunk.jep.function.Multiply;
import org.nfunk.jep.function.Not;
import org.nfunk.jep.function.PostfixMathCommandI;
import org.nfunk.jep.function.Power;
import org.nfunk.jep.function.Subtract;
import org.nfunk.jep.function.UMinus;

public class OperatorSet {
  protected Operator OP_GT = new Operator(">", (PostfixMathCommandI)new Comparative(1));
  
  protected Operator OP_LT = new Operator("<", (PostfixMathCommandI)new Comparative(0));
  
  protected Operator OP_EQ = new Operator("==", (PostfixMathCommandI)new Comparative(5));
  
  protected Operator OP_LE = new Operator("<=", (PostfixMathCommandI)new Comparative(2));
  
  protected Operator OP_GE = new Operator(">=", (PostfixMathCommandI)new Comparative(3));
  
  protected Operator OP_NE = new Operator("!=", (PostfixMathCommandI)new Comparative(4));
  
  protected Operator OP_AND = new Operator("&&", (PostfixMathCommandI)new Logical(0));
  
  protected Operator OP_OR = new Operator("||", (PostfixMathCommandI)new Logical(1));
  
  protected Operator OP_NOT = new Operator("!", (PostfixMathCommandI)new Not());
  
  protected Operator OP_ADD = new Operator("+", (PostfixMathCommandI)new Add());
  
  protected Operator OP_SUBTRACT = new Operator("-", (PostfixMathCommandI)new Subtract());
  
  protected Operator OP_UMINUS = new Operator("UMinus", "-", (PostfixMathCommandI)new UMinus());
  
  protected Operator OP_MULTIPLY = new Operator("*", (PostfixMathCommandI)new Multiply());
  
  protected Operator OP_DIVIDE = new Operator("/", (PostfixMathCommandI)new Divide());
  
  protected Operator OP_MOD = new Operator("%", (PostfixMathCommandI)new Modulus());
  
  protected Operator OP_UDIVIDE = new Operator("UDivide", "^-1", null);
  
  protected Operator OP_POWER = new Operator("^", (PostfixMathCommandI)new Power());
  
  protected Operator OP_ASSIGN = new Operator("=", (PostfixMathCommandI)new Assign());
  
  protected Operator OP_DOT = new Operator(".", (PostfixMathCommandI)new Dot());
  
  protected Operator OP_CROSS = new Operator("^^", (PostfixMathCommandI)new Cross());
  
  protected Operator OP_LIST = new Operator("LIST", (PostfixMathCommandI)new List());
  
  public Operator[] getOperators() {
    return new Operator[] { 
        this.OP_GT, this.OP_LT, this.OP_GE, this.OP_LE, this.OP_EQ, this.OP_NE, this.OP_AND, this.OP_OR, this.OP_NOT, this.OP_ADD, 
        this.OP_SUBTRACT, this.OP_UMINUS, this.OP_MULTIPLY, this.OP_DIVIDE, this.OP_MOD, this.OP_POWER, this.OP_ASSIGN, this.OP_DOT, this.OP_CROSS, this.OP_LIST };
  }
  
  public void printOperators() {
    Operator[] arrayOfOperator = getOperators();
    for (byte b = 0; b < arrayOfOperator.length; b++)
      System.out.println(arrayOfOperator[b].toString()); 
  }
  
  public Operator getAdd() {
    return this.OP_ADD;
  }
  
  public Operator getSubtract() {
    return this.OP_SUBTRACT;
  }
  
  public Operator getUMinus() {
    return this.OP_UMINUS;
  }
  
  public Operator getMultiply() {
    return this.OP_MULTIPLY;
  }
  
  public Operator getDivide() {
    return this.OP_DIVIDE;
  }
  
  public Operator getMod() {
    return this.OP_MOD;
  }
  
  public Operator getPower() {
    return this.OP_POWER;
  }
  
  public Operator getEQ() {
    return this.OP_EQ;
  }
  
  public Operator getNE() {
    return this.OP_NE;
  }
  
  public Operator getGE() {
    return this.OP_GE;
  }
  
  public Operator getGT() {
    return this.OP_GT;
  }
  
  public Operator getLE() {
    return this.OP_LE;
  }
  
  public Operator getLT() {
    return this.OP_LT;
  }
  
  public Operator getAnd() {
    return this.OP_AND;
  }
  
  public Operator getOr() {
    return this.OP_OR;
  }
  
  public Operator getNot() {
    return this.OP_NOT;
  }
  
  public Operator getAssign() {
    return this.OP_ASSIGN;
  }
  
  public Operator getDot() {
    return this.OP_DOT;
  }
  
  public Operator getCross() {
    return this.OP_CROSS;
  }
  
  public Operator getList() {
    return this.OP_LIST;
  }
}
