Convert base types to implement CanonicalValue
[yangtools.git] / yang / yang-common / src / main / java / org / opendaylight / yangtools / yang / common / Uint16.java
index 0bf19dbef339527e22b3f09a47ae2d3ccf9efc63..cc28bd1b3ba963663ca53986926a6d1d07231a40 100644 (file)
@@ -10,11 +10,11 @@ package org.opendaylight.yangtools.yang.common;
 import static com.google.common.base.Preconditions.checkArgument;
 
 import com.google.common.annotations.Beta;
-import com.google.common.annotations.VisibleForTesting;
 import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.CacheLoader;
 import com.google.common.cache.LoadingCache;
-import org.opendaylight.yangtools.concepts.Immutable;
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
 
 /**
  * Dedicated type for YANG's 'type uint16' type.
@@ -22,7 +22,20 @@ import org.opendaylight.yangtools.concepts.Immutable;
  * @author Robert Varga
  */
 @Beta
-public final class Uint16 extends Number implements Comparable<Uint16>, Immutable {
+@NonNullByDefault
+public class Uint16 extends Number implements CanonicalValue<Uint16> {
+    private static final class Support extends AbstractCanonicalValueSupport<Uint16> {
+        Support() {
+            super(Uint16.class);
+        }
+
+        @Override
+        public Uint16 fromString(final String str) {
+            return Uint16.valueOf(str);
+        }
+    }
+
+    private static final CanonicalValueSupport<Uint16> SUPPORT = new Support();
     private static final long serialVersionUID = 1L;
     private static final int MIN_VALUE = 0;
     private static final int MAX_VALUE = 65535;
@@ -65,11 +78,14 @@ public final class Uint16 extends Number implements Comparable<Uint16>, Immutabl
 
     private final short value;
 
-    @VisibleForTesting
     Uint16(final short value) {
         this.value = value;
     }
 
+    protected Uint16(final Uint16 other) {
+        this.value = other.value;
+    }
+
     private static Uint16 instanceFor(final short value) {
         final int slot = Short.toUnsignedInt(value);
         if (slot >= CACHE.length) {
@@ -141,53 +157,59 @@ public final class Uint16 extends Number implements Comparable<Uint16>, Immutabl
     }
 
     @Override
-    public short shortValue() {
+    public final short shortValue() {
         return value;
     }
 
     @Override
-    public int intValue() {
+    public final int intValue() {
         return Short.toUnsignedInt(value);
     }
 
     @Override
-    public long longValue() {
+    public final long longValue() {
         return Short.toUnsignedLong(value);
     }
 
     @Override
-    public float floatValue() {
+    public final float floatValue() {
         return intValue();
     }
 
     @Override
-    public double doubleValue() {
+    public final double doubleValue() {
         return intValue();
     }
 
     @Override
     @SuppressWarnings("checkstyle:parameterName")
-    public int compareTo(final Uint16 o) {
+    public final int compareTo(final Uint16 o) {
         return Integer.compare(intValue(), o.intValue());
     }
 
     @Override
-    public int hashCode() {
-        return Short.hashCode(value);
+    public final String toCanonicalString() {
+        return String.valueOf(intValue());
     }
 
     @Override
-    public boolean equals(final Object obj) {
-        if (this == obj) {
-            return true;
-        }
+    public final CanonicalValueSupport<Uint16> support() {
+        return SUPPORT;
+    }
+
+    @Override
+    public final int hashCode() {
+        return Short.hashCode(value);
+    }
 
-        return obj instanceof Uint16 && value == ((Uint16)obj).value;
+    @Override
+    public final boolean equals(final @Nullable Object obj) {
+        return this == obj || obj instanceof Uint16 && value == ((Uint16)obj).value;
     }
 
     @Override
-    public String toString() {
-        return String.valueOf(intValue());
+    public final String toString() {
+        return toCanonicalString();
     }
 
     private Object readResolve() {