package org.uva.ql.ast.value;
public class IntValue extends Value {
private final Integer value;
public IntValue(Integer value) {
this.value = value;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof IntValue){
return value.equals(((IntValue) obj).value());
} else {
throw new UnsupportedOperationException("IntValue is only compariable with another IntValue.");
}
}
@Override
public boolean isDefined() {
return true;
}
@Override
public Integer value() {
return value;
}
@Override
public String toString() {
return value.toString();
}
@Override
public Value positive() {
return new IntValue(+value());
}
@Override
public Value negative() {
return new IntValue(-value());
}
/*------------------Double Dispatch ------------------*/
@Override
public Value plus(Value arg) {
return arg.intPlus(this);
}
@Override
public Value intPlus(IntValue arg) {
return new IntValue(arg.value() + value());
}
@Override
public Value minus(Value arg) {
return arg.intMinus(this);
}
@Override
public Value intMinus(IntValue arg) {
return new IntValue(arg.value() - value());
}
@Override
public Value multiply(Value arg) {
return arg.intMultiply(this);
}
@Override
public Value intMultiply(IntValue arg) {
return new IntValue(arg.value() * value());
}
@Override
public Value divide(Value arg) {
return arg.intDivide(this);
}
@Override
public Value intDivide(IntValue arg) {
return new IntValue(arg.value() / value());
}
@Override
public Value greater(Value arg) {
return arg.intGreater(this);
}
@Override
public Value intGreater(IntValue arg) {
return new BoolValue(arg.value() > value());
}
@Override
public Value greaterEqual(Value arg) {
return arg.intGreaterEqual(this);
}
@Override
public Value intGreaterEqual(IntValue arg) {
return new BoolValue(arg.value() >= value());
}
@Override
public Value less(Value arg) {
return arg.intLess(this);
}
@Override
public Value intLess(IntValue arg) {
return new BoolValue(arg.value() < value());
}
@Override
public Value lessEqual(Value arg) {
return arg.intLessEqual(this);
}
@Override
public Value intLessEqual(IntValue arg) {
return new BoolValue(arg.value() <= value());
}
@Override
public Value equal(Value arg) {
return arg.intEqual(this);
}
@Override
public Value intEqual(IntValue arg) {
return new BoolValue(arg.value() == value());
}
@Override
public Value notEqual(Value arg) {
return arg.intNotEqual(this);
}
@Override
public Value intNotEqual(IntValue arg) {
return new BoolValue(arg.value() != value());
}
}