Быстрый доступ к объекту Value

This commit is contained in:
Victor 2016-02-19 10:31:26 +02:00
parent e947ae01d5
commit 2783417d4b
10 changed files with 40 additions and 17 deletions

View File

@ -72,6 +72,11 @@ public final class ArrayValue implements Value, Iterable<Value> {
elements[index] = value; elements[index] = value;
} }
@Override
public Object raw() {
return elements;
}
@Override @Override
public int asInt() { public int asInt() {
throw new TypeException("Cannot cast array to integer"); throw new TypeException("Cannot cast array to integer");

View File

@ -22,6 +22,11 @@ public final class FunctionValue implements Value {
return Types.FUNCTION; return Types.FUNCTION;
} }
@Override
public Object raw() {
return value;
}
@Override @Override
public int asInt() { public int asInt() {
throw new TypeException("Cannot cast function to integer"); throw new TypeException("Cannot cast function to integer");

View File

@ -45,6 +45,11 @@ public class MapValue implements Value, Iterable<Map.Entry<Value, Value>> {
map.put(key, value); map.put(key, value);
} }
@Override
public Object raw() {
return map;
}
@Override @Override
public int asInt() { public int asInt() {
throw new TypeException("Cannot cast map to integer"); throw new TypeException("Cannot cast map to integer");

View File

@ -25,6 +25,7 @@ public final class NumberValue implements Value {
return Types.NUMBER; return Types.NUMBER;
} }
@Override
public Number raw() { public Number raw() {
return value; return value;
} }

View File

@ -24,6 +24,11 @@ public final class StringValue implements Value {
public int type() { public int type() {
return Types.STRING; return Types.STRING;
} }
@Override
public Object raw() {
return value;
}
@Override @Override
public int asInt() { public int asInt() {

View File

@ -6,6 +6,8 @@ package com.annimon.ownlang.lib;
*/ */
public interface Value extends Comparable<Value> { public interface Value extends Comparable<Value> {
Object raw();
int asInt(); int asInt();
double asNumber(); double asNumber();

View File

@ -26,7 +26,7 @@ public final class json_encode implements Function {
case Types.MAP: case Types.MAP:
return process((MapValue) val); return process((MapValue) val);
case Types.NUMBER: case Types.NUMBER:
return ((NumberValue) val).raw(); return val.raw();
case Types.STRING: case Types.STRING:
return val.asString(); return val.asString();
default: default:

View File

@ -13,7 +13,7 @@ public final class std_sprintf implements Function {
final Object[] values = new Object[args.length - 1]; final Object[] values = new Object[args.length - 1];
for (int i = 1; i < args.length; i++) { for (int i = 1; i < args.length; i++) {
values[i - 1] = (args[i].type() == Types.NUMBER) values[i - 1] = (args[i].type() == Types.NUMBER)
? ((NumberValue) args[i]).raw() ? args[i].raw()
: args[i].asString(); : args[i].asString();
} }
return new StringValue(String.format(format, values)); return new StringValue(String.format(format, values));

View File

@ -101,7 +101,7 @@ public final class BinaryExpression implements Expression {
final Number number1 = value1.raw(); final Number number1 = value1.raw();
if (value2.type() == Types.NUMBER) { if (value2.type() == Types.NUMBER) {
// number1 + number2 // number1 + number2
final Number number2 = ((NumberValue) value2).raw(); final Number number2 = (Number) value2.raw();
if (number1 instanceof Double || number2 instanceof Double) { if (number1 instanceof Double || number2 instanceof Double) {
return new NumberValue(number1.doubleValue() + number2.doubleValue()); return new NumberValue(number1.doubleValue() + number2.doubleValue());
} }
@ -138,7 +138,7 @@ public final class BinaryExpression implements Expression {
final Number number1 = value1.raw(); final Number number1 = value1.raw();
if (value2.type() == Types.NUMBER) { if (value2.type() == Types.NUMBER) {
// number1 - number2 // number1 - number2
final Number number2 = ((NumberValue) value2).raw(); final Number number2 = (Number) value2.raw();
if (number1 instanceof Double || number2 instanceof Double) { if (number1 instanceof Double || number2 instanceof Double) {
return new NumberValue(number1.doubleValue() - number2.doubleValue()); return new NumberValue(number1.doubleValue() - number2.doubleValue());
} }
@ -184,7 +184,7 @@ public final class BinaryExpression implements Expression {
final Number number1 = value1.raw(); final Number number1 = value1.raw();
if (value2.type() == Types.NUMBER) { if (value2.type() == Types.NUMBER) {
// number1 * number2 // number1 * number2
final Number number2 = ((NumberValue) value2).raw(); final Number number2 = (Number) value2.raw();
if (number1 instanceof Double || number2 instanceof Double) { if (number1 instanceof Double || number2 instanceof Double) {
return new NumberValue(number1.doubleValue() * number2.doubleValue()); return new NumberValue(number1.doubleValue() * number2.doubleValue());
} }
@ -221,7 +221,7 @@ public final class BinaryExpression implements Expression {
final Number number1 = value1.raw(); final Number number1 = value1.raw();
if (value2.type() == Types.NUMBER) { if (value2.type() == Types.NUMBER) {
// number1 / number2 // number1 / number2
final Number number2 = ((NumberValue) value2).raw(); final Number number2 = (Number) value2.raw();
if (number1 instanceof Double || number2 instanceof Double) { if (number1 instanceof Double || number2 instanceof Double) {
return new NumberValue(number1.doubleValue() / number2.doubleValue()); return new NumberValue(number1.doubleValue() / number2.doubleValue());
} }
@ -258,7 +258,7 @@ public final class BinaryExpression implements Expression {
final Number number1 = value1.raw(); final Number number1 = value1.raw();
if (value2.type() == Types.NUMBER) { if (value2.type() == Types.NUMBER) {
// number1 % number2 // number1 % number2
final Number number2 = ((NumberValue) value2).raw(); final Number number2 = (Number) value2.raw();
if (number1 instanceof Double || number2 instanceof Double) { if (number1 instanceof Double || number2 instanceof Double) {
return new NumberValue(number1.doubleValue() % number2.doubleValue()); return new NumberValue(number1.doubleValue() % number2.doubleValue());
} }
@ -303,7 +303,7 @@ public final class BinaryExpression implements Expression {
final Number number1 = value1.raw(); final Number number1 = value1.raw();
if (value2.type() == Types.NUMBER) { if (value2.type() == Types.NUMBER) {
// number1 & number2 // number1 & number2
final Number number2 = ((NumberValue) value2).raw(); final Number number2 = (Number) value2.raw();
if (number1 instanceof Long || number2 instanceof Long) { if (number1 instanceof Long || number2 instanceof Long) {
return new NumberValue(number1.longValue() & number2.longValue()); return new NumberValue(number1.longValue() & number2.longValue());
} }
@ -328,7 +328,7 @@ public final class BinaryExpression implements Expression {
final Number number1 = value1.raw(); final Number number1 = value1.raw();
if (value2.type() == Types.NUMBER) { if (value2.type() == Types.NUMBER) {
// number1 | number2 // number1 | number2
final Number number2 = ((NumberValue) value2).raw(); final Number number2 = (Number) value2.raw();
if (number1 instanceof Long || number2 instanceof Long) { if (number1 instanceof Long || number2 instanceof Long) {
return new NumberValue(number1.longValue() | number2.longValue()); return new NumberValue(number1.longValue() | number2.longValue());
} }
@ -353,7 +353,7 @@ public final class BinaryExpression implements Expression {
final Number number1 = value1.raw(); final Number number1 = value1.raw();
if (value2.type() == Types.NUMBER) { if (value2.type() == Types.NUMBER) {
// number1 ^ number2 // number1 ^ number2
final Number number2 = ((NumberValue) value2).raw(); final Number number2 = (Number) value2.raw();
if (number1 instanceof Long || number2 instanceof Long) { if (number1 instanceof Long || number2 instanceof Long) {
return new NumberValue(number1.longValue() ^ number2.longValue()); return new NumberValue(number1.longValue() ^ number2.longValue());
} }
@ -383,7 +383,7 @@ public final class BinaryExpression implements Expression {
final Number number1 = value1.raw(); final Number number1 = value1.raw();
if (value2.type() == Types.NUMBER) { if (value2.type() == Types.NUMBER) {
// number1 << number2 // number1 << number2
final Number number2 = ((NumberValue) value2).raw(); final Number number2 = (Number) value2.raw();
if (number1 instanceof Long || number2 instanceof Long) { if (number1 instanceof Long || number2 instanceof Long) {
return new NumberValue(number1.longValue() << number2.longValue()); return new NumberValue(number1.longValue() << number2.longValue());
} }
@ -408,7 +408,7 @@ public final class BinaryExpression implements Expression {
final Number number1 = value1.raw(); final Number number1 = value1.raw();
if (value2.type() == Types.NUMBER) { if (value2.type() == Types.NUMBER) {
// number1 >> number2 // number1 >> number2
final Number number2 = ((NumberValue) value2).raw(); final Number number2 = (Number) value2.raw();
if (number1 instanceof Long || number2 instanceof Long) { if (number1 instanceof Long || number2 instanceof Long) {
return new NumberValue(number1.longValue() >> number2.longValue()); return new NumberValue(number1.longValue() >> number2.longValue());
} }
@ -433,7 +433,7 @@ public final class BinaryExpression implements Expression {
final Number number1 = value1.raw(); final Number number1 = value1.raw();
if (value2.type() == Types.NUMBER) { if (value2.type() == Types.NUMBER) {
// number1 >>> number2 // number1 >>> number2
final Number number2 = ((NumberValue) value2).raw(); final Number number2 = (Number) value2.raw();
if (number1 instanceof Long || number2 instanceof Long) { if (number1 instanceof Long || number2 instanceof Long) {
return new NumberValue(number1.longValue() >>> number2.longValue()); return new NumberValue(number1.longValue() >>> number2.longValue());
} }

View File

@ -88,7 +88,7 @@ public final class UnaryExpression implements Expression, Statement {
private Value increment(Value value) { private Value increment(Value value) {
if (value.type() == Types.NUMBER) { if (value.type() == Types.NUMBER) {
final Number number = ((NumberValue) value).raw(); final Number number = (Number) value.raw();
if (number instanceof Double) { if (number instanceof Double) {
return new NumberValue(number.doubleValue() + 1); return new NumberValue(number.doubleValue() + 1);
} }
@ -104,7 +104,7 @@ public final class UnaryExpression implements Expression, Statement {
private Value decrement(Value value) { private Value decrement(Value value) {
if (value.type() == Types.NUMBER) { if (value.type() == Types.NUMBER) {
final Number number = ((NumberValue) value).raw(); final Number number = (Number) value.raw();
if (number instanceof Double) { if (number instanceof Double) {
return new NumberValue(number.doubleValue() - 1); return new NumberValue(number.doubleValue() - 1);
} }
@ -124,7 +124,7 @@ public final class UnaryExpression implements Expression, Statement {
return new StringValue(sb.reverse().toString()); return new StringValue(sb.reverse().toString());
} }
if (value.type() == Types.NUMBER) { if (value.type() == Types.NUMBER) {
final Number number = ((NumberValue) value).raw(); final Number number = (Number) value.raw();
if (number instanceof Double) { if (number instanceof Double) {
return new NumberValue(-number.doubleValue()); return new NumberValue(-number.doubleValue());
} }
@ -140,7 +140,7 @@ public final class UnaryExpression implements Expression, Statement {
private Value complement(Value value) { private Value complement(Value value) {
if (value.type() == Types.NUMBER) { if (value.type() == Types.NUMBER) {
final Number number = ((NumberValue) value).raw(); final Number number = (Number) value.raw();
if (number instanceof Long) { if (number instanceof Long) {
return new NumberValue(~number.longValue()); return new NumberValue(~number.longValue());
} }