package org.reldb.rel.v0.values;
import java.io.PrintStream;
import java.io.Serializable;
import org.reldb.rel.v0.generator.Generator;
import org.reldb.rel.v0.types.*;
import org.reldb.rel.v0.vm.Context;
/** An abstract Value, that defines all possible operations on abstract ValueS.
*
* If an operation is not supported, throw SemanticException.
*/
public interface Value extends Serializable {
/** Invoked on retrieval from database */
public void loaded(Generator generator);
/** Obtain the type name of this Value. */
public String getTypeName();
/** Output this Value, interpreted as the given Type, to a PrintStream. */
public void toStream(Context context, Type type, PrintStream p, int depth);
/** Write as parsable string. */
public String toParsableString(Type type);
/** Write as final string. */
public String toString(Type type);
/** Return this value's hashCode() */
public int hashCode();
/** Compare this value and another. */
public int compareTo(Value v);
/** Check for equality. */
public boolean equals(Object o);
/** Obtain a serializable clone of this value. Used to obtain serializable RVA values in TempStorageTuples,
but may be needed elsewhere??? */
// TODO - explore eliminating this, if possible
public Value getSerializableClone();
/** Convert this to a primitive boolean. */
public boolean booleanValue();
/** Convert this to a primitive long. */
public long longValue();
/** Convert this to a primitive double. */
public double doubleValue();
/** Convert this to a primitive string. */
public String stringValue();
}