package org.uva.student.calinwouter.qlqls.ql.types; import org.uva.student.calinwouter.qlqls.ql.interfaces.ITypeCallback; import org.uva.student.calinwouter.qlqls.ql.exceptions.UnsupportedValueOperationException; public abstract class Value { private final Object internalValue; public Value and(Value value) { throw new UnsupportedValueOperationException(); } public Value or(Value value) { throw new UnsupportedValueOperationException(); } public Value add(Value value) { throw new UnsupportedValueOperationException(); } public Value subtract(Value value) { throw new UnsupportedValueOperationException(); } public Value multiply(Value value) { throw new UnsupportedValueOperationException(); } public Value divide(Value value) { throw new UnsupportedValueOperationException(); } public Value modulo(Value value) { throw new UnsupportedValueOperationException(); } public BooleanValue not() { throw new UnsupportedValueOperationException(); } public BooleanValue lesserThan(Value value) { throw new UnsupportedValueOperationException(); } public BooleanValue greaterThan(Value value) { throw new UnsupportedValueOperationException(); } public BooleanValue lesserThanOrEquals(Value value) { throw new UnsupportedValueOperationException(); } public BooleanValue greaterThanOrEquals(Value value) { throw new UnsupportedValueOperationException(); } public Object toJavaObject() { return internalValue; } public Value(Object value) { assert(value != null); this.internalValue = value; } public BooleanValue valueEquals(Value value) { final Object otherInternalValue = value.toJavaObject(); final Object myInternalValue = toJavaObject(); final Boolean equality = otherInternalValue.equals(myInternalValue); return new BooleanValue(equality); } public BooleanValue valueNotEquals(Value value) { final BooleanValue equalityBooleanValue = valueEquals(value); return equalityBooleanValue.not(); } public abstract void apply(ITypeCallback typeCallback); @Override public String toString() { return "" + toJavaObject(); } }