package nl.ipo.cds.validation.constants;
import java.lang.invoke.MethodHandles;
import nl.ipo.cds.validation.AbstractExpression;
import nl.ipo.cds.validation.ValidationMessage;
import nl.ipo.cds.validation.ValidatorContext;
import nl.ipo.cds.validation.execute.Compiler;
import nl.ipo.cds.validation.execute.CompilerException;
import nl.ipo.cds.validation.execute.ExpressionExecutor;
public class Constant<K extends Enum<K> & ValidationMessage<K, C>, C extends ValidatorContext<K, C>, T> extends AbstractExpression<K, C, T> {
public final T value;
public final Class<T> type;
public Constant (final T value, final Class<T> type) {
this.value = value;
this.type = type;
}
@Override
public Class<T> getResultType () {
return type;
}
public T evaluate (final ValidatorContext<K, C> context) {
return value;
}
@Override
public String toString () {
return value.toString ();
}
@Override
public ExpressionExecutor<C> getExecutor (final Compiler<C> compiler) throws CompilerException {
return ExpressionExecutor.create (
this,
true,
true,
MethodHandles.constant (type, value),
false
);
}
/**
* Override equals to merge equal constants in the executor.
*/
@Override
public boolean equals (final Object o) {
if (o == null) {
return false;
}
if (!(o instanceof Constant)) {
return false;
}
return value.equals (((Constant<?, ?, ?>)o).value);
}
@Override
public int hashCode () {
return value.hashCode ();
}
}