10888a09821a98ac0680fad765217302858e70fa4Paul Duffin/*
20888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Copyright (C) 2008 The Guava Authors
30888a09821a98ac0680fad765217302858e70fa4Paul Duffin *
40888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License");
50888a09821a98ac0680fad765217302858e70fa4Paul Duffin * you may not use this file except in compliance with the License.
60888a09821a98ac0680fad765217302858e70fa4Paul Duffin * You may obtain a copy of the License at
70888a09821a98ac0680fad765217302858e70fa4Paul Duffin *
80888a09821a98ac0680fad765217302858e70fa4Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0
90888a09821a98ac0680fad765217302858e70fa4Paul Duffin *
100888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Unless required by applicable law or agreed to in writing, software
110888a09821a98ac0680fad765217302858e70fa4Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS,
120888a09821a98ac0680fad765217302858e70fa4Paul Duffin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130888a09821a98ac0680fad765217302858e70fa4Paul Duffin * See the License for the specific language governing permissions and
140888a09821a98ac0680fad765217302858e70fa4Paul Duffin * limitations under the License.
150888a09821a98ac0680fad765217302858e70fa4Paul Duffin */
160888a09821a98ac0680fad765217302858e70fa4Paul Duffin
170888a09821a98ac0680fad765217302858e70fa4Paul Duffinpackage com.google.common.primitives;
180888a09821a98ac0680fad765217302858e70fa4Paul Duffin
190888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static com.google.common.base.Preconditions.checkArgument;
200888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static com.google.common.base.Preconditions.checkElementIndex;
210888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static com.google.common.base.Preconditions.checkNotNull;
220888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static com.google.common.base.Preconditions.checkPositionIndexes;
230888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static java.lang.Double.NEGATIVE_INFINITY;
240888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static java.lang.Double.POSITIVE_INFINITY;
250888a09821a98ac0680fad765217302858e70fa4Paul Duffin
260888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.annotations.Beta;
270888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.annotations.GwtCompatible;
280888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.base.Converter;
290888a09821a98ac0680fad765217302858e70fa4Paul Duffin
300888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.io.Serializable;
310888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.AbstractList;
320888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Collection;
330888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Collections;
340888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Comparator;
350888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.List;
360888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.RandomAccess;
370888a09821a98ac0680fad765217302858e70fa4Paul Duffin
380888a09821a98ac0680fad765217302858e70fa4Paul Duffin/**
390888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Static utility methods pertaining to {@code double} primitives, that are not
400888a09821a98ac0680fad765217302858e70fa4Paul Duffin * already found in either {@link Double} or {@link Arrays}.
410888a09821a98ac0680fad765217302858e70fa4Paul Duffin *
420888a09821a98ac0680fad765217302858e70fa4Paul Duffin * <p>See the Guava User Guide article on <a href=
430888a09821a98ac0680fad765217302858e70fa4Paul Duffin * "http://code.google.com/p/guava-libraries/wiki/PrimitivesExplained">
440888a09821a98ac0680fad765217302858e70fa4Paul Duffin * primitive utilities</a>.
450888a09821a98ac0680fad765217302858e70fa4Paul Duffin *
460888a09821a98ac0680fad765217302858e70fa4Paul Duffin * @author Kevin Bourrillion
470888a09821a98ac0680fad765217302858e70fa4Paul Duffin * @since 1.0
480888a09821a98ac0680fad765217302858e70fa4Paul Duffin */
490888a09821a98ac0680fad765217302858e70fa4Paul Duffin@GwtCompatible(emulated = true)
500888a09821a98ac0680fad765217302858e70fa4Paul Duffinpublic final class Doubles {
510888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private Doubles() {}
520888a09821a98ac0680fad765217302858e70fa4Paul Duffin
530888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
540888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * The number of bytes required to represent a primitive {@code double}
550888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * value.
560888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
570888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @since 10.0
580888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
590888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static final int BYTES = Double.SIZE / Byte.SIZE;
600888a09821a98ac0680fad765217302858e70fa4Paul Duffin
610888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
620888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Returns a hash code for {@code value}; equal to the result of invoking
630888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * {@code ((Double) value).hashCode()}.
640888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
650888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @param value a primitive {@code double} value
660888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @return a hash code for the value
670888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
680888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static int hashCode(double value) {
690888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return ((Double) value).hashCode();
700888a09821a98ac0680fad765217302858e70fa4Paul Duffin    // TODO(kevinb): do it this way when we can (GWT problem):
710888a09821a98ac0680fad765217302858e70fa4Paul Duffin    // long bits = Double.doubleToLongBits(value);
720888a09821a98ac0680fad765217302858e70fa4Paul Duffin    // return (int) (bits ^ (bits >>> 32));
730888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
740888a09821a98ac0680fad765217302858e70fa4Paul Duffin
750888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
760888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Compares the two specified {@code double} values. The sign of the value
770888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * returned is the same as that of <code>((Double) a).{@linkplain
780888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Double#compareTo compareTo}(b)</code>. As with that method, {@code NaN} is
790888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * treated as greater than all other values, and {@code 0.0 > -0.0}.
800888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
810888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * <p><b>Note:</b> this method simply delegates to the JDK method {@link
820888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Double#compare}. It is provided for consistency with the other primitive
830888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * types, whose compare methods were not added to the JDK until JDK 7.
840888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
850888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @param a the first {@code double} to compare
860888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @param b the second {@code double} to compare
870888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @return a negative value if {@code a} is less than {@code b}; a positive
880888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     value if {@code a} is greater than {@code b}; or zero if they are equal
890888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
900888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static int compare(double a, double b) {
910888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return Double.compare(a, b);
920888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
930888a09821a98ac0680fad765217302858e70fa4Paul Duffin
940888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
950888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Returns {@code true} if {@code value} represents a real number. This is
960888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * equivalent to, but not necessarily implemented as,
970888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * {@code !(Double.isInfinite(value) || Double.isNaN(value))}.
980888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
990888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @since 10.0
1000888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
1010888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static boolean isFinite(double value) {
1020888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return NEGATIVE_INFINITY < value & value < POSITIVE_INFINITY;
1030888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1040888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1050888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
1060888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Returns {@code true} if {@code target} is present as an element anywhere in
1070888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * {@code array}. Note that this always returns {@code false} when {@code
1080888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * target} is {@code NaN}.
1090888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
1100888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @param array an array of {@code double} values, possibly empty
1110888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @param target a primitive {@code double} value
1120888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @return {@code true} if {@code array[i] == target} for some value of {@code
1130888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     i}
1140888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
1150888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static boolean contains(double[] array, double target) {
1160888a09821a98ac0680fad765217302858e70fa4Paul Duffin    for (double value : array) {
1170888a09821a98ac0680fad765217302858e70fa4Paul Duffin      if (value == target) {
1180888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return true;
1190888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
1200888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1210888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return false;
1220888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1230888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1240888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
1250888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Returns the index of the first appearance of the value {@code target} in
1260888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * {@code array}. Note that this always returns {@code -1} when {@code target}
1270888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * is {@code NaN}.
1280888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
1290888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @param array an array of {@code double} values, possibly empty
1300888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @param target a primitive {@code double} value
1310888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @return the least index {@code i} for which {@code array[i] == target}, or
1320888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     {@code -1} if no such index exists.
1330888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
1340888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static int indexOf(double[] array, double target) {
1350888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return indexOf(array, target, 0, array.length);
1360888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1370888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1380888a09821a98ac0680fad765217302858e70fa4Paul Duffin  // TODO(kevinb): consider making this public
1390888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private static int indexOf(
1400888a09821a98ac0680fad765217302858e70fa4Paul Duffin      double[] array, double target, int start, int end) {
1410888a09821a98ac0680fad765217302858e70fa4Paul Duffin    for (int i = start; i < end; i++) {
1420888a09821a98ac0680fad765217302858e70fa4Paul Duffin      if (array[i] == target) {
1430888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return i;
1440888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
1450888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1460888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return -1;
1470888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1480888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1490888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
1500888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Returns the start position of the first occurrence of the specified {@code
1510888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * target} within {@code array}, or {@code -1} if there is no such occurrence.
1520888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
1530888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * <p>More formally, returns the lowest index {@code i} such that {@code
1540888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * java.util.Arrays.copyOfRange(array, i, i + target.length)} contains exactly
1550888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * the same elements as {@code target}.
1560888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
1570888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * <p>Note that this always returns {@code -1} when {@code target} contains
1580888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * {@code NaN}.
1590888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
1600888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @param array the array to search for the sequence {@code target}
1610888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @param target the array to search for as a sub-sequence of {@code array}
1620888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
1630888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static int indexOf(double[] array, double[] target) {
1640888a09821a98ac0680fad765217302858e70fa4Paul Duffin    checkNotNull(array, "array");
1650888a09821a98ac0680fad765217302858e70fa4Paul Duffin    checkNotNull(target, "target");
1660888a09821a98ac0680fad765217302858e70fa4Paul Duffin    if (target.length == 0) {
1670888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return 0;
1680888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1690888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1700888a09821a98ac0680fad765217302858e70fa4Paul Duffin    outer:
1710888a09821a98ac0680fad765217302858e70fa4Paul Duffin    for (int i = 0; i < array.length - target.length + 1; i++) {
1720888a09821a98ac0680fad765217302858e70fa4Paul Duffin      for (int j = 0; j < target.length; j++) {
1730888a09821a98ac0680fad765217302858e70fa4Paul Duffin        if (array[i + j] != target[j]) {
1740888a09821a98ac0680fad765217302858e70fa4Paul Duffin          continue outer;
1750888a09821a98ac0680fad765217302858e70fa4Paul Duffin        }
1760888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
1770888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return i;
1780888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1790888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return -1;
1800888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1810888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1820888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
1830888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Returns the index of the last appearance of the value {@code target} in
1840888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * {@code array}. Note that this always returns {@code -1} when {@code target}
1850888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * is {@code NaN}.
1860888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
1870888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @param array an array of {@code double} values, possibly empty
1880888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @param target a primitive {@code double} value
1890888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @return the greatest index {@code i} for which {@code array[i] == target},
1900888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     or {@code -1} if no such index exists.
1910888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
1920888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static int lastIndexOf(double[] array, double target) {
1930888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return lastIndexOf(array, target, 0, array.length);
1940888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1950888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1960888a09821a98ac0680fad765217302858e70fa4Paul Duffin  // TODO(kevinb): consider making this public
1970888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private static int lastIndexOf(
1980888a09821a98ac0680fad765217302858e70fa4Paul Duffin      double[] array, double target, int start, int end) {
1990888a09821a98ac0680fad765217302858e70fa4Paul Duffin    for (int i = end - 1; i >= start; i--) {
2000888a09821a98ac0680fad765217302858e70fa4Paul Duffin      if (array[i] == target) {
2010888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return i;
2020888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
2030888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
2040888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return -1;
2050888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
2060888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2070888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
2080888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Returns the least value present in {@code array}, using the same rules of
2090888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * comparison as {@link Math#min(double, double)}.
2100888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
2110888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @param array a <i>nonempty</i> array of {@code double} values
2120888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @return the value present in {@code array} that is less than or equal to
2130888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     every other value in the array
2140888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @throws IllegalArgumentException if {@code array} is empty
2150888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
2160888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static double min(double... array) {
2170888a09821a98ac0680fad765217302858e70fa4Paul Duffin    checkArgument(array.length > 0);
2180888a09821a98ac0680fad765217302858e70fa4Paul Duffin    double min = array[0];
2190888a09821a98ac0680fad765217302858e70fa4Paul Duffin    for (int i = 1; i < array.length; i++) {
2200888a09821a98ac0680fad765217302858e70fa4Paul Duffin      min = Math.min(min, array[i]);
2210888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
2220888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return min;
2230888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
2240888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2250888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
2260888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Returns the greatest value present in {@code array}, using the same rules
2270888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * of comparison as {@link Math#max(double, double)}.
2280888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
2290888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @param array a <i>nonempty</i> array of {@code double} values
2300888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @return the value present in {@code array} that is greater than or equal to
2310888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     every other value in the array
2320888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @throws IllegalArgumentException if {@code array} is empty
2330888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
2340888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static double max(double... array) {
2350888a09821a98ac0680fad765217302858e70fa4Paul Duffin    checkArgument(array.length > 0);
2360888a09821a98ac0680fad765217302858e70fa4Paul Duffin    double max = array[0];
2370888a09821a98ac0680fad765217302858e70fa4Paul Duffin    for (int i = 1; i < array.length; i++) {
2380888a09821a98ac0680fad765217302858e70fa4Paul Duffin      max = Math.max(max, array[i]);
2390888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
2400888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return max;
2410888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
2420888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2430888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
2440888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Returns the values from each provided array combined into a single array.
2450888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * For example, {@code concat(new double[] {a, b}, new double[] {}, new
2460888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * double[] {c}} returns the array {@code {a, b, c}}.
2470888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
2480888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @param arrays zero or more {@code double} arrays
2490888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @return a single array containing all the values from the source arrays, in
2500888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     order
2510888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
2520888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static double[] concat(double[]... arrays) {
2530888a09821a98ac0680fad765217302858e70fa4Paul Duffin    int length = 0;
2540888a09821a98ac0680fad765217302858e70fa4Paul Duffin    for (double[] array : arrays) {
2550888a09821a98ac0680fad765217302858e70fa4Paul Duffin      length += array.length;
2560888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
2570888a09821a98ac0680fad765217302858e70fa4Paul Duffin    double[] result = new double[length];
2580888a09821a98ac0680fad765217302858e70fa4Paul Duffin    int pos = 0;
2590888a09821a98ac0680fad765217302858e70fa4Paul Duffin    for (double[] array : arrays) {
2600888a09821a98ac0680fad765217302858e70fa4Paul Duffin      System.arraycopy(array, 0, result, pos, array.length);
2610888a09821a98ac0680fad765217302858e70fa4Paul Duffin      pos += array.length;
2620888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
2630888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return result;
2640888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
2650888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2660888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private static final class DoubleConverter
2670888a09821a98ac0680fad765217302858e70fa4Paul Duffin      extends Converter<String, Double> implements Serializable {
2680888a09821a98ac0680fad765217302858e70fa4Paul Duffin    static final DoubleConverter INSTANCE = new DoubleConverter();
2690888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2700888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
2710888a09821a98ac0680fad765217302858e70fa4Paul Duffin    protected Double doForward(String value) {
2720888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return Double.valueOf(value);
2730888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
2740888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2750888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
2760888a09821a98ac0680fad765217302858e70fa4Paul Duffin    protected String doBackward(Double value) {
2770888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return value.toString();
2780888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
2790888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2800888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
2810888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public String toString() {
2820888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return "Doubles.stringConverter()";
2830888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
2840888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2850888a09821a98ac0680fad765217302858e70fa4Paul Duffin    private Object readResolve() {
2860888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return INSTANCE;
2870888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
2880888a09821a98ac0680fad765217302858e70fa4Paul Duffin    private static final long serialVersionUID = 1;
2890888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
2900888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2910888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
2920888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Returns a serializable converter object that converts between strings and
2930888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * doubles using {@link Double#valueOf} and {@link Double#toString()}.
2940888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
2950888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @since 16.0
2960888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
2970888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Beta
2980888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static Converter<String, Double> stringConverter() {
2990888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return DoubleConverter.INSTANCE;
3000888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
3010888a09821a98ac0680fad765217302858e70fa4Paul Duffin
3020888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
3030888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Returns an array containing the same values as {@code array}, but
3040888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * guaranteed to be of a specified minimum length. If {@code array} already
3050888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * has a length of at least {@code minLength}, it is returned directly.
3060888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Otherwise, a new array of size {@code minLength + padding} is returned,
3070888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * containing the values of {@code array}, and zeroes in the remaining places.
3080888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
3090888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @param array the source array
3100888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @param minLength the minimum length the returned array must guarantee
3110888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @param padding an extra amount to "grow" the array by if growth is
3120888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     necessary
3130888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @throws IllegalArgumentException if {@code minLength} or {@code padding} is
3140888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     negative
3150888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @return an array containing the values of {@code array}, with guaranteed
3160888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     minimum length {@code minLength}
3170888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
3180888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static double[] ensureCapacity(
3190888a09821a98ac0680fad765217302858e70fa4Paul Duffin      double[] array, int minLength, int padding) {
3200888a09821a98ac0680fad765217302858e70fa4Paul Duffin    checkArgument(minLength >= 0, "Invalid minLength: %s", minLength);
3210888a09821a98ac0680fad765217302858e70fa4Paul Duffin    checkArgument(padding >= 0, "Invalid padding: %s", padding);
3220888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return (array.length < minLength)
3230888a09821a98ac0680fad765217302858e70fa4Paul Duffin        ? copyOf(array, minLength + padding)
3240888a09821a98ac0680fad765217302858e70fa4Paul Duffin        : array;
3250888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
3260888a09821a98ac0680fad765217302858e70fa4Paul Duffin
3270888a09821a98ac0680fad765217302858e70fa4Paul Duffin  // Arrays.copyOf() requires Java 6
3280888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private static double[] copyOf(double[] original, int length) {
3290888a09821a98ac0680fad765217302858e70fa4Paul Duffin    double[] copy = new double[length];
3300888a09821a98ac0680fad765217302858e70fa4Paul Duffin    System.arraycopy(original, 0, copy, 0, Math.min(original.length, length));
3310888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return copy;
3320888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
3330888a09821a98ac0680fad765217302858e70fa4Paul Duffin
3340888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
3350888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Returns a string containing the supplied {@code double} values, converted
3360888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * to strings as specified by {@link Double#toString(double)}, and separated
3370888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * by {@code separator}. For example, {@code join("-", 1.0, 2.0, 3.0)} returns
3380888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * the string {@code "1.0-2.0-3.0"}.
3390888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
3400888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * <p>Note that {@link Double#toString(double)} formats {@code double}
3410888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * differently in GWT sometimes.  In the previous example, it returns the
3420888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * string {@code "1-2-3"}.
3430888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
3440888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @param separator the text that should appear between consecutive values in
3450888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     the resulting string (but not at the start or end)
3460888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @param array an array of {@code double} values, possibly empty
3470888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
3480888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static String join(String separator, double... array) {
3490888a09821a98ac0680fad765217302858e70fa4Paul Duffin    checkNotNull(separator);
3500888a09821a98ac0680fad765217302858e70fa4Paul Duffin    if (array.length == 0) {
3510888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return "";
3520888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
3530888a09821a98ac0680fad765217302858e70fa4Paul Duffin
3540888a09821a98ac0680fad765217302858e70fa4Paul Duffin    // For pre-sizing a builder, just get the right order of magnitude
3550888a09821a98ac0680fad765217302858e70fa4Paul Duffin    StringBuilder builder = new StringBuilder(array.length * 12);
3560888a09821a98ac0680fad765217302858e70fa4Paul Duffin    builder.append(array[0]);
3570888a09821a98ac0680fad765217302858e70fa4Paul Duffin    for (int i = 1; i < array.length; i++) {
3580888a09821a98ac0680fad765217302858e70fa4Paul Duffin      builder.append(separator).append(array[i]);
3590888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
3600888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return builder.toString();
3610888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
3620888a09821a98ac0680fad765217302858e70fa4Paul Duffin
3630888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
3640888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Returns a comparator that compares two {@code double} arrays
3650888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * lexicographically. That is, it compares, using {@link
3660888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * #compare(double, double)}), the first pair of values that follow any
3670888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * common prefix, or when one array is a prefix of the other, treats the
3680888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * shorter array as the lesser. For example,
3690888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * {@code [] < [1.0] < [1.0, 2.0] < [2.0]}.
3700888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
3710888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * <p>The returned comparator is inconsistent with {@link
3720888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Object#equals(Object)} (since arrays support only identity equality), but
3730888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * it is consistent with {@link Arrays#equals(double[], double[])}.
3740888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
3750888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @see <a href="http://en.wikipedia.org/wiki/Lexicographical_order">
3760888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     Lexicographical order article at Wikipedia</a>
3770888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @since 2.0
3780888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
3790888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static Comparator<double[]> lexicographicalComparator() {
3800888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return LexicographicalComparator.INSTANCE;
3810888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
3820888a09821a98ac0680fad765217302858e70fa4Paul Duffin
3830888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private enum LexicographicalComparator implements Comparator<double[]> {
3840888a09821a98ac0680fad765217302858e70fa4Paul Duffin    INSTANCE;
3850888a09821a98ac0680fad765217302858e70fa4Paul Duffin
3860888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
3870888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public int compare(double[] left, double[] right) {
3880888a09821a98ac0680fad765217302858e70fa4Paul Duffin      int minLength = Math.min(left.length, right.length);
3890888a09821a98ac0680fad765217302858e70fa4Paul Duffin      for (int i = 0; i < minLength; i++) {
3903ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        int result = Double.compare(left[i], right[i]);
3910888a09821a98ac0680fad765217302858e70fa4Paul Duffin        if (result != 0) {
3920888a09821a98ac0680fad765217302858e70fa4Paul Duffin          return result;
3930888a09821a98ac0680fad765217302858e70fa4Paul Duffin        }
3940888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
3950888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return left.length - right.length;
3960888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
3970888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
3980888a09821a98ac0680fad765217302858e70fa4Paul Duffin
3990888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
4000888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Returns an array containing each value of {@code collection}, converted to
4010888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * a {@code double} value in the manner of {@link Number#doubleValue}.
4020888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
4030888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * <p>Elements are copied from the argument collection as if by {@code
4040888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * collection.toArray()}.  Calling this method is as thread-safe as calling
4050888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * that method.
4060888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
4070888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @param collection a collection of {@code Number} instances
4080888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @return an array containing the same values as {@code collection}, in the
4090888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     same order, converted to primitives
4100888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @throws NullPointerException if {@code collection} or any of its elements
4110888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     is null
4120888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @since 1.0 (parameter was {@code Collection<Double>} before 12.0)
4130888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
4140888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static double[] toArray(Collection<? extends Number> collection) {
4150888a09821a98ac0680fad765217302858e70fa4Paul Duffin    if (collection instanceof DoubleArrayAsList) {
4160888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return ((DoubleArrayAsList) collection).toDoubleArray();
4170888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
4180888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4190888a09821a98ac0680fad765217302858e70fa4Paul Duffin    Object[] boxedArray = collection.toArray();
4200888a09821a98ac0680fad765217302858e70fa4Paul Duffin    int len = boxedArray.length;
4210888a09821a98ac0680fad765217302858e70fa4Paul Duffin    double[] array = new double[len];
4220888a09821a98ac0680fad765217302858e70fa4Paul Duffin    for (int i = 0; i < len; i++) {
4230888a09821a98ac0680fad765217302858e70fa4Paul Duffin      // checkNotNull for GWT (do not optimize)
4240888a09821a98ac0680fad765217302858e70fa4Paul Duffin      array[i] = ((Number) checkNotNull(boxedArray[i])).doubleValue();
4250888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
4260888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return array;
4270888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
4280888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4290888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
4300888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Returns a fixed-size list backed by the specified array, similar to {@link
4310888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Arrays#asList(Object[])}. The list supports {@link List#set(int, Object)},
4320888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * but any attempt to set a value to {@code null} will result in a {@link
4330888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * NullPointerException}.
4340888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
4350888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * <p>The returned list maintains the values, but not the identities, of
4360888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * {@code Double} objects written to or read from it.  For example, whether
4370888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * {@code list.get(0) == list.get(0)} is true for the returned list is
4380888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * unspecified.
4390888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
4400888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * <p>The returned list may have unexpected behavior if it contains {@code
4410888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * NaN}, or if {@code NaN} is used as a parameter to any of its methods.
4420888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
4430888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @param backingArray the array to back the list
4440888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @return a list view of the array
4450888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
4460888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static List<Double> asList(double... backingArray) {
4470888a09821a98ac0680fad765217302858e70fa4Paul Duffin    if (backingArray.length == 0) {
4480888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return Collections.emptyList();
4490888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
4500888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return new DoubleArrayAsList(backingArray);
4510888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
4520888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4530888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtCompatible
4540888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private static class DoubleArrayAsList extends AbstractList<Double>
4550888a09821a98ac0680fad765217302858e70fa4Paul Duffin      implements RandomAccess, Serializable {
4560888a09821a98ac0680fad765217302858e70fa4Paul Duffin    final double[] array;
4570888a09821a98ac0680fad765217302858e70fa4Paul Duffin    final int start;
4580888a09821a98ac0680fad765217302858e70fa4Paul Duffin    final int end;
4590888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4600888a09821a98ac0680fad765217302858e70fa4Paul Duffin    DoubleArrayAsList(double[] array) {
4610888a09821a98ac0680fad765217302858e70fa4Paul Duffin      this(array, 0, array.length);
4620888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
4630888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4640888a09821a98ac0680fad765217302858e70fa4Paul Duffin    DoubleArrayAsList(double[] array, int start, int end) {
4650888a09821a98ac0680fad765217302858e70fa4Paul Duffin      this.array = array;
4660888a09821a98ac0680fad765217302858e70fa4Paul Duffin      this.start = start;
4670888a09821a98ac0680fad765217302858e70fa4Paul Duffin      this.end = end;
4680888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
4690888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4700888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public int size() {
4710888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return end - start;
4720888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
4730888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4740888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public boolean isEmpty() {
4750888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return false;
4760888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
4770888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4780888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public Double get(int index) {
4790888a09821a98ac0680fad765217302858e70fa4Paul Duffin      checkElementIndex(index, size());
4800888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return array[start + index];
4810888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
4820888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4830888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public boolean contains(Object target) {
4840888a09821a98ac0680fad765217302858e70fa4Paul Duffin      // Overridden to prevent a ton of boxing
4850888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return (target instanceof Double)
4860888a09821a98ac0680fad765217302858e70fa4Paul Duffin          && Doubles.indexOf(array, (Double) target, start, end) != -1;
4870888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
4880888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4890888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public int indexOf(Object target) {
4900888a09821a98ac0680fad765217302858e70fa4Paul Duffin      // Overridden to prevent a ton of boxing
4910888a09821a98ac0680fad765217302858e70fa4Paul Duffin      if (target instanceof Double) {
4920888a09821a98ac0680fad765217302858e70fa4Paul Duffin        int i = Doubles.indexOf(array, (Double) target, start, end);
4930888a09821a98ac0680fad765217302858e70fa4Paul Duffin        if (i >= 0) {
4940888a09821a98ac0680fad765217302858e70fa4Paul Duffin          return i - start;
4950888a09821a98ac0680fad765217302858e70fa4Paul Duffin        }
4960888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
4970888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return -1;
4980888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
4990888a09821a98ac0680fad765217302858e70fa4Paul Duffin
5000888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public int lastIndexOf(Object target) {
5010888a09821a98ac0680fad765217302858e70fa4Paul Duffin      // Overridden to prevent a ton of boxing
5020888a09821a98ac0680fad765217302858e70fa4Paul Duffin      if (target instanceof Double) {
5030888a09821a98ac0680fad765217302858e70fa4Paul Duffin        int i = Doubles.lastIndexOf(array, (Double) target, start, end);
5040888a09821a98ac0680fad765217302858e70fa4Paul Duffin        if (i >= 0) {
5050888a09821a98ac0680fad765217302858e70fa4Paul Duffin          return i - start;
5060888a09821a98ac0680fad765217302858e70fa4Paul Duffin        }
5070888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
5080888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return -1;
5090888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
5100888a09821a98ac0680fad765217302858e70fa4Paul Duffin
5110888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public Double set(int index, Double element) {
5120888a09821a98ac0680fad765217302858e70fa4Paul Duffin      checkElementIndex(index, size());
5130888a09821a98ac0680fad765217302858e70fa4Paul Duffin      double oldValue = array[start + index];
5140888a09821a98ac0680fad765217302858e70fa4Paul Duffin      // checkNotNull for GWT (do not optimize)
5150888a09821a98ac0680fad765217302858e70fa4Paul Duffin      array[start + index] = checkNotNull(element);
5160888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return oldValue;
5170888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
5180888a09821a98ac0680fad765217302858e70fa4Paul Duffin
5190888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public List<Double> subList(int fromIndex, int toIndex) {
5200888a09821a98ac0680fad765217302858e70fa4Paul Duffin      int size = size();
5210888a09821a98ac0680fad765217302858e70fa4Paul Duffin      checkPositionIndexes(fromIndex, toIndex, size);
5220888a09821a98ac0680fad765217302858e70fa4Paul Duffin      if (fromIndex == toIndex) {
5230888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return Collections.emptyList();
5240888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
5250888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return new DoubleArrayAsList(array, start + fromIndex, start + toIndex);
5260888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
5270888a09821a98ac0680fad765217302858e70fa4Paul Duffin
5280888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public boolean equals(Object object) {
5290888a09821a98ac0680fad765217302858e70fa4Paul Duffin      if (object == this) {
5300888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return true;
5310888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
5320888a09821a98ac0680fad765217302858e70fa4Paul Duffin      if (object instanceof DoubleArrayAsList) {
5330888a09821a98ac0680fad765217302858e70fa4Paul Duffin        DoubleArrayAsList that = (DoubleArrayAsList) object;
5340888a09821a98ac0680fad765217302858e70fa4Paul Duffin        int size = size();
5350888a09821a98ac0680fad765217302858e70fa4Paul Duffin        if (that.size() != size) {
5360888a09821a98ac0680fad765217302858e70fa4Paul Duffin          return false;
5370888a09821a98ac0680fad765217302858e70fa4Paul Duffin        }
5380888a09821a98ac0680fad765217302858e70fa4Paul Duffin        for (int i = 0; i < size; i++) {
5390888a09821a98ac0680fad765217302858e70fa4Paul Duffin          if (array[start + i] != that.array[that.start + i]) {
5400888a09821a98ac0680fad765217302858e70fa4Paul Duffin            return false;
5410888a09821a98ac0680fad765217302858e70fa4Paul Duffin          }
5420888a09821a98ac0680fad765217302858e70fa4Paul Duffin        }
5430888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return true;
5440888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
5450888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return super.equals(object);
5460888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
5470888a09821a98ac0680fad765217302858e70fa4Paul Duffin
5480888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public int hashCode() {
5490888a09821a98ac0680fad765217302858e70fa4Paul Duffin      int result = 1;
5500888a09821a98ac0680fad765217302858e70fa4Paul Duffin      for (int i = start; i < end; i++) {
5510888a09821a98ac0680fad765217302858e70fa4Paul Duffin        result = 31 * result + Doubles.hashCode(array[i]);
5520888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
5530888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return result;
5540888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
5550888a09821a98ac0680fad765217302858e70fa4Paul Duffin
5560888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public String toString() {
5570888a09821a98ac0680fad765217302858e70fa4Paul Duffin      StringBuilder builder = new StringBuilder(size() * 12);
5580888a09821a98ac0680fad765217302858e70fa4Paul Duffin      builder.append('[').append(array[start]);
5590888a09821a98ac0680fad765217302858e70fa4Paul Duffin      for (int i = start + 1; i < end; i++) {
5600888a09821a98ac0680fad765217302858e70fa4Paul Duffin        builder.append(", ").append(array[i]);
5610888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
5620888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return builder.append(']').toString();
5630888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
5640888a09821a98ac0680fad765217302858e70fa4Paul Duffin
5650888a09821a98ac0680fad765217302858e70fa4Paul Duffin    double[] toDoubleArray() {
5660888a09821a98ac0680fad765217302858e70fa4Paul Duffin      // Arrays.copyOfRange() is not available under GWT
5670888a09821a98ac0680fad765217302858e70fa4Paul Duffin      int size = size();
5680888a09821a98ac0680fad765217302858e70fa4Paul Duffin      double[] result = new double[size];
5690888a09821a98ac0680fad765217302858e70fa4Paul Duffin      System.arraycopy(array, start, result, 0, size);
5700888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return result;
5710888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
5720888a09821a98ac0680fad765217302858e70fa4Paul Duffin
5730888a09821a98ac0680fad765217302858e70fa4Paul Duffin    private static final long serialVersionUID = 0;
5740888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
5750888a09821a98ac0680fad765217302858e70fa4Paul Duffin}
576