11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2011 The Guava Authors
37dd252788645e940eada959bdde927426e2531c9Paul Duffin *
41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * in compliance with the License. You may obtain a copy of the License at
67dd252788645e940eada959bdde927426e2531c9Paul Duffin *
71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0
87dd252788645e940eada959bdde927426e2531c9Paul Duffin *
91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software distributed under the
101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * express or implied. See the License for the specific language governing permissions and
121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License.
131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.primitives;
161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.Preconditions.checkArgument;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.Preconditions.checkNotNull;
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.primitives.UnsignedInts.INT_MASK;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.primitives.UnsignedInts.compare;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.primitives.UnsignedInts.toLong;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
23dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffinimport com.google.common.annotations.GwtCompatible;
24dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffinimport com.google.common.annotations.GwtIncompatible;
25dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin
267dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.math.BigInteger;
277dd252788645e940eada959bdde927426e2531c9Paul Duffin
287dd252788645e940eada959bdde927426e2531c9Paul Duffinimport javax.annotation.CheckReturnValue;
297dd252788645e940eada959bdde927426e2531c9Paul Duffinimport javax.annotation.Nullable;
307dd252788645e940eada959bdde927426e2531c9Paul Duffin
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A wrapper class for unsigned {@code int} values, supporting arithmetic operations.
337dd252788645e940eada959bdde927426e2531c9Paul Duffin *
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>In some cases, when speed is more important than code readability, it may be faster simply to
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * treat primitive {@code int} values as unsigned, using the methods from {@link UnsignedInts}.
367dd252788645e940eada959bdde927426e2531c9Paul Duffin *
377dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p>See the Guava User Guide article on <a href=
387dd252788645e940eada959bdde927426e2531c9Paul Duffin * "http://code.google.com/p/guava-libraries/wiki/PrimitivesExplained#Unsigned_support">
397dd252788645e940eada959bdde927426e2531c9Paul Duffin * unsigned primitive utilities</a>.
407dd252788645e940eada959bdde927426e2531c9Paul Duffin *
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Louis Wasserman
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 11.0
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true)
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic final class UnsignedInteger extends Number implements Comparable<UnsignedInteger> {
460888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static final UnsignedInteger ZERO = fromIntBits(0);
470888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static final UnsignedInteger ONE = fromIntBits(1);
480888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static final UnsignedInteger MAX_VALUE = fromIntBits(-1);
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private final int value;
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private UnsignedInteger(int value) {
537dd252788645e940eada959bdde927426e2531c9Paul Duffin    // GWT doesn't consistently overflow values to make them 32-bit, so we need to force it.
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    this.value = value & 0xffffffff;
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
587dd252788645e940eada959bdde927426e2531c9Paul Duffin   * Returns an {@code UnsignedInteger} corresponding to a given bit representation.
597dd252788645e940eada959bdde927426e2531c9Paul Duffin   * The argument is interpreted as an unsigned 32-bit value. Specifically, the sign bit
607dd252788645e940eada959bdde927426e2531c9Paul Duffin   * of {@code bits} is interpreted as a normal bit, and all other bits are treated as usual.
617dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
627dd252788645e940eada959bdde927426e2531c9Paul Duffin   * <p>If the argument is nonnegative, the returned result will be equal to {@code bits},
637dd252788645e940eada959bdde927426e2531c9Paul Duffin   * otherwise, the result will be equal to {@code 2^32 + bits}.
647dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
657dd252788645e940eada959bdde927426e2531c9Paul Duffin   * <p>To represent unsigned decimal constants, consider {@link #valueOf(long)} instead.
667dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
677dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @since 14.0
687dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
697dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static UnsignedInteger fromIntBits(int bits) {
707dd252788645e940eada959bdde927426e2531c9Paul Duffin    return new UnsignedInteger(bits);
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an {@code UnsignedInteger} that is equal to {@code value},
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * if possible.  The inverse operation of {@link #longValue()}.
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static UnsignedInteger valueOf(long value) {
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkArgument((value & INT_MASK) == value,
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "value (%s) is outside the range for an unsigned integer value", value);
807dd252788645e940eada959bdde927426e2531c9Paul Duffin    return fromIntBits((int) value);
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a {@code UnsignedInteger} representing the same value as the specified
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@link BigInteger}. This is the inverse operation of {@link #bigIntegerValue()}.
867dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws IllegalArgumentException if {@code value} is negative or {@code value >= 2^32}
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static UnsignedInteger valueOf(BigInteger value) {
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkNotNull(value);
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkArgument(value.signum() >= 0 && value.bitLength() <= Integer.SIZE,
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "value (%s) is outside the range for an unsigned integer value", value);
937dd252788645e940eada959bdde927426e2531c9Paul Duffin    return fromIntBits(value.intValue());
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an {@code UnsignedInteger} holding the value of the specified {@code String}, parsed
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * as an unsigned {@code int} value.
997dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws NumberFormatException if the string does not contain a parsable unsigned {@code int}
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *         value
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static UnsignedInteger valueOf(String string) {
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return valueOf(string, 10);
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an {@code UnsignedInteger} holding the value of the specified {@code String}, parsed
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * as an unsigned {@code int} value in the specified radix.
1107dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws NumberFormatException if the string does not contain a parsable unsigned {@code int}
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *         value
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static UnsignedInteger valueOf(String string, int radix) {
1157dd252788645e940eada959bdde927426e2531c9Paul Duffin    return fromIntBits(UnsignedInts.parseUnsignedInt(string, radix));
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the result of adding this and {@code val}. If the result would have more than 32 bits,
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * returns the low 32 bits of the result.
1217dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
1227dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @since 14.0
1237dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
1247dd252788645e940eada959bdde927426e2531c9Paul Duffin  @CheckReturnValue
1257dd252788645e940eada959bdde927426e2531c9Paul Duffin  public UnsignedInteger plus(UnsignedInteger val) {
1267dd252788645e940eada959bdde927426e2531c9Paul Duffin    return fromIntBits(this.value + checkNotNull(val).value);
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the result of subtracting this and {@code val}. If the result would be negative,
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * returns the low 32 bits of the result.
1327dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
1337dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @since 14.0
1347dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
1357dd252788645e940eada959bdde927426e2531c9Paul Duffin  @CheckReturnValue
1367dd252788645e940eada959bdde927426e2531c9Paul Duffin  public UnsignedInteger minus(UnsignedInteger val) {
1377dd252788645e940eada959bdde927426e2531c9Paul Duffin    return fromIntBits(value - checkNotNull(val).value);
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the result of multiplying this and {@code val}. If the result would have more than 32
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * bits, returns the low 32 bits of the result.
1437dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
1447dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @since 14.0
1457dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
1467dd252788645e940eada959bdde927426e2531c9Paul Duffin  @CheckReturnValue
1477dd252788645e940eada959bdde927426e2531c9Paul Duffin  @GwtIncompatible("Does not truncate correctly")
1487dd252788645e940eada959bdde927426e2531c9Paul Duffin  public UnsignedInteger times(UnsignedInteger val) {
1497dd252788645e940eada959bdde927426e2531c9Paul Duffin    // TODO(user): make this GWT-compatible
1507dd252788645e940eada959bdde927426e2531c9Paul Duffin    return fromIntBits(value * checkNotNull(val).value);
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the result of dividing this by {@code val}.
1557dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
1567dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @throws ArithmeticException if {@code val} is zero
1577dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @since 14.0
1587dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
1597dd252788645e940eada959bdde927426e2531c9Paul Duffin  @CheckReturnValue
1607dd252788645e940eada959bdde927426e2531c9Paul Duffin  public UnsignedInteger dividedBy(UnsignedInteger val) {
1617dd252788645e940eada959bdde927426e2531c9Paul Duffin    return fromIntBits(UnsignedInts.divide(value, checkNotNull(val).value));
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1657dd252788645e940eada959bdde927426e2531c9Paul Duffin   * Returns this mod {@code val}.
1667dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
1677dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @throws ArithmeticException if {@code val} is zero
1687dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @since 14.0
1697dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
1707dd252788645e940eada959bdde927426e2531c9Paul Duffin  @CheckReturnValue
1717dd252788645e940eada959bdde927426e2531c9Paul Duffin  public UnsignedInteger mod(UnsignedInteger val) {
1727dd252788645e940eada959bdde927426e2531c9Paul Duffin    return fromIntBits(UnsignedInts.remainder(value, checkNotNull(val).value));
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the value of this {@code UnsignedInteger} as an {@code int}. This is an inverse
1777dd252788645e940eada959bdde927426e2531c9Paul Duffin   * operation to {@link #fromIntBits}.
1787dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Note that if this {@code UnsignedInteger} holds a value {@code >= 2^31}, the returned value
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * will be equal to {@code this - 2^32}.
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public int intValue() {
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return value;
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the value of this {@code UnsignedInteger} as a {@code long}.
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public long longValue() {
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return toLong(value);
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the value of this {@code UnsignedInteger} as a {@code float}, analogous to a widening
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * primitive conversion from {@code int} to {@code float}, and correctly rounded.
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public float floatValue() {
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return longValue();
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the value of this {@code UnsignedInteger} as a {@code float}, analogous to a widening
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * primitive conversion from {@code int} to {@code double}, and correctly rounded.
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public double doubleValue() {
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return longValue();
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the value of this {@code UnsignedInteger} as a {@link BigInteger}.
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public BigInteger bigIntegerValue() {
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return BigInteger.valueOf(longValue());
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Compares this unsigned integer to another unsigned integer.
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns {@code 0} if they are equal, a negative number if {@code this < other},
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * and a positive number if {@code this > other}.
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2250888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public int compareTo(UnsignedInteger other) {
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkNotNull(other);
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return compare(value, other.value);
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public int hashCode() {
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return value;
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public boolean equals(@Nullable Object obj) {
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (obj instanceof UnsignedInteger) {
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      UnsignedInteger other = (UnsignedInteger) obj;
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return value == other.value;
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return false;
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a string representation of the {@code UnsignedInteger} value, in base 10.
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public String toString() {
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return toString(10);
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a string representation of the {@code UnsignedInteger} value, in base {@code radix}.
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * If {@code radix < Character.MIN_RADIX} or {@code radix > Character.MAX_RADIX}, the radix
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@code 10} is used.
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public String toString(int radix) {
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return UnsignedInts.toString(value, radix);
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
262