X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.databoard%2Fsrc%2Forg%2Fsimantics%2Fdataboard%2Fprimitives%2FUnsignedShort.java;fp=bundles%2Forg.simantics.databoard%2Fsrc%2Forg%2Fsimantics%2Fdataboard%2Fprimitives%2FUnsignedShort.java;h=158b57bdf4a32a7e1f34aed7455eeb4e22630b3c;hb=969bd23cab98a79ca9101af33334000879fb60c5;hp=0000000000000000000000000000000000000000;hpb=866dba5cd5a3929bbeae85991796acb212338a08;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.databoard/src/org/simantics/databoard/primitives/UnsignedShort.java b/bundles/org.simantics.databoard/src/org/simantics/databoard/primitives/UnsignedShort.java new file mode 100644 index 000000000..158b57bdf --- /dev/null +++ b/bundles/org.simantics.databoard/src/org/simantics/databoard/primitives/UnsignedShort.java @@ -0,0 +1,167 @@ +package org.simantics.databoard.primitives; + + +/** + * Unsigned 16-bit integer value. The value is between 0 and 65535. + * + * @author Toni Kalajainen + */ +public abstract class UnsignedShort extends Number implements Comparable { + + private static final long serialVersionUID = 1L; + + public static final UnsignedShort MIN_VALUE, MAX_VALUE, ZERO; + + static long MASK = 0xFFFFl; + public static final long L_MAX_VALUE = 0xFFFFL; + public static final long L_MIN_VALUE = 0; + + /** Value container */ + int value; + + public static UnsignedShort valueOf(long value) { + if (value>=0 && value=0 && intBitsL_MAX_VALUE ) throw new IllegalArgumentException("Argument is not within range"); + this.value = value; + } + + public Mutable(long value) throws IllegalArgumentException { + if ( valueL_MAX_VALUE ) throw new IllegalArgumentException("Argument is not within range"); + this.value = (int) value; + } + + public Mutable(String stringValue) throws IllegalArgumentException { + long value = Long.parseLong(stringValue); + if ( valueL_MAX_VALUE ) throw new IllegalArgumentException("Argument is not within range"); + this.value = (int) value; + } + + public static UnsignedShort fromBits(int intBits) { + UnsignedShort result = new Mutable(); + result.value = intBits & 0xFFFF; + return result; + } + + public void setBits(int intBits) { + this.value = intBits; + } + + public void setValue(int value) { + if ( valueL_MAX_VALUE ) throw new IllegalArgumentException("Argument is not within range"); + this.value = value; + } + + public void setValue(long value) { + if ( valueL_MAX_VALUE ) throw new IllegalArgumentException("Argument is not within range"); + this.value = (int) value; + } + + } + + public static class Immutable extends UnsignedShort { + + private static final long serialVersionUID = 1L; + + Immutable() {} + + public Immutable(int value) throws IllegalArgumentException { + if ( valueL_MAX_VALUE ) throw new IllegalArgumentException("Argument is not within range"); + this.value = value; + } + + public Immutable(long value) throws IllegalArgumentException { + if ( valueL_MAX_VALUE ) throw new IllegalArgumentException("Argument is not within range"); + this.value = (int) value; + } + + public Immutable(String stringValue) throws IllegalArgumentException { + long value = Long.parseLong(stringValue); + if ( valueL_MAX_VALUE ) throw new IllegalArgumentException("Argument is not within range"); + this.value = (int) value; + } + + public static UnsignedShort fromBits(int intBits) { + UnsignedShort result = new Immutable(); + result.value = intBits & 0xFFFF; + return result; + } + + } + + + public int toBits() { + return value; + } + + @Override + public int intValue() { + return value; + } + + @Override + public long longValue() { + return value & MASK; + } + + @Override + public float floatValue() { + return value & MASK; + } + @Override + public double doubleValue() { + return value & MASK; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) return false; + if (obj == this) return true; + + if (obj instanceof UnsignedShort == false) return false; + UnsignedShort other = (UnsignedShort) obj; + return value == other.value; + } + + @Override + public String toString() { + return Long.toString(value & MASK); + } + + @Override + public int compareTo(Number obj) { + return Long.signum( (value & MASK) - obj.longValue() ); + } + + @Override + public int hashCode() { + return value; + } + + // Initialize Cache + private static int CACHE_SIZE = 16; + private static UnsignedShort.Immutable[] CACHE; + static { + CACHE = new UnsignedShort.Immutable[CACHE_SIZE]; + for (int i=0; i