1bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2008 The Guava Authors
3bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor *
4bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Licensed under the Apache License, Version 2.0 (the "License");
5bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * you may not use this file except in compliance with the License.
6bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * You may obtain a copy of the License at
7bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor *
8bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * http://www.apache.org/licenses/LICENSE-2.0
9bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor *
10bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Unless required by applicable law or agreed to in writing, software
11bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * distributed under the License is distributed on an "AS IS" BASIS,
12bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * See the License for the specific language governing permissions and
14bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * limitations under the License.
15bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */
16bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
17bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorpackage com.google.common.primitives;
18bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.Preconditions.checkArgument;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.Preconditions.checkElementIndex;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.Preconditions.checkNotNull;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.Preconditions.checkPositionIndexes;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.Beta;
25bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport com.google.common.annotations.GwtCompatible;
26bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport com.google.common.annotations.GwtIncompatible;
27bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
28bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.io.Serializable;
29bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.util.AbstractList;
30bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.util.Arrays;
31bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.util.Collection;
32bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.util.Collections;
33bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.util.Comparator;
34bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.util.List;
35bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.util.RandomAccess;
36bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport javax.annotation.CheckForNull;
38bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
39bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor/**
40bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Static utility methods pertaining to {@code int} primitives, that are not
41bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * already found in either {@link Integer} or {@link Arrays}.
42bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor *
43bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @author Kevin Bourrillion
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 1.0
45bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true)
47bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorpublic final class Ints {
48bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  private Ints() {}
49bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
50bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
51bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * The number of bytes required to represent a primitive {@code int}
52bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * value.
53bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
54bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  public static final int BYTES = Integer.SIZE / Byte.SIZE;
55bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
56bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * The largest power of two that can be represented as an {@code int}.
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 10.0
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static final int MAX_POWER_OF_TWO = 1 << (Integer.SIZE - 2);
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
64bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Returns a hash code for {@code value}; equal to the result of invoking
65bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * {@code ((Integer) value).hashCode()}.
66bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
67bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param value a primitive {@code int} value
68bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @return a hash code for the value
69bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
70bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  public static int hashCode(int value) {
71bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    return value;
72bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
73bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
74bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
75bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Returns the {@code int} value that is equal to {@code value}, if possible.
76bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
77bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param value any value in the range of the {@code int} type
78bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @return the {@code int} value that equals {@code value}
79bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @throws IllegalArgumentException if {@code value} is greater than {@link
80bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *     Integer#MAX_VALUE} or less than {@link Integer#MIN_VALUE}
81bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
82bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  public static int checkedCast(long value) {
83bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    int result = (int) value;
84bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    checkArgument(result == value, "Out of range: %s", value);
85bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    return result;
86bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
87bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
88bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
89bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Returns the {@code int} nearest in value to {@code value}.
90bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
91bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param value any {@code long} value
92bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @return the same value cast to {@code int} if it is in the range of the
93bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *     {@code int} type, {@link Integer#MAX_VALUE} if it is too large,
94bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *     or {@link Integer#MIN_VALUE} if it is too small
95bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
96bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  public static int saturatedCast(long value) {
97bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    if (value > Integer.MAX_VALUE) {
98bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      return Integer.MAX_VALUE;
99bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
100bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    if (value < Integer.MIN_VALUE) {
101bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      return Integer.MIN_VALUE;
102bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
103bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    return (int) value;
104bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
105bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
106bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
107bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Compares the two specified {@code int} values. The sign of the value
108bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * returned is the same as that of {@code ((Integer) a).compareTo(b)}.
109bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
110bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param a the first {@code int} to compare
111bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param b the second {@code int} to compare
112bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @return a negative value if {@code a} is less than {@code b}; a positive
113bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *     value if {@code a} is greater than {@code b}; or zero if they are equal
114bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
115bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  public static int compare(int a, int b) {
116bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    return (a < b) ? -1 : ((a > b) ? 1 : 0);
117bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
118bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
119bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
120bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Returns {@code true} if {@code target} is present as an element anywhere in
121bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * {@code array}.
122bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
123bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param array an array of {@code int} values, possibly empty
124bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param target a primitive {@code int} value
125bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @return {@code true} if {@code array[i] == target} for some value of {@code
126bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *     i}
127bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
128bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  public static boolean contains(int[] array, int target) {
129bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    for (int value : array) {
130bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      if (value == target) {
131bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        return true;
132bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      }
133bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
134bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    return false;
135bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
136bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
137bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
138bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Returns the index of the first appearance of the value {@code target} in
139bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * {@code array}.
140bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
141bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param array an array of {@code int} values, possibly empty
142bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param target a primitive {@code int} value
143bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @return the least index {@code i} for which {@code array[i] == target}, or
144bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *     {@code -1} if no such index exists.
145bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
146bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  public static int indexOf(int[] array, int target) {
147bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    return indexOf(array, target, 0, array.length);
148bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
149bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // TODO(kevinb): consider making this public
151bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  private static int indexOf(
152bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      int[] array, int target, int start, int end) {
153bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    for (int i = start; i < end; i++) {
154bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      if (array[i] == target) {
155bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        return i;
156bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      }
157bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
158bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    return -1;
159bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
160bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
161bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
162bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Returns the start position of the first occurrence of the specified {@code
163bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * target} within {@code array}, or {@code -1} if there is no such occurrence.
164bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
165bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * <p>More formally, returns the lowest index {@code i} such that {@code
166bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * java.util.Arrays.copyOfRange(array, i, i + target.length)} contains exactly
167bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * the same elements as {@code target}.
168bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
169bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param array the array to search for the sequence {@code target}
170bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param target the array to search for as a sub-sequence of {@code array}
171bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
172bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  public static int indexOf(int[] array, int[] target) {
173bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    checkNotNull(array, "array");
174bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    checkNotNull(target, "target");
175bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    if (target.length == 0) {
176bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      return 0;
177bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
178bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
179bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    outer:
180bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    for (int i = 0; i < array.length - target.length + 1; i++) {
181bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      for (int j = 0; j < target.length; j++) {
182bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        if (array[i + j] != target[j]) {
183bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor          continue outer;
184bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        }
185bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      }
186bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      return i;
187bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
188bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    return -1;
189bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
190bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
191bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
192bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Returns the index of the last appearance of the value {@code target} in
193bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * {@code array}.
194bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
195bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param array an array of {@code int} values, possibly empty
196bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param target a primitive {@code int} value
197bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @return the greatest index {@code i} for which {@code array[i] == target},
198bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *     or {@code -1} if no such index exists.
199bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
200bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  public static int lastIndexOf(int[] array, int target) {
201bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    return lastIndexOf(array, target, 0, array.length);
202bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
203bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // TODO(kevinb): consider making this public
205bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  private static int lastIndexOf(
206bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      int[] array, int target, int start, int end) {
207bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    for (int i = end - 1; i >= start; i--) {
208bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      if (array[i] == target) {
209bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        return i;
210bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      }
211bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
212bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    return -1;
213bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
214bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
215bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
216bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Returns the least value present in {@code array}.
217bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
218bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param array a <i>nonempty</i> array of {@code int} values
219bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @return the value present in {@code array} that is less than or equal to
220bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *     every other value in the array
221bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @throws IllegalArgumentException if {@code array} is empty
222bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
223bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  public static int min(int... array) {
224bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    checkArgument(array.length > 0);
225bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    int min = array[0];
226bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    for (int i = 1; i < array.length; i++) {
227bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      if (array[i] < min) {
228bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        min = array[i];
229bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      }
230bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
231bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    return min;
232bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
233bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
234bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
235bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Returns the greatest value present in {@code array}.
236bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
237bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param array a <i>nonempty</i> array of {@code int} values
238bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @return the value present in {@code array} that is greater than or equal to
239bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *     every other value in the array
240bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @throws IllegalArgumentException if {@code array} is empty
241bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
242bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  public static int max(int... array) {
243bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    checkArgument(array.length > 0);
244bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    int max = array[0];
245bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    for (int i = 1; i < array.length; i++) {
246bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      if (array[i] > max) {
247bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        max = array[i];
248bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      }
249bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
250bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    return max;
251bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
252bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
253bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
254bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Returns the values from each provided array combined into a single array.
255bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * For example, {@code concat(new int[] {a, b}, new int[] {}, new
256bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * int[] {c}} returns the array {@code {a, b, c}}.
257bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
258bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param arrays zero or more {@code int} arrays
259bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @return a single array containing all the values from the source arrays, in
260bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *     order
261bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
262bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  public static int[] concat(int[]... arrays) {
263bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    int length = 0;
264bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    for (int[] array : arrays) {
265bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      length += array.length;
266bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
267bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    int[] result = new int[length];
268bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    int pos = 0;
269bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    for (int[] array : arrays) {
270bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      System.arraycopy(array, 0, result, pos, array.length);
271bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      pos += array.length;
272bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
273bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    return result;
274bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
275bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
276bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
277bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Returns a big-endian representation of {@code value} in a 4-element byte
278bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * array; equivalent to {@code ByteBuffer.allocate(4).putInt(value).array()}.
279bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * For example, the input value {@code 0x12131415} would yield the byte array
280bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * {@code {0x12, 0x13, 0x14, 0x15}}.
281bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
282bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * <p>If you need to convert and concatenate several values (possibly even of
283bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * different types), use a shared {@link java.nio.ByteBuffer} instance, or use
284bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * {@link com.google.common.io.ByteStreams#newDataOutput()} to get a growable
285bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * buffer.
286bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
287bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  @GwtIncompatible("doesn't work")
288bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  public static byte[] toByteArray(int value) {
289bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    return new byte[] {
290bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        (byte) (value >> 24),
291bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        (byte) (value >> 16),
292bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        (byte) (value >> 8),
293bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        (byte) value};
294bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
295bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
296bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
297bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Returns the {@code int} value whose big-endian representation is stored in
298bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * the first 4 bytes of {@code bytes}; equivalent to {@code
299bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * ByteBuffer.wrap(bytes).getInt()}. For example, the input byte array {@code
300bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * {0x12, 0x13, 0x14, 0x15, 0x33}} would yield the {@code int} value {@code
301bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * 0x12131415}.
302bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
303bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * <p>Arguably, it's preferable to use {@link java.nio.ByteBuffer}; that
304bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * library exposes much more flexibility at little cost in readability.
305bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
306bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @throws IllegalArgumentException if {@code bytes} has fewer than 4 elements
307bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
308bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  @GwtIncompatible("doesn't work")
309bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  public static int fromByteArray(byte[] bytes) {
310bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    checkArgument(bytes.length >= BYTES,
311bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        "array too small: %s < %s", bytes.length, BYTES);
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return fromBytes(bytes[0], bytes[1], bytes[2], bytes[3]);
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the {@code int} value whose byte representation is the given 4
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * bytes, in big-endian order; equivalent to {@code Ints.fromByteArray(new
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * byte[] {b1, b2, b3, b4})}.
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 7.0
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("doesn't work")
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static int fromBytes(byte b1, byte b2, byte b3, byte b4) {
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return b1 << 24 | (b2 & 0xFF) << 16 | (b3 & 0xFF) << 8 | (b4 & 0xFF);
325bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
326bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
327bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
328bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Returns an array containing the same values as {@code array}, but
329bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * guaranteed to be of a specified minimum length. If {@code array} already
330bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * has a length of at least {@code minLength}, it is returned directly.
331bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Otherwise, a new array of size {@code minLength + padding} is returned,
332bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * containing the values of {@code array}, and zeroes in the remaining places.
333bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
334bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param array the source array
335bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param minLength the minimum length the returned array must guarantee
336bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param padding an extra amount to "grow" the array by if growth is
337bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *     necessary
338bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @throws IllegalArgumentException if {@code minLength} or {@code padding} is
339bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *     negative
340bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @return an array containing the values of {@code array}, with guaranteed
341bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *     minimum length {@code minLength}
342bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
343bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  public static int[] ensureCapacity(
344bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      int[] array, int minLength, int padding) {
345bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    checkArgument(minLength >= 0, "Invalid minLength: %s", minLength);
346bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    checkArgument(padding >= 0, "Invalid padding: %s", padding);
347bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    return (array.length < minLength)
348bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        ? copyOf(array, minLength + padding)
349bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        : array;
350bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
351bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
352bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  // Arrays.copyOf() requires Java 6
353bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  private static int[] copyOf(int[] original, int length) {
354bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    int[] copy = new int[length];
355bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    System.arraycopy(original, 0, copy, 0, Math.min(original.length, length));
356bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    return copy;
357bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
358bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
359bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
360bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Returns a string containing the supplied {@code int} values separated
361bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * by {@code separator}. For example, {@code join("-", 1, 2, 3)} returns
362bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * the string {@code "1-2-3"}.
363bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
364bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param separator the text that should appear between consecutive values in
365bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *     the resulting string (but not at the start or end)
366bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param array an array of {@code int} values, possibly empty
367bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
368bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  public static String join(String separator, int... array) {
369bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    checkNotNull(separator);
370bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    if (array.length == 0) {
371bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      return "";
372bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
373bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
374bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    // For pre-sizing a builder, just get the right order of magnitude
375bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    StringBuilder builder = new StringBuilder(array.length * 5);
376bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    builder.append(array[0]);
377bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    for (int i = 1; i < array.length; i++) {
378bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      builder.append(separator).append(array[i]);
379bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
380bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    return builder.toString();
381bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
382bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
383bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
384bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Returns a comparator that compares two {@code int} arrays
385bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * lexicographically. That is, it compares, using {@link
386bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * #compare(int, int)}), the first pair of values that follow any
387bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * common prefix, or when one array is a prefix of the other, treats the
388bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * shorter array as the lesser. For example, {@code [] < [1] < [1, 2] < [2]}.
389bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
390bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * <p>The returned comparator is inconsistent with {@link
391bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Object#equals(Object)} (since arrays support only identity equality), but
392bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * it is consistent with {@link Arrays#equals(int[], int[])}.
393bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
394bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @see <a href="http://en.wikipedia.org/wiki/Lexicographical_order">
3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *     Lexicographical order article at Wikipedia</a>
3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 2.0
397bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
398bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  public static Comparator<int[]> lexicographicalComparator() {
399bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    return LexicographicalComparator.INSTANCE;
400bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
401bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
402bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  private enum LexicographicalComparator implements Comparator<int[]> {
403bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    INSTANCE;
404bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
406bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    public int compare(int[] left, int[] right) {
407bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      int minLength = Math.min(left.length, right.length);
408bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      for (int i = 0; i < minLength; i++) {
409bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        int result = Ints.compare(left[i], right[i]);
410bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        if (result != 0) {
411bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor          return result;
412bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        }
413bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      }
414bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      return left.length - right.length;
415bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
416bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
417bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
418bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
419bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Copies a collection of {@code Integer} instances into a new array of
420bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * primitive {@code int} values.
421bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
422bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * <p>Elements are copied from the argument collection as if by {@code
423bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * collection.toArray()}.  Calling this method is as thread-safe as calling
424bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * that method.
425bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
426bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param collection a collection of {@code Integer} objects
427bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @return an array containing the same values as {@code collection}, in the
428bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *     same order, converted to primitives
429bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @throws NullPointerException if {@code collection} or any of its elements
430bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *     is null
431bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
432bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  public static int[] toArray(Collection<Integer> collection) {
433bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    if (collection instanceof IntArrayAsList) {
434bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      return ((IntArrayAsList) collection).toIntArray();
435bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
436bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
437bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    Object[] boxedArray = collection.toArray();
438bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    int len = boxedArray.length;
439bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    int[] array = new int[len];
440bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    for (int i = 0; i < len; i++) {
4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // checkNotNull for GWT (do not optimize)
4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      array[i] = (Integer) checkNotNull(boxedArray[i]);
443bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
444bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    return array;
445bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
446bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
447bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
448bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Returns a fixed-size list backed by the specified array, similar to {@link
449bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Arrays#asList(Object[])}. The list supports {@link List#set(int, Object)},
450bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * but any attempt to set a value to {@code null} will result in a {@link
451bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * NullPointerException}.
452bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
453bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * <p>The returned list maintains the values, but not the identities, of
454bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * {@code Integer} objects written to or read from it.  For example, whether
455bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * {@code list.get(0) == list.get(0)} is true for the returned list is
456bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * unspecified.
457bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
458bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param backingArray the array to back the list
459bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @return a list view of the array
460bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
461bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  public static List<Integer> asList(int... backingArray) {
462bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    if (backingArray.length == 0) {
463bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      return Collections.emptyList();
464bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
465bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    return new IntArrayAsList(backingArray);
466bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
467bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
468bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  @GwtCompatible
469bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  private static class IntArrayAsList extends AbstractList<Integer>
470bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      implements RandomAccess, Serializable {
471bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    final int[] array;
472bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    final int start;
473bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    final int end;
474bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
475bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    IntArrayAsList(int[] array) {
476bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      this(array, 0, array.length);
477bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
478bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
479bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    IntArrayAsList(int[] array, int start, int end) {
480bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      this.array = array;
481bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      this.start = start;
482bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      this.end = end;
483bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
484bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
485bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    @Override public int size() {
486bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      return end - start;
487bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
488bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
489bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    @Override public boolean isEmpty() {
490bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      return false;
491bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
492bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
493bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    @Override public Integer get(int index) {
494bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      checkElementIndex(index, size());
495bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      return array[start + index];
496bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
497bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
498bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    @Override public boolean contains(Object target) {
499bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      // Overridden to prevent a ton of boxing
500bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      return (target instanceof Integer)
501bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor          && Ints.indexOf(array, (Integer) target, start, end) != -1;
502bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
503bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
504bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    @Override public int indexOf(Object target) {
505bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      // Overridden to prevent a ton of boxing
506bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      if (target instanceof Integer) {
507bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        int i = Ints.indexOf(array, (Integer) target, start, end);
508bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        if (i >= 0) {
509bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor          return i - start;
510bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        }
511bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      }
512bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      return -1;
513bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
514bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
515bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    @Override public int lastIndexOf(Object target) {
516bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      // Overridden to prevent a ton of boxing
517bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      if (target instanceof Integer) {
518bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        int i = Ints.lastIndexOf(array, (Integer) target, start, end);
519bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        if (i >= 0) {
520bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor          return i - start;
521bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        }
522bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      }
523bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      return -1;
524bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
525bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
526bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    @Override public Integer set(int index, Integer element) {
527bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      checkElementIndex(index, size());
528bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      int oldValue = array[start + index];
5291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      array[start + index] = checkNotNull(element);  // checkNotNull for GWT (do not optimize)
530bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      return oldValue;
531bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
532bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
5331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public List<Integer> subList(int fromIndex, int toIndex) {
534bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      int size = size();
535bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      checkPositionIndexes(fromIndex, toIndex, size);
536bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      if (fromIndex == toIndex) {
537bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        return Collections.emptyList();
538bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      }
539bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      return new IntArrayAsList(array, start + fromIndex, start + toIndex);
540bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
541bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
542bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    @Override public boolean equals(Object object) {
543bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      if (object == this) {
544bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        return true;
545bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      }
546bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      if (object instanceof IntArrayAsList) {
547bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        IntArrayAsList that = (IntArrayAsList) object;
548bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        int size = size();
549bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        if (that.size() != size) {
550bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor          return false;
551bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        }
552bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        for (int i = 0; i < size; i++) {
553bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor          if (array[start + i] != that.array[that.start + i]) {
554bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor            return false;
555bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor          }
556bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        }
557bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        return true;
558bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      }
559bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      return super.equals(object);
560bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
561bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
562bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    @Override public int hashCode() {
563bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      int result = 1;
564bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      for (int i = start; i < end; i++) {
565bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        result = 31 * result + Ints.hashCode(array[i]);
566bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      }
567bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      return result;
568bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
569bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
570bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    @Override public String toString() {
571bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      StringBuilder builder = new StringBuilder(size() * 5);
572bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      builder.append('[').append(array[start]);
573bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      for (int i = start + 1; i < end; i++) {
574bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        builder.append(", ").append(array[i]);
575bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      }
576bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      return builder.append(']').toString();
577bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
578bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
579bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    int[] toIntArray() {
580bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      // Arrays.copyOfRange() requires Java 6
581bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      int size = size();
582bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      int[] result = new int[size];
583bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      System.arraycopy(array, start, result, 0, size);
584bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      return result;
585bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
586bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
587bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    private static final long serialVersionUID = 0;
588bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
5891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
5911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Parses the specified string as a signed decimal integer value. The ASCII
5921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * character {@code '-'} (<code>'&#92;u002D'</code>) is recognized as the
5931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * minus sign.
5941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
5951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Unlike {@link Integer#parseInt(String)}, this method returns
5961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@code null} instead of throwing an exception if parsing fails.
5971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
5981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Note that strings prefixed with ASCII {@code '+'} are rejected, even
5991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * under JDK 7, despite the change to {@link Integer#parseInt(String)} for
6001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * that version.
6011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
6021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @param string the string representation of an integer value
6031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @return the integer value represented by {@code string}, or {@code null} if
6041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *     {@code string} has a length of zero or cannot be parsed as an integer
6051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *     value
6061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 11.0
6071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
6081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Beta
6091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CheckForNull
6101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("TODO")
6111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static Integer tryParse(String string) {
6121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return AndroidInteger.tryParse(string, 10);
6131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
614bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor}
615