/* --------------------------------------------------------- *
* __________ D E L T A S C R I P T *
* (_________() *
* / === / - A fast, dynamic scripting language *
* | == | - Version 4.13.11.0 *
* / === / - Developed by Adam R. Nelson *
* | = = | - 2011-2013 *
* / === / - Distributed under GNU LGPL v3 *
* (________() - http://github.com/ar-nelson/deltascript *
* *
* --------------------------------------------------------- */
package com.sector91.delta.script.objects;
import java.io.ObjectStreamException;
import java.math.BigDecimal;
import java.math.BigInteger;
import com.sector91.delta.script.DScriptContext;
import com.sector91.delta.script.DeltaScript;
import com.sector91.delta.script.NumberTypes;
import com.sector91.delta.script.annotations.DSDynamicField;
import com.sector91.delta.script.annotations.DSInaccessible;
import com.sector91.delta.script.annotations.DSName;
import com.sector91.delta.script.annotations.DSType;
import com.sector91.delta.script.objects.reflect.DS_JavaClass;
/**
* <p>A DeltaScript boolean value, which doubles as a numeric value.</p>
*
* <p>This class is a singleton (actually, two singletons). New instances cannot
* be created; instead, access the existing singletons with
* {@link #box(boolean)} or the constants {@link #TRUE} and {@link #FALSE}.</p>
*
* @author Adam R. Nelson
* @version 4.13.11.0
*/
@DSType("Boolean")
public final class DS_Boolean extends DS_Scalar
{
private static final long serialVersionUID =
DeltaScript.VERSION.majorVersion();
/** The value returned by {@link #getTypeName()}. */
public static final String TYPE_NAME = "Boolean";
/** The singleton DS_Boolean object representing {@code true}. */
@DSInaccessible
public static final DS_Boolean TRUE = new DS_Boolean(true);
/** The singleton DS_Boolean object representing {@code false}. */
@DSInaccessible
public static final DS_Boolean FALSE = new DS_Boolean(false);
private static final DS_JavaClass DSCLASS = DS_JavaClass.fromClass(
DS_Boolean.class);
/**
* <p>Boxes a Java {@code boolean} as a DeltaScript boolean value.</p>
*
* @param value The Java {@code boolean} to box.
* @return The DS_Boolean object representing the given boolean value.
*/
@DSInaccessible
public static final DS_Boolean box(boolean value)
{return value?TRUE:FALSE;}
private final boolean value;
private DS_Boolean(boolean value)
{this.value = value;}
@Override public int compare(DS_Object o)
{
boolean b1 = booleanValue();
boolean b2 = o.booleanValue();
if (b1 == b2) return 0;
else if (b1==true && b2==false) return 1;
else return -1;
}
public Object unbox()
{return value;}
@Override public boolean booleanValue()
{return value;}
public String getTypeName()
{return TYPE_NAME;}
@Override public String toString()
{return value?"true":"false";}
@DSInaccessible
@Override public int getNumberType()
{return NumberTypes.BOOL;}
@DSInaccessible
@Override public DS_Scalar random()
{
if (value) return box(DScriptContext.getContextRandom().nextBoolean());
else return FALSE;
}
@DSInaccessible
@Override public int intValue()
{return value?1:0;}
@DSInaccessible
@Override public long longValue()
{return value?1L:0L;}
@DSInaccessible
@Override public float floatValue()
{return value?1.0f:0.0f;}
@DSInaccessible
@Override public double doubleValue()
{return value?1.0:0.0;}
@DSInaccessible
@Override public BigInteger bigIntegerValue()
{return value?BigInteger.ONE:BigInteger.ZERO;}
@DSInaccessible
@Override public BigDecimal bigDecimalValue()
{return value?BigDecimal.ONE:BigDecimal.ZERO;}
@DSInaccessible
@Override public final boolean isIntegral()
{return true;}
@Override public DS_Object clone() throws CloneNotSupportedException
{return this;}
@Override public int hashCode()
{return value?1:0;}
@DSName({"sgn", "signum"}) @DSDynamicField
@Override public int signum()
{return intValue();}
@DSInaccessible
@Override public DS_Scalar negate()
{
if (value == false)
return this;
else
return ScalarFactory.fromInt(-1);
}
@DSInaccessible
@Override public DS_Scalar absolute()
{return this;}
@DSInaccessible
@Override public DS_Scalar increment(int amount)
{
if (value == false)
return TRUE;
else
return ScalarFactory.fromInt(2);
}
@DSName("floor") @DSDynamicField
@Override public DS_Integer floor()
{return new DS_ShortIntScalar(intValue());}
@DSName("ceil") @DSDynamicField
@Override public DS_Integer ceil()
{return new DS_ShortIntScalar(intValue());}
@DSName("round") @DSDynamicField
@Override public DS_Integer round()
{return new DS_ShortIntScalar(intValue());}
@DSName("sqrt") @DSDynamicField
@Override public DS_Scalar sqrt()
{return this;}
@DSName("infinite") @DSDynamicField
@Override public boolean isInfinite()
{return false;}
@DSName("NaN") @DSDynamicField
@Override public boolean isNaN()
{return false;}
@Override protected DS_JavaClass getDeltaScriptClass()
{return DSCLASS;}
private Object readResolve() throws ObjectStreamException
{
if (value == true)
{
assert(TRUE != null);
return TRUE;
}
else
{
assert(FALSE != null);
return FALSE;
}
}
}