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