X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-common%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fcommon%2FUint32.java;h=0818206172c6cdac457d19a2883d7666bae3eda5;hb=1abe337d8a49ae2a8f2a56baa9a1f916cd3bcb00;hp=5dfe09921204c81227709cdd5dd5d439aee40578;hpb=9fe7a6c540a60414cbd5b04a088b5b51a76f0751;p=yangtools.git diff --git a/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/Uint32.java b/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/Uint32.java index 5dfe099212..0818206172 100644 --- a/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/Uint32.java +++ b/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/Uint32.java @@ -14,7 +14,10 @@ import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import com.google.common.primitives.UnsignedInteger; -import org.opendaylight.yangtools.concepts.Immutable; +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.kohsuke.MetaInfServices; +import org.opendaylight.yangtools.concepts.Variant; /** * Dedicated type for YANG's 'type uint32' type. @@ -22,7 +25,25 @@ import org.opendaylight.yangtools.concepts.Immutable; * @author Robert Varga */ @Beta -public class Uint32 extends Number implements Comparable, Immutable { +@NonNullByDefault +public class Uint32 extends Number implements CanonicalValue { + @MetaInfServices(value = CanonicalValueSupport.class) + public static final class Support extends AbstractCanonicalValueSupport { + public Support() { + super(Uint32.class); + } + + @Override + public Variant fromString(final String str) { + try { + return Variant.ofFirst(Uint32.valueOf(str)); + } catch (IllegalArgumentException e) { + return CanonicalValueViolation.variantOf(e); + } + } + } + + private static final CanonicalValueSupport SUPPORT = new Support(); private static final long serialVersionUID = 1L; private static final long MIN_VALUE = 0; private static final long MAX_VALUE = 0xffffffffL; @@ -76,17 +97,20 @@ public class Uint32 extends Number implements Comparable, Immutable { private static Uint32 instanceFor(final int value) { final long longSlot = Integer.toUnsignedLong(value); - if (longSlot >= CACHE.length) { - for (Uint32 c : COMMON) { - if (c.value == value) { - return c; - } - } + return longSlot < CACHE.length ? fromCache((int)longSlot, value) : fromCommon(value); + } - return LRU.getUnchecked(value); + private static Uint32 fromCommon(final int value) { + for (Uint32 c : COMMON) { + if (c.value == value) { + return c; + } } + return LRU.getUnchecked(value); + } - final int slot = (int)longSlot; + private static Uint32 fromCache(final int slot, final int value) { + // FIXME: 4.0.0: use VarHandles here Uint32 ret = CACHE[slot]; if (ret == null) { synchronized (CACHE) { @@ -97,7 +121,6 @@ public class Uint32 extends Number implements Comparable, Immutable { } } } - return ret; } @@ -179,19 +202,29 @@ public class Uint32 extends Number implements Comparable, Immutable { return Integer.compareUnsigned(value, o.value); } + @Override + public final String toCanonicalString() { + return Integer.toUnsignedString(value); + } + + @Override + public final CanonicalValueSupport support() { + return SUPPORT; + } + @Override public final int hashCode() { return Integer.hashCode(value); } @Override - public final boolean equals(final Object obj) { + public final boolean equals(final @Nullable Object obj) { return this == obj || obj instanceof Uint32 && value == ((Uint32)obj).value; } @Override public final String toString() { - return Integer.toUnsignedString(value); + return toCanonicalString(); } private Object readResolve() {