11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2011 The Guava Authors
31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
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
61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0
81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
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
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.math.BigInteger;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport javax.annotation.Nullable;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.Beta;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A wrapper class for unsigned {@code int} values, supporting arithmetic operations.
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
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}.
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Louis Wasserman
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 11.0
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@Beta
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true)
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic final class UnsignedInteger extends Number implements Comparable<UnsignedInteger> {
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static final UnsignedInteger ZERO = asUnsigned(0);
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static final UnsignedInteger ONE = asUnsigned(1);
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static final UnsignedInteger MAX_VALUE = asUnsigned(-1);
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private final int value;
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private UnsignedInteger(int value) {
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    this.value = value & 0xffffffff;
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an {@code UnsignedInteger} that, when treated as signed, is
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * equal to {@code value}.
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static UnsignedInteger asUnsigned(int value) {
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new UnsignedInteger(value);
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an {@code UnsignedInteger} that is equal to {@code value},
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * if possible.  The inverse operation of {@link #longValue()}.
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static UnsignedInteger valueOf(long value) {
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkArgument((value & INT_MASK) == value,
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "value (%s) is outside the range for an unsigned integer value", value);
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return asUnsigned((int) value);
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a {@code UnsignedInteger} representing the same value as the specified
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@link BigInteger}. This is the inverse operation of {@link #bigIntegerValue()}.
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws IllegalArgumentException if {@code value} is negative or {@code value >= 2^32}
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static UnsignedInteger valueOf(BigInteger value) {
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkNotNull(value);
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkArgument(value.signum() >= 0 && value.bitLength() <= Integer.SIZE,
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "value (%s) is outside the range for an unsigned integer value", value);
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return asUnsigned(value.intValue());
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an {@code UnsignedInteger} holding the value of the specified {@code String}, parsed
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * as an unsigned {@code int} value.
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws NumberFormatException if the string does not contain a parsable unsigned {@code int}
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *         value
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static UnsignedInteger valueOf(String string) {
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return valueOf(string, 10);
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an {@code UnsignedInteger} holding the value of the specified {@code String}, parsed
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * as an unsigned {@code int} value in the specified radix.
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws NumberFormatException if the string does not contain a parsable unsigned {@code int}
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *         value
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static UnsignedInteger valueOf(String string, int radix) {
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return asUnsigned(UnsignedInts.parseUnsignedInt(string, radix));
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the result of adding this and {@code val}. If the result would have more than 32 bits,
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * returns the low 32 bits of the result.
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public UnsignedInteger add(UnsignedInteger val) {
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkNotNull(val);
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return asUnsigned(this.value + val.value);
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the result of subtracting this and {@code val}. If the result would be negative,
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * returns the low 32 bits of the result.
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public UnsignedInteger subtract(UnsignedInteger val) {
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkNotNull(val);
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return asUnsigned(this.value - val.value);
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the result of multiplying this and {@code val}. If the result would have more than 32
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * bits, returns the low 32 bits of the result.
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Does not truncate correctly")
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public UnsignedInteger multiply(UnsignedInteger val) {
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkNotNull(val);
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return asUnsigned(value * val.value);
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the result of dividing this by {@code val}.
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public UnsignedInteger divide(UnsignedInteger val) {
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkNotNull(val);
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return asUnsigned(UnsignedInts.divide(value, val.value));
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the remainder of dividing this by {@code val}.
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public UnsignedInteger remainder(UnsignedInteger val) {
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkNotNull(val);
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return asUnsigned(UnsignedInts.remainder(value, val.value));
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the value of this {@code UnsignedInteger} as an {@code int}. This is an inverse
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * operation to {@link #asUnsigned}.
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Note that if this {@code UnsignedInteger} holds a value {@code >= 2^31}, the returned value
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * will be equal to {@code this - 2^32}.
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public int intValue() {
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return value;
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the value of this {@code UnsignedInteger} as a {@code long}.
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public long longValue() {
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return toLong(value);
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the value of this {@code UnsignedInteger} as a {@code float}, analogous to a widening
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * primitive conversion from {@code int} to {@code float}, and correctly rounded.
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public float floatValue() {
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return longValue();
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the value of this {@code UnsignedInteger} as a {@code float}, analogous to a widening
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * primitive conversion from {@code int} to {@code double}, and correctly rounded.
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public double doubleValue() {
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return longValue();
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the value of this {@code UnsignedInteger} as a {@link BigInteger}.
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public BigInteger bigIntegerValue() {
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return BigInteger.valueOf(longValue());
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Compares this unsigned integer to another unsigned integer.
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns {@code 0} if they are equal, a negative number if {@code this < other},
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * and a positive number if {@code this > other}.
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public int compareTo(UnsignedInteger other) {
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkNotNull(other);
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return compare(value, other.value);
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public int hashCode() {
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return value;
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public boolean equals(@Nullable Object obj) {
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (obj instanceof UnsignedInteger) {
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      UnsignedInteger other = (UnsignedInteger) obj;
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return value == other.value;
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return false;
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a string representation of the {@code UnsignedInteger} value, in base 10.
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public String toString() {
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return toString(10);
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a string representation of the {@code UnsignedInteger} value, in base {@code radix}.
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * If {@code radix < Character.MIN_RADIX} or {@code radix > Character.MAX_RADIX}, the radix
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@code 10} is used.
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public String toString(int radix) {
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return UnsignedInts.toString(value, radix);
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
237