package php.runtime.memory; import php.runtime.Memory; import java.nio.charset.Charset; public class TrueMemory extends Memory { public final static TrueMemory INSTANCE = new TrueMemory(); protected TrueMemory() { super(Type.BOOL); } public static Memory valueOf(boolean value){ return value ? TRUE : FALSE; } public static Memory valueOf(int value){ return value != 0 ? TRUE : FALSE; } public static Memory valueOf(long value){ return value != 0 ? TRUE : FALSE; } public static Memory valueOf(short value){ return value != 0 ? TRUE : FALSE; } public static Memory valueOf(byte value){ return value != 0 ? TRUE : FALSE; } public static Memory valueOf(double value){ return value == 0.0 ? FALSE : TRUE; } public static Memory valueOf(float value){ return value == 0.0f ? FALSE : TRUE; } public static Memory valueOf(String value){ return value == null || value.isEmpty() || "0".equals(value) ? FALSE : TRUE; } public static Memory valueOf(Memory memory){ return memory.toBoolean() ? TRUE : FALSE; } @Override public boolean equal(long value) { return value != 0; } @Override public boolean equal(double value) { return value != 0.0; } @Override public boolean equal(boolean value) { return value; } @Override public boolean equal(String value) { return !value.isEmpty(); } @Override public boolean notEqual(long value) { return value == 0; } @Override public boolean notEqual(double value) { return value == 0.0; } @Override public boolean notEqual(boolean value) { return !value; } @Override public boolean notEqual(String value) { return value.isEmpty(); } @Override public long toLong() { return 1; } @Override public double toDouble() { return 1; } @Override public boolean toBoolean() { return true; } @Override public String toString() { return "1"; } @Override public Memory inc() { return this; } @Override public Memory dec() { return this; } @Override public Memory negative() { return LongMemory.valueOf(-1); } @Override public Memory toNumeric(){ return Memory.CONST_INT_1; } @Override public Memory plus(Memory memory) { switch (memory.type){ case INT: return LongMemory.valueOf(1 + ((LongMemory) memory).value); case DOUBLE: return new DoubleMemory(1 + ((DoubleMemory)memory).value); case REFERENCE: return plus(memory.toValue()); default: return memory.toNumeric().plus(CONST_INT_1); } } @Override public Memory minus(Memory memory) { switch (memory.type){ case INT: return LongMemory.valueOf(1 - ((LongMemory)memory).value); case DOUBLE: return new DoubleMemory(1 - ((DoubleMemory)memory).value); case REFERENCE: return minus(memory.toValue()); case BOOL: return LongMemory.valueOf(1 - memory.toLong()); default: return CONST_INT_1.minus(memory.toNumeric()); } } @Override public Memory mul(Memory memory) { switch (memory.type){ case INT: case DOUBLE: return memory; case REFERENCE: return mul(memory.toValue()); default: return memory.toNumeric(); } } @Override public Memory pow(Memory memory) { switch (memory.type) { case DOUBLE: return Memory.CONST_DOUBLE_1; case REFERENCE: return pow(memory.toImmutable()); default: return Memory.CONST_INT_1; } } @Override public Memory div(Memory memory) { switch (memory.type){ case DOUBLE: return new DoubleMemory(1 / ((DoubleMemory)memory).value); case REFERENCE: return div(memory.toValue()); default: return CONST_INT_1.div(memory.toNumeric()); } } @Override public Memory divRight(boolean value) { if (!value) return CONST_INT_0; else return CONST_INT_1; } @Override public Memory divRight(long value) { if (value == 0) return CONST_INT_0; else return new LongMemory(value); } @Override public Memory divRight(double value) { return new DoubleMemory(value); } @Override public boolean equal(Memory memory) { return memory.toBoolean(); } @Override public boolean notEqual(Memory memory) { return !memory.toBoolean(); } @Override public String concat(Memory memory) { return toString().concat(memory.toString()); } @Override public boolean smaller(Memory memory) { return !memory.toBoolean(); } @Override public boolean smallerEq(Memory memory) { return memory.toBoolean(); } @Override public boolean greater(Memory memory) { switch (memory.type){ case STRING: String str = memory.toString(); if (str.isEmpty()) return true; Memory value = StringMemory.toNumeric(str, true, null); return value != null && 1 > value.toLong(); case REFERENCE: return greater(memory.toValue()); default: return 1 > memory.toLong(); } } @Override public boolean greaterEq(Memory memory) { return 1 >= memory.toLong(); } @Override public Memory minus(long value) { return new LongMemory(1 - value); } @Override public int hashCode(){ return 1; } @Override public byte[] getBinaryBytes(Charset charset) { return new byte[]{ 1 }; } @Override public boolean identical(Memory memory) { return memory.toValue() == TRUE; } @Override public boolean identical(long value) { return false; } @Override public boolean identical(double value) { return false; } @Override public boolean identical(boolean value) { return value; } @Override public boolean identical(String value) { return false; } }