package net.iplantevin.ql.evaluation;
/**
* @author Ivan
*/
public class IntVal extends Value {
private final Integer value;
public IntVal(Integer value) {
this.value = value;
}
public Integer getValue() {
return value;
}
@Override
public Value add(Value argument) {
return argument.intAdd(this);
}
@Override
public Value sub(Value argument) {
return argument.intSub(this);
}
@Override
public Value mul(Value argument) {
return argument.intMul(this);
}
@Override
public Value div(Value argument) {
return argument.intDiv(this);
}
@Override
public Value geq(Value argument) {
return argument.intGeq(this);
}
@Override
public Value gt(Value argument) {
return argument.intGt(this);
}
@Override
public Value leq(Value argument) {
return argument.intLeq(this);
}
@Override
public Value lt(Value argument) {
return argument.intLt(this);
}
@Override
public Value neg() {
return new IntVal(-value);
}
@Override
public Value pos() {
return this;
}
// Methods for double dispatch.
// Note: order is reversed!! If val1.sub(val2) is called, this will result
// in val2.intSub(val1), where val1 - val2 must actually be performed!
@Override
protected Value intAdd(IntVal argument) {
return new IntVal(argument.getValue() + value);
}
@Override
protected Value intSub(IntVal argument) {
return new IntVal(argument.getValue() - value);
}
@Override
protected Value intMul(IntVal argument) {
return new IntVal(argument.getValue() * value);
}
@Override
protected Value intDiv(IntVal argument) {
return new IntVal(argument.getValue() / value);
}
@Override
protected Value intGeq(IntVal argument) {
return new BoolVal(argument.getValue() >= value);
}
@Override
protected Value intGt(IntVal argument) {
return new BoolVal(argument.getValue() > value);
}
@Override
protected Value intLeq(IntVal argument) {
return new BoolVal(argument.getValue() <= value);
}
@Override
protected Value intLt(IntVal argument) {
Value val = new BoolVal(argument.getValue() < value);
return val;
}
@Override
public boolean equals(Object object) {
if (object instanceof IntVal) {
Integer castedInt = ((IntVal) object).getValue();
return value.equals(castedInt);
} else {
return false;
}
}
@Override
public int hashCode() {
return value.hashCode();
}
}