/*
* Encog(tm) Core v3.4 - Java Version
* http://www.heatonresearch.com/encog/
* https://github.com/encog/encog-java-core
* Copyright 2008-2016 Heaton Research, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* For more information on Heaton Research copyrights, licenses
* and trademarks visit:
* http://www.heatonresearch.com/copyright
*/
package org.encog.ml.prg.expvalue;
import java.io.Serializable;
import org.encog.ml.ea.exception.EARuntimeError;
/**
* An EncogProgram expression value. These is how Encog stores variables and
* calculates values.
*/
public class ExpressionValue implements Serializable {
/**
* The serial id.
*/
private static final long serialVersionUID = 1L;
/**
* If the value is a string, this contains the value.
*/
private final String stringValue;
/**
* If the value is a float, this contains the value.
*/
private final double floatValue;
/**
* If the value is a boolean, this contains the value.
*/
private final boolean boolValue;
/**
* The type of this expression.
*/
private final ValueType expressionType;
/**
* If the value is an int, this contains the value.
*/
private final long intValue;
/**
* If the value is an enum, this contains the value.
*/
private final int enumType;
/**
* Construct a boolean expression.
*
* @param theValue
* The value to construct.
*/
public ExpressionValue(final boolean theValue) {
this.boolValue = theValue;
this.expressionType = ValueType.booleanType;
this.floatValue = 0;
this.stringValue = null;
this.intValue = 0;
this.enumType = -1;
}
/**
* Construct a boolean expression.
*
* @param theValue
* The value to construct.
*/
public ExpressionValue(final double theValue) {
this.floatValue = theValue;
this.expressionType = ValueType.floatingType;
this.boolValue = false;
this.stringValue = null;
this.intValue = 0;
this.enumType = -1;
}
/**
* Construct a expression based on an expression.
*
* @param other
* The value to construct.
*/
public ExpressionValue(final ExpressionValue other) {
switch (this.expressionType = other.expressionType) {
case booleanType:
this.boolValue = other.boolValue;
this.floatValue = 0;
this.stringValue = null;
this.intValue = 0;
this.enumType = -1;
break;
case floatingType:
this.floatValue = other.floatValue;
this.boolValue = false;
this.stringValue = null;
this.intValue = 0;
this.enumType = -1;
break;
case intType:
this.intValue = other.intValue;
this.boolValue = false;
this.floatValue = 0;
this.stringValue = null;
this.enumType = -1;
break;
case stringType:
this.stringValue = other.stringValue;
this.boolValue = false;
this.floatValue = 0;
this.intValue = 0;
this.enumType = -1;
break;
case enumType:
this.intValue = other.intValue;
this.boolValue = false;
this.floatValue = 0;
this.stringValue = null;
this.enumType = other.enumType;
break;
default:
throw new EARuntimeError("Unsupported type.");
}
}
/**
* Construct an enum expression.
* @param theEnumType The type.
* @param theValue The value to construct.
*/
public ExpressionValue(final int theEnumType, final long theValue) {
this.intValue = theValue;
this.expressionType = ValueType.enumType;
this.boolValue = false;
this.floatValue = 0;
this.stringValue = null;
this.enumType = theEnumType;
}
/**
* Construct an integer expression.
*
* @param theValue
* The value to construct.
*/
public ExpressionValue(final long theValue) {
this.intValue = theValue;
this.expressionType = ValueType.intType;
this.boolValue = false;
this.floatValue = 0;
this.stringValue = null;
this.enumType = -1;
}
/**
* Construct a string expression.
*
* @param theValue
* The value to construct.
*/
public ExpressionValue(final String theValue) {
this.stringValue = theValue;
this.expressionType = ValueType.stringType;
this.boolValue = false;
this.floatValue = 0;
this.intValue = 0;
this.enumType = -1;
}
/**
* Construct a value of the specified type.
*
* @param theType
* The value to construct.
*/
public ExpressionValue(final ValueType theType) {
this.expressionType = theType;
this.intValue = 0;
this.boolValue = false;
this.floatValue = 0;
this.stringValue = null;
this.enumType = -1;
}
/**
* @return the enumType
*/
public int getEnumType() {
return this.enumType;
}
/**
* @return The expression type.
*/
public ValueType getExpressionType() {
return this.expressionType;
}
/**
* @return True, if this is a boolean.
*/
public boolean isBoolean() {
return this.expressionType == ValueType.booleanType;
}
/**
* @return True, if this is an enum.
*/
public boolean isEnum() {
return this.expressionType == ValueType.enumType;
}
/**
* @return True, if this is a float.
*/
public boolean isFloat() {
return this.expressionType == ValueType.floatingType;
}
/**
* @return True, if this is an int.
*/
public boolean isInt() {
return this.expressionType == ValueType.intType;
}
/**
* @return True, if the value is either int or float.
*/
public boolean isNumeric() {
return isFloat() || isInt();
}
/**
* @return True, if this is a string.
*/
public boolean isString() {
return this.expressionType == ValueType.stringType;
}
/**
* @return The value as a boolean, or type mismatch if conversion is not
* possible.
*/
public boolean toBooleanValue() {
switch (this.expressionType) {
case intType:
throw new EARuntimeError("Type Mismatch: can't convert "
+ this.intValue + " to boolean.");
case floatingType:
throw new EARuntimeError("Type Mismatch: can't convert "
+ this.floatValue + " to boolean.");
case booleanType:
return this.boolValue;
case stringType:
throw new EARuntimeError("Type Mismatch: can't convert "
+ this.stringValue + " to boolean.");
case enumType:
throw new EARuntimeError(
"Type Mismatch: can't convert enum to boolean.");
default:
throw new EARuntimeError("Unknown type: " + this.expressionType);
}
}
/**
* @return The value as a float, or type mismatch if conversion is not
* possible.
*/
public double toFloatValue() {
switch (this.expressionType) {
case intType:
return this.intValue;
case floatingType:
return this.floatValue;
case booleanType:
throw new EARuntimeError(
"Type Mismatch: can't convert float to boolean.");
case stringType:
try {
return Double.parseDouble(this.stringValue);
} catch (final NumberFormatException ex) {
throw new EARuntimeError("Type Mismatch: can't convert "
+ this.stringValue + " to floating point.");
}
case enumType:
throw new EARuntimeError(
"Type Mismatch: can't convert enum to float.");
default:
throw new EARuntimeError("Unknown type: " + this.expressionType);
}
}
/**
* @return The value as a int, or type mismatch if conversion is not
* possible.
*/
public long toIntValue() {
switch (this.expressionType) {
case intType:
return this.intValue;
case floatingType:
return (int) this.floatValue;
case booleanType:
throw new EARuntimeError(
"Type Mismatch: can't convert int to boolean.");
case stringType:
try {
return Long.parseLong(this.stringValue);
} catch (final NumberFormatException ex) {
throw new EARuntimeError("Type Mismatch: can't convert "
+ this.stringValue + " to int.");
}
case enumType:
return this.intValue;
default:
throw new EARuntimeError("Unknown type: " + this.expressionType);
}
}
/**
* {@inheritDoc}
*/
@Override
public String toString() {
final StringBuilder result = new StringBuilder();
result.append("[ExpressionValue: ");
result.append("type: ");
result.append(getExpressionType().toString());
result.append(", String Value: ");
result.append(toStringValue());
result.append("]");
return result.toString();
}
/**
* @return The value as a string, or type mismatch if conversion is not
* possible.
*/
public String toStringValue() {
switch (this.expressionType) {
case intType:
return "" + this.intValue;
case floatingType:
return "" + this.floatValue;
case booleanType:
return "" + this.boolValue;
case stringType:
return this.stringValue;
case enumType:
return "[" + this.enumType + ":" + this.intValue + "]";
default:
throw new EARuntimeError("Unknown type: " + this.expressionType);
}
}
}