14c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath/* 24c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. 34c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 44c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 54c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * This code is free software; you can redistribute it and/or modify it 64c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * under the terms of the GNU General Public License version 2 only, as 74c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * published by the Free Software Foundation. Oracle designates this 84c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * particular file as subject to the "Classpath" exception as provided 94c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * by Oracle in the LICENSE file that accompanied this code. 104c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 114c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * This code is distributed in the hope that it will be useful, but WITHOUT 124c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 134c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 144c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * version 2 for more details (a copy is included in the LICENSE file that 154c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * accompanied this code). 164c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 174c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * You should have received a copy of the GNU General Public License version 184c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 2 along with this work; if not, write to the Free Software Foundation, 194c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 204c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 214c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 224c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * or visit www.oracle.com if you need additional information or have any 234c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * questions. 244c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 254c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamathpackage java.util; 264c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 274c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamathimport java.util.function.Consumer; 284c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamathimport java.util.function.DoubleConsumer; 294c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamathimport java.util.function.IntConsumer; 304c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamathimport java.util.function.LongConsumer; 314c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 324c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath/** 334c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Static classes and methods for operating on or creating instances of 344c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@link Spliterator} and its primitive specializations 354c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@link Spliterator.OfInt}, {@link Spliterator.OfLong}, and 364c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@link Spliterator.OfDouble}. 374c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 384c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @see Spliterator 394c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @since 1.8 404c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 414c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamathpublic final class Spliterators { 424c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 434c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath // Suppresses default constructor, ensuring non-instantiability. 444c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private Spliterators() {} 454c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 464c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath // Empty spliterators 474c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 484c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 494c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates an empty {@code Spliterator} 504c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 514c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>The empty spliterator reports {@link Spliterator#SIZED} and 524c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@link Spliterator#SUBSIZED}. Calls to 534c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@link java.util.Spliterator#trySplit()} always return {@code null}. 544c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 554c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param <T> Type of elements 564c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @return An empty spliterator 574c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 584c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @SuppressWarnings("unchecked") 594c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static <T> Spliterator<T> emptySpliterator() { 604c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return (Spliterator<T>) EMPTY_SPLITERATOR; 614c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 624c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 634c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private static final Spliterator<Object> EMPTY_SPLITERATOR = 644c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath new EmptySpliterator.OfRef<>(); 654c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 664c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 674c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates an empty {@code Spliterator.OfInt} 684c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 694c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>The empty spliterator reports {@link Spliterator#SIZED} and 704c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@link Spliterator#SUBSIZED}. Calls to 714c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@link java.util.Spliterator#trySplit()} always return {@code null}. 724c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 734c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @return An empty spliterator 744c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 754c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static Spliterator.OfInt emptyIntSpliterator() { 764c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return EMPTY_INT_SPLITERATOR; 774c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 784c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 794c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private static final Spliterator.OfInt EMPTY_INT_SPLITERATOR = 804c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath new EmptySpliterator.OfInt(); 814c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 824c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 834c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates an empty {@code Spliterator.OfLong} 844c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 854c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>The empty spliterator reports {@link Spliterator#SIZED} and 864c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@link Spliterator#SUBSIZED}. Calls to 874c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@link java.util.Spliterator#trySplit()} always return {@code null}. 884c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 894c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @return An empty spliterator 904c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 914c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static Spliterator.OfLong emptyLongSpliterator() { 924c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return EMPTY_LONG_SPLITERATOR; 934c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 944c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 954c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private static final Spliterator.OfLong EMPTY_LONG_SPLITERATOR = 964c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath new EmptySpliterator.OfLong(); 974c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 984c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 994c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates an empty {@code Spliterator.OfDouble} 1004c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 1014c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>The empty spliterator reports {@link Spliterator#SIZED} and 1024c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@link Spliterator#SUBSIZED}. Calls to 1034c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@link java.util.Spliterator#trySplit()} always return {@code null}. 1044c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 1054c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @return An empty spliterator 1064c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 1074c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static Spliterator.OfDouble emptyDoubleSpliterator() { 1084c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return EMPTY_DOUBLE_SPLITERATOR; 1094c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 1104c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 1114c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private static final Spliterator.OfDouble EMPTY_DOUBLE_SPLITERATOR = 1124c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath new EmptySpliterator.OfDouble(); 1134c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 1144c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath // Array-based spliterators 1154c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 1164c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 1174c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a {@code Spliterator} covering the elements of a given array, 1184c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * using a customized set of spliterator characteristics. 1194c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 1204c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>This method is provided as an implementation convenience for 1214c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Spliterators which store portions of their elements in arrays, and need 1224c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * fine control over Spliterator characteristics. Most other situations in 1234c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * which a Spliterator for an array is needed should use 1244c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@link Arrays#spliterator(Object[])}. 1254c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 1264c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>The returned spliterator always reports the characteristics 1274c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code SIZED} and {@code SUBSIZED}. The caller may provide additional 1284c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * characteristics for the spliterator to report; it is common to 1294c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * additionally specify {@code IMMUTABLE} and {@code ORDERED}. 1304c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 1314c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param <T> Type of elements 1324c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param array The array, assumed to be unmodified during use 1334c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param additionalCharacteristics Additional spliterator characteristics 1344c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * of this spliterator's source or elements beyond {@code SIZED} and 1354c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code SUBSIZED} which are are always reported 1364c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @return A spliterator for an array 1374c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @throws NullPointerException if the given array is {@code null} 1384c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @see Arrays#spliterator(Object[]) 1394c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 1404c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static <T> Spliterator<T> spliterator(Object[] array, 1414c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int additionalCharacteristics) { 1424c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return new ArraySpliterator<>(Objects.requireNonNull(array), 1434c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath additionalCharacteristics); 1444c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 1454c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 1464c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 1474c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a {@code Spliterator} covering a range of elements of a given 1484c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * array, using a customized set of spliterator characteristics. 1494c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 1504c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>This method is provided as an implementation convenience for 1514c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Spliterators which store portions of their elements in arrays, and need 1524c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * fine control over Spliterator characteristics. Most other situations in 1534c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * which a Spliterator for an array is needed should use 1544c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@link Arrays#spliterator(Object[])}. 1554c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 1564c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>The returned spliterator always reports the characteristics 1574c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code SIZED} and {@code SUBSIZED}. The caller may provide additional 1584c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * characteristics for the spliterator to report; it is common to 1594c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * additionally specify {@code IMMUTABLE} and {@code ORDERED}. 1604c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 1614c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param <T> Type of elements 1624c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param array The array, assumed to be unmodified during use 1634c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param fromIndex The least index (inclusive) to cover 1644c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param toIndex One past the greatest index to cover 1654c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param additionalCharacteristics Additional spliterator characteristics 1664c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * of this spliterator's source or elements beyond {@code SIZED} and 1674c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code SUBSIZED} which are are always reported 1684c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @return A spliterator for an array 1694c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @throws NullPointerException if the given array is {@code null} 1704c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @throws ArrayIndexOutOfBoundsException if {@code fromIndex} is negative, 1714c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code toIndex} is less than {@code fromIndex}, or 1724c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code toIndex} is greater than the array size 1734c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @see Arrays#spliterator(Object[], int, int) 1744c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 1754c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static <T> Spliterator<T> spliterator(Object[] array, int fromIndex, int toIndex, 1764c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int additionalCharacteristics) { 1774c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath checkFromToBounds(Objects.requireNonNull(array).length, fromIndex, toIndex); 1784c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return new ArraySpliterator<>(array, fromIndex, toIndex, additionalCharacteristics); 1794c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 1804c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 1814c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 1824c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a {@code Spliterator.OfInt} covering the elements of a given array, 1834c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * using a customized set of spliterator characteristics. 1844c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 1854c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>This method is provided as an implementation convenience for 1864c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Spliterators which store portions of their elements in arrays, and need 1874c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * fine control over Spliterator characteristics. Most other situations in 1884c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * which a Spliterator for an array is needed should use 1894c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@link Arrays#spliterator(int[])}. 1904c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 1914c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>The returned spliterator always reports the characteristics 1924c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code SIZED} and {@code SUBSIZED}. The caller may provide additional 1934c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * characteristics for the spliterator to report; it is common to 1944c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * additionally specify {@code IMMUTABLE} and {@code ORDERED}. 1954c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 1964c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param array The array, assumed to be unmodified during use 1974c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param additionalCharacteristics Additional spliterator characteristics 1984c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * of this spliterator's source or elements beyond {@code SIZED} and 1994c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code SUBSIZED} which are are always reported 2004c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @return A spliterator for an array 2014c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @throws NullPointerException if the given array is {@code null} 2024c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @see Arrays#spliterator(int[]) 2034c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 2044c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static Spliterator.OfInt spliterator(int[] array, 2054c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int additionalCharacteristics) { 2064c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return new IntArraySpliterator(Objects.requireNonNull(array), additionalCharacteristics); 2074c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 2084c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 2094c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 2104c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a {@code Spliterator.OfInt} covering a range of elements of a 2114c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * given array, using a customized set of spliterator characteristics. 2124c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 2134c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>This method is provided as an implementation convenience for 2144c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Spliterators which store portions of their elements in arrays, and need 2154c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * fine control over Spliterator characteristics. Most other situations in 2164c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * which a Spliterator for an array is needed should use 2174c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@link Arrays#spliterator(int[], int, int)}. 2184c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 2194c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>The returned spliterator always reports the characteristics 2204c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code SIZED} and {@code SUBSIZED}. The caller may provide additional 2214c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * characteristics for the spliterator to report; it is common to 2224c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * additionally specify {@code IMMUTABLE} and {@code ORDERED}. 2234c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 2244c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param array The array, assumed to be unmodified during use 2254c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param fromIndex The least index (inclusive) to cover 2264c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param toIndex One past the greatest index to cover 2274c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param additionalCharacteristics Additional spliterator characteristics 2284c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * of this spliterator's source or elements beyond {@code SIZED} and 2294c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code SUBSIZED} which are are always reported 2304c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @return A spliterator for an array 2314c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @throws NullPointerException if the given array is {@code null} 2324c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @throws ArrayIndexOutOfBoundsException if {@code fromIndex} is negative, 2334c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code toIndex} is less than {@code fromIndex}, or 2344c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code toIndex} is greater than the array size 2354c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @see Arrays#spliterator(int[], int, int) 2364c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 2374c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static Spliterator.OfInt spliterator(int[] array, int fromIndex, int toIndex, 2384c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int additionalCharacteristics) { 2394c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath checkFromToBounds(Objects.requireNonNull(array).length, fromIndex, toIndex); 2404c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return new IntArraySpliterator(array, fromIndex, toIndex, additionalCharacteristics); 2414c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 2424c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 2434c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 2444c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a {@code Spliterator.OfLong} covering the elements of a given array, 2454c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * using a customized set of spliterator characteristics. 2464c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 2474c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>This method is provided as an implementation convenience for 2484c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Spliterators which store portions of their elements in arrays, and need 2494c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * fine control over Spliterator characteristics. Most other situations in 2504c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * which a Spliterator for an array is needed should use 2514c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@link Arrays#spliterator(long[])}. 2524c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 2534c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>The returned spliterator always reports the characteristics 2544c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code SIZED} and {@code SUBSIZED}. The caller may provide additional 2554c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * characteristics for the spliterator to report; it is common to 2564c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * additionally specify {@code IMMUTABLE} and {@code ORDERED}. 2574c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 2584c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param array The array, assumed to be unmodified during use 2594c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param additionalCharacteristics Additional spliterator characteristics 2604c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * of this spliterator's source or elements beyond {@code SIZED} and 2614c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code SUBSIZED} which are are always reported 2624c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @return A spliterator for an array 2634c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @throws NullPointerException if the given array is {@code null} 2644c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @see Arrays#spliterator(long[]) 2654c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 2664c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static Spliterator.OfLong spliterator(long[] array, 2674c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int additionalCharacteristics) { 2684c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return new LongArraySpliterator(Objects.requireNonNull(array), additionalCharacteristics); 2694c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 2704c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 2714c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 2724c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a {@code Spliterator.OfLong} covering a range of elements of a 2734c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * given array, using a customized set of spliterator characteristics. 2744c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 2754c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>This method is provided as an implementation convenience for 2764c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Spliterators which store portions of their elements in arrays, and need 2774c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * fine control over Spliterator characteristics. Most other situations in 2784c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * which a Spliterator for an array is needed should use 2794c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@link Arrays#spliterator(long[], int, int)}. 2804c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 2814c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>The returned spliterator always reports the characteristics 2824c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code SIZED} and {@code SUBSIZED}. The caller may provide additional 2834c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * characteristics for the spliterator to report. (For example, if it is 2844c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * known the array will not be further modified, specify {@code IMMUTABLE}; 2854c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * if the array data is considered to have an an encounter order, specify 2864c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code ORDERED}). The method {@link Arrays#spliterator(long[], int, int)} can 2874c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * often be used instead, which returns a spliterator that reports 2884c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code SIZED}, {@code SUBSIZED}, {@code IMMUTABLE}, and {@code ORDERED}. 2894c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 2904c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param array The array, assumed to be unmodified during use 2914c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param fromIndex The least index (inclusive) to cover 2924c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param toIndex One past the greatest index to cover 2934c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param additionalCharacteristics Additional spliterator characteristics 2944c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * of this spliterator's source or elements beyond {@code SIZED} and 2954c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code SUBSIZED} which are are always reported 2964c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @return A spliterator for an array 2974c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @throws NullPointerException if the given array is {@code null} 2984c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @throws ArrayIndexOutOfBoundsException if {@code fromIndex} is negative, 2994c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code toIndex} is less than {@code fromIndex}, or 3004c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code toIndex} is greater than the array size 3014c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @see Arrays#spliterator(long[], int, int) 3024c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 3034c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static Spliterator.OfLong spliterator(long[] array, int fromIndex, int toIndex, 3044c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int additionalCharacteristics) { 3054c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath checkFromToBounds(Objects.requireNonNull(array).length, fromIndex, toIndex); 3064c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return new LongArraySpliterator(array, fromIndex, toIndex, additionalCharacteristics); 3074c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 3084c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 3094c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 3104c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a {@code Spliterator.OfDouble} covering the elements of a given array, 3114c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * using a customized set of spliterator characteristics. 3124c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 3134c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>This method is provided as an implementation convenience for 3144c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Spliterators which store portions of their elements in arrays, and need 3154c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * fine control over Spliterator characteristics. Most other situations in 3164c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * which a Spliterator for an array is needed should use 3174c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@link Arrays#spliterator(double[])}. 3184c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 3194c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>The returned spliterator always reports the characteristics 3204c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code SIZED} and {@code SUBSIZED}. The caller may provide additional 3214c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * characteristics for the spliterator to report; it is common to 3224c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * additionally specify {@code IMMUTABLE} and {@code ORDERED}. 3234c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 3244c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param array The array, assumed to be unmodified during use 3254c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param additionalCharacteristics Additional spliterator characteristics 3264c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * of this spliterator's source or elements beyond {@code SIZED} and 3274c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code SUBSIZED} which are are always reported 3284c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @return A spliterator for an array 3294c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @throws NullPointerException if the given array is {@code null} 3304c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @see Arrays#spliterator(double[]) 3314c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 3324c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static Spliterator.OfDouble spliterator(double[] array, 3334c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int additionalCharacteristics) { 3344c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return new DoubleArraySpliterator(Objects.requireNonNull(array), additionalCharacteristics); 3354c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 3364c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 3374c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 3384c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a {@code Spliterator.OfDouble} covering a range of elements of a 3394c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * given array, using a customized set of spliterator characteristics. 3404c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 3414c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>This method is provided as an implementation convenience for 3424c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Spliterators which store portions of their elements in arrays, and need 3434c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * fine control over Spliterator characteristics. Most other situations in 3444c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * which a Spliterator for an array is needed should use 3454c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@link Arrays#spliterator(double[], int, int)}. 3464c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 3474c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>The returned spliterator always reports the characteristics 3484c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code SIZED} and {@code SUBSIZED}. The caller may provide additional 3494c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * characteristics for the spliterator to report. (For example, if it is 3504c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * known the array will not be further modified, specify {@code IMMUTABLE}; 3514c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * if the array data is considered to have an an encounter order, specify 3524c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code ORDERED}). The method {@link Arrays#spliterator(long[], int, int)} can 3534c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * often be used instead, which returns a spliterator that reports 3544c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code SIZED}, {@code SUBSIZED}, {@code IMMUTABLE}, and {@code ORDERED}. 3554c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 3564c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param array The array, assumed to be unmodified during use 3574c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param fromIndex The least index (inclusive) to cover 3584c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param toIndex One past the greatest index to cover 3594c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param additionalCharacteristics Additional spliterator characteristics 3604c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * of this spliterator's source or elements beyond {@code SIZED} and 3614c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code SUBSIZED} which are are always reported 3624c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @return A spliterator for an array 3634c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @throws NullPointerException if the given array is {@code null} 3644c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @throws ArrayIndexOutOfBoundsException if {@code fromIndex} is negative, 3654c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code toIndex} is less than {@code fromIndex}, or 3664c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code toIndex} is greater than the array size 3674c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @see Arrays#spliterator(double[], int, int) 3684c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 3694c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static Spliterator.OfDouble spliterator(double[] array, int fromIndex, int toIndex, 3704c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int additionalCharacteristics) { 3714c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath checkFromToBounds(Objects.requireNonNull(array).length, fromIndex, toIndex); 3724c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return new DoubleArraySpliterator(array, fromIndex, toIndex, additionalCharacteristics); 3734c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 3744c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 3754c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 3764c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Validate inclusive start index and exclusive end index against the length 3774c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * of an array. 3784c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param arrayLength The length of the array 3794c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param origin The inclusive start index 3804c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param fence The exclusive end index 3814c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @throws ArrayIndexOutOfBoundsException if the start index is greater than 3824c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * the end index, if the start index is negative, or the end index is 3834c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * greater than the array length 3844c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 3854c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private static void checkFromToBounds(int arrayLength, int origin, int fence) { 3864c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (origin > fence) { 387c5b84fc0e3e3864d63717824a3195d04496d59fbShubham Ajmera throw new ArrayIndexOutOfBoundsException( 3884c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath "origin(" + origin + ") > fence(" + fence + ")"); 3894c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 3904c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (origin < 0) { 3914c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath throw new ArrayIndexOutOfBoundsException(origin); 3924c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 3934c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (fence > arrayLength) { 3944c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath throw new ArrayIndexOutOfBoundsException(fence); 3954c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 3964c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 3974c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 3984c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath // Iterator-based spliterators 3994c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 4004c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 4014c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a {@code Spliterator} using the given collection's 4024c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@link java.util.Collection#iterator()} as the source of elements, and 4034c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * reporting its {@link java.util.Collection#size()} as its initial size. 4044c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 4054c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>The spliterator is 4064c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <em><a href="Spliterator.html#binding">late-binding</a></em>, inherits 4074c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * the <em>fail-fast</em> properties of the collection's iterator, and 4084c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * implements {@code trySplit} to permit limited parallelism. 4094c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 4104c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param <T> Type of elements 4114c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param c The collection 4124c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param characteristics Characteristics of this spliterator's source or 4134c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * elements. The characteristics {@code SIZED} and {@code SUBSIZED} 4144c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * are additionally reported unless {@code CONCURRENT} is supplied. 4154c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @return A spliterator from an iterator 4164c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @throws NullPointerException if the given collection is {@code null} 4174c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 4184c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static <T> Spliterator<T> spliterator(Collection<? extends T> c, 4194c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int characteristics) { 4204c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return new IteratorSpliterator<>(Objects.requireNonNull(c), 4214c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath characteristics); 4224c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 4234c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 4244c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 4254c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a {@code Spliterator} using a given {@code Iterator} 4264c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * as the source of elements, and with a given initially reported size. 4274c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 4284c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>The spliterator is not 4294c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <em><a href="Spliterator.html#binding">late-binding</a></em>, inherits 4304c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * the <em>fail-fast</em> properties of the iterator, and implements 4314c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code trySplit} to permit limited parallelism. 4324c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 4334c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>Traversal of elements should be accomplished through the spliterator. 4344c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * The behaviour of splitting and traversal is undefined if the iterator is 4354c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * operated on after the spliterator is returned, or the initially reported 4364c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * size is not equal to the actual number of elements in the source. 4374c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 4384c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param <T> Type of elements 4394c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param iterator The iterator for the source 4404c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param size The number of elements in the source, to be reported as 4414c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * initial {@code estimateSize} 4424c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param characteristics Characteristics of this spliterator's source or 4434c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * elements. The characteristics {@code SIZED} and {@code SUBSIZED} 4444c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * are additionally reported unless {@code CONCURRENT} is supplied. 4454c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @return A spliterator from an iterator 4464c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @throws NullPointerException if the given iterator is {@code null} 4474c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 4484c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static <T> Spliterator<T> spliterator(Iterator<? extends T> iterator, 4494c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath long size, 4504c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int characteristics) { 4514c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return new IteratorSpliterator<>(Objects.requireNonNull(iterator), size, 4524c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath characteristics); 4534c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 4544c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 4554c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 4564c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a {@code Spliterator} using a given {@code Iterator} 4574c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * as the source of elements, with no initial size estimate. 4584c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 4594c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>The spliterator is not 4604c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <em><a href="Spliterator.html#binding">late-binding</a></em>, inherits 4614c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * the <em>fail-fast</em> properties of the iterator, and implements 4624c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code trySplit} to permit limited parallelism. 4634c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 4644c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>Traversal of elements should be accomplished through the spliterator. 4654c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * The behaviour of splitting and traversal is undefined if the iterator is 4664c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * operated on after the spliterator is returned. 4674c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 4684c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param <T> Type of elements 4694c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param iterator The iterator for the source 4704c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param characteristics Characteristics of this spliterator's source 4714c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * or elements ({@code SIZED} and {@code SUBSIZED}, if supplied, are 4724c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * ignored and are not reported.) 4734c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @return A spliterator from an iterator 4744c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @throws NullPointerException if the given iterator is {@code null} 4754c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 4764c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static <T> Spliterator<T> spliteratorUnknownSize(Iterator<? extends T> iterator, 4774c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int characteristics) { 4784c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return new IteratorSpliterator<>(Objects.requireNonNull(iterator), characteristics); 4794c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 4804c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 4814c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 4824c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a {@code Spliterator.OfInt} using a given 4834c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code IntStream.IntIterator} as the source of elements, and with a given 4844c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * initially reported size. 4854c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 4864c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>The spliterator is not 4874c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <em><a href="Spliterator.html#binding">late-binding</a></em>, inherits 4884c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * the <em>fail-fast</em> properties of the iterator, and implements 4894c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code trySplit} to permit limited parallelism. 4904c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 4914c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>Traversal of elements should be accomplished through the spliterator. 4924c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * The behaviour of splitting and traversal is undefined if the iterator is 4934c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * operated on after the spliterator is returned, or the initially reported 4944c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * size is not equal to the actual number of elements in the source. 4954c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 4964c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param iterator The iterator for the source 4974c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param size The number of elements in the source, to be reported as 4984c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * initial {@code estimateSize}. 4994c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param characteristics Characteristics of this spliterator's source or 5004c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * elements. The characteristics {@code SIZED} and {@code SUBSIZED} 5014c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * are additionally reported unless {@code CONCURRENT} is supplied. 5024c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @return A spliterator from an iterator 5034c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @throws NullPointerException if the given iterator is {@code null} 5044c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 5054c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static Spliterator.OfInt spliterator(PrimitiveIterator.OfInt iterator, 5064c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath long size, 5074c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int characteristics) { 5084c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return new IntIteratorSpliterator(Objects.requireNonNull(iterator), 5094c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath size, characteristics); 5104c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 5114c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 5124c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 5134c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a {@code Spliterator.OfInt} using a given 5144c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code IntStream.IntIterator} as the source of elements, with no initial 5154c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * size estimate. 5164c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 5174c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>The spliterator is not 5184c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <em><a href="Spliterator.html#binding">late-binding</a></em>, inherits 5194c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * the <em>fail-fast</em> properties of the iterator, and implements 5204c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code trySplit} to permit limited parallelism. 5214c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 5224c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>Traversal of elements should be accomplished through the spliterator. 5234c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * The behaviour of splitting and traversal is undefined if the iterator is 5244c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * operated on after the spliterator is returned. 5254c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 5264c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param iterator The iterator for the source 5274c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param characteristics Characteristics of this spliterator's source 5284c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * or elements ({@code SIZED} and {@code SUBSIZED}, if supplied, are 5294c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * ignored and are not reported.) 5304c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @return A spliterator from an iterator 5314c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @throws NullPointerException if the given iterator is {@code null} 5324c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 5334c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static Spliterator.OfInt spliteratorUnknownSize(PrimitiveIterator.OfInt iterator, 5344c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int characteristics) { 5354c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return new IntIteratorSpliterator(Objects.requireNonNull(iterator), characteristics); 5364c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 5374c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 5384c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 5394c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a {@code Spliterator.OfLong} using a given 5404c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code LongStream.LongIterator} as the source of elements, and with a 5414c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * given initially reported size. 5424c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 5434c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>The spliterator is not 5444c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <em><a href="Spliterator.html#binding">late-binding</a></em>, inherits 5454c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * the <em>fail-fast</em> properties of the iterator, and implements 5464c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code trySplit} to permit limited parallelism. 5474c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 5484c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>Traversal of elements should be accomplished through the spliterator. 5494c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * The behaviour of splitting and traversal is undefined if the iterator is 5504c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * operated on after the spliterator is returned, or the initially reported 5514c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * size is not equal to the actual number of elements in the source. 5524c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 5534c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param iterator The iterator for the source 5544c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param size The number of elements in the source, to be reported as 5554c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * initial {@code estimateSize}. 5564c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param characteristics Characteristics of this spliterator's source or 5574c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * elements. The characteristics {@code SIZED} and {@code SUBSIZED} 5584c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * are additionally reported unless {@code CONCURRENT} is supplied. 5594c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @return A spliterator from an iterator 5604c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @throws NullPointerException if the given iterator is {@code null} 5614c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 5624c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static Spliterator.OfLong spliterator(PrimitiveIterator.OfLong iterator, 5634c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath long size, 5644c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int characteristics) { 5654c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return new LongIteratorSpliterator(Objects.requireNonNull(iterator), 5664c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath size, characteristics); 5674c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 5684c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 5694c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 5704c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a {@code Spliterator.OfLong} using a given 5714c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code LongStream.LongIterator} as the source of elements, with no 5724c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * initial size estimate. 5734c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 5744c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>The spliterator is not 5754c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <em><a href="Spliterator.html#binding">late-binding</a></em>, inherits 5764c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * the <em>fail-fast</em> properties of the iterator, and implements 5774c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code trySplit} to permit limited parallelism. 5784c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 5794c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>Traversal of elements should be accomplished through the spliterator. 5804c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * The behaviour of splitting and traversal is undefined if the iterator is 5814c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * operated on after the spliterator is returned. 5824c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 5834c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param iterator The iterator for the source 5844c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param characteristics Characteristics of this spliterator's source 5854c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * or elements ({@code SIZED} and {@code SUBSIZED}, if supplied, are 5864c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * ignored and are not reported.) 5874c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @return A spliterator from an iterator 5884c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @throws NullPointerException if the given iterator is {@code null} 5894c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 5904c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static Spliterator.OfLong spliteratorUnknownSize(PrimitiveIterator.OfLong iterator, 5914c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int characteristics) { 5924c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return new LongIteratorSpliterator(Objects.requireNonNull(iterator), characteristics); 5934c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 5944c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 5954c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 5964c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a {@code Spliterator.OfDouble} using a given 5974c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code DoubleStream.DoubleIterator} as the source of elements, and with a 5984c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * given initially reported size. 5994c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 6004c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>The spliterator is not 6014c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <em><a href="Spliterator.html#binding">late-binding</a></em>, inherits 6024c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * the <em>fail-fast</em> properties of the iterator, and implements 6034c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code trySplit} to permit limited parallelism. 6044c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 6054c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>Traversal of elements should be accomplished through the spliterator. 6064c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * The behaviour of splitting and traversal is undefined if the iterator is 6074c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * operated on after the spliterator is returned, or the initially reported 6084c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * size is not equal to the actual number of elements in the source. 6094c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 6104c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param iterator The iterator for the source 6114c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param size The number of elements in the source, to be reported as 6124c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * initial {@code estimateSize} 6134c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param characteristics Characteristics of this spliterator's source or 6144c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * elements. The characteristics {@code SIZED} and {@code SUBSIZED} 6154c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * are additionally reported unless {@code CONCURRENT} is supplied. 6164c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @return A spliterator from an iterator 6174c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @throws NullPointerException if the given iterator is {@code null} 6184c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 6194c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static Spliterator.OfDouble spliterator(PrimitiveIterator.OfDouble iterator, 6204c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath long size, 6214c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int characteristics) { 6224c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return new DoubleIteratorSpliterator(Objects.requireNonNull(iterator), 6234c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath size, characteristics); 6244c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 6254c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 6264c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 6274c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a {@code Spliterator.OfDouble} using a given 6284c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code DoubleStream.DoubleIterator} as the source of elements, with no 6294c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * initial size estimate. 6304c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 6314c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>The spliterator is not 6324c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <em><a href="Spliterator.html#binding">late-binding</a></em>, inherits 6334c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * the <em>fail-fast</em> properties of the iterator, and implements 6344c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code trySplit} to permit limited parallelism. 6354c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 6364c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>Traversal of elements should be accomplished through the spliterator. 6374c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * The behaviour of splitting and traversal is undefined if the iterator is 6384c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * operated on after the spliterator is returned. 6394c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 6404c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param iterator The iterator for the source 6414c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param characteristics Characteristics of this spliterator's source 6424c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * or elements ({@code SIZED} and {@code SUBSIZED}, if supplied, are 6434c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * ignored and are not reported.) 6444c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @return A spliterator from an iterator 6454c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @throws NullPointerException if the given iterator is {@code null} 6464c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 6474c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static Spliterator.OfDouble spliteratorUnknownSize(PrimitiveIterator.OfDouble iterator, 6484c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int characteristics) { 6494c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return new DoubleIteratorSpliterator(Objects.requireNonNull(iterator), characteristics); 6504c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 6514c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 6524c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath // Iterators from Spliterators 6534c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 6544c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 6554c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates an {@code Iterator} from a {@code Spliterator}. 6564c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 6574c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>Traversal of elements should be accomplished through the iterator. 6584c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * The behaviour of traversal is undefined if the spliterator is operated 6594c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * after the iterator is returned. 6604c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 6614c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param <T> Type of elements 6624c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param spliterator The spliterator 6634c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @return An iterator 6644c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @throws NullPointerException if the given spliterator is {@code null} 6654c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 6664c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static<T> Iterator<T> iterator(Spliterator<? extends T> spliterator) { 6674c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath Objects.requireNonNull(spliterator); 6684c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath class Adapter implements Iterator<T>, Consumer<T> { 6694c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath boolean valueReady = false; 6704c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath T nextElement; 6714c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 6724c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 6734c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public void accept(T t) { 6744c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath valueReady = true; 6754c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath nextElement = t; 6764c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 6774c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 6784c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 6794c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public boolean hasNext() { 6804c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (!valueReady) 6814c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath spliterator.tryAdvance(this); 6824c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return valueReady; 6834c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 6844c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 6854c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 6864c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public T next() { 6874c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (!valueReady && !hasNext()) 6884c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath throw new NoSuchElementException(); 6894c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath else { 6904c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath valueReady = false; 6914c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return nextElement; 6924c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 6934c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 6944c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 6954c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 6964c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return new Adapter(); 6974c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 6984c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 6994c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 7004c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates an {@code PrimitiveIterator.OfInt} from a 7014c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code Spliterator.OfInt}. 7024c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 7034c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>Traversal of elements should be accomplished through the iterator. 7044c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * The behaviour of traversal is undefined if the spliterator is operated 7054c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * after the iterator is returned. 7064c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 7074c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param spliterator The spliterator 7084c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @return An iterator 7094c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @throws NullPointerException if the given spliterator is {@code null} 7104c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 7114c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static PrimitiveIterator.OfInt iterator(Spliterator.OfInt spliterator) { 7124c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath Objects.requireNonNull(spliterator); 7134c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath class Adapter implements PrimitiveIterator.OfInt, IntConsumer { 7144c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath boolean valueReady = false; 7154c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int nextElement; 7164c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 7174c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 7184c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public void accept(int t) { 7194c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath valueReady = true; 7204c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath nextElement = t; 7214c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 7224c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 7234c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 7244c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public boolean hasNext() { 7254c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (!valueReady) 7264c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath spliterator.tryAdvance(this); 7274c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return valueReady; 7284c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 7294c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 7304c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 7314c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public int nextInt() { 7324c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (!valueReady && !hasNext()) 7334c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath throw new NoSuchElementException(); 7344c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath else { 7354c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath valueReady = false; 7364c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return nextElement; 7374c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 7384c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 7394c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 7404c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 7414c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return new Adapter(); 7424c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 7434c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 7444c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 7454c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates an {@code PrimitiveIterator.OfLong} from a 7464c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code Spliterator.OfLong}. 7474c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 7484c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>Traversal of elements should be accomplished through the iterator. 7494c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * The behaviour of traversal is undefined if the spliterator is operated 7504c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * after the iterator is returned. 7514c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 7524c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param spliterator The spliterator 7534c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @return An iterator 7544c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @throws NullPointerException if the given spliterator is {@code null} 7554c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 7564c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static PrimitiveIterator.OfLong iterator(Spliterator.OfLong spliterator) { 7574c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath Objects.requireNonNull(spliterator); 7584c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath class Adapter implements PrimitiveIterator.OfLong, LongConsumer { 7594c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath boolean valueReady = false; 7604c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath long nextElement; 7614c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 7624c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 7634c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public void accept(long t) { 7644c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath valueReady = true; 7654c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath nextElement = t; 7664c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 7674c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 7684c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 7694c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public boolean hasNext() { 7704c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (!valueReady) 7714c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath spliterator.tryAdvance(this); 7724c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return valueReady; 7734c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 7744c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 7754c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 7764c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public long nextLong() { 7774c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (!valueReady && !hasNext()) 7784c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath throw new NoSuchElementException(); 7794c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath else { 7804c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath valueReady = false; 7814c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return nextElement; 7824c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 7834c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 7844c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 7854c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 7864c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return new Adapter(); 7874c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 7884c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 7894c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 7904c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates an {@code PrimitiveIterator.OfDouble} from a 7914c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code Spliterator.OfDouble}. 7924c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 7934c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>Traversal of elements should be accomplished through the iterator. 7944c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * The behaviour of traversal is undefined if the spliterator is operated 7954c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * after the iterator is returned. 7964c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 7974c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param spliterator The spliterator 7984c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @return An iterator 7994c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @throws NullPointerException if the given spliterator is {@code null} 8004c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 8014c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static PrimitiveIterator.OfDouble iterator(Spliterator.OfDouble spliterator) { 8024c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath Objects.requireNonNull(spliterator); 8034c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath class Adapter implements PrimitiveIterator.OfDouble, DoubleConsumer { 8044c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath boolean valueReady = false; 8054c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath double nextElement; 8064c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 8074c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 8084c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public void accept(double t) { 8094c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath valueReady = true; 8104c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath nextElement = t; 8114c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 8124c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 8134c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 8144c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public boolean hasNext() { 8154c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (!valueReady) 8164c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath spliterator.tryAdvance(this); 8174c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return valueReady; 8184c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 8194c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 8204c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 8214c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public double nextDouble() { 8224c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (!valueReady && !hasNext()) 8234c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath throw new NoSuchElementException(); 8244c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath else { 8254c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath valueReady = false; 8264c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return nextElement; 8274c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 8284c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 8294c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 8304c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 8314c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return new Adapter(); 8324c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 8334c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 8344c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath // Implementations 8354c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 8364c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private static abstract class EmptySpliterator<T, S extends Spliterator<T>, C> { 8374c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 8384c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath EmptySpliterator() { } 8394c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 8404c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public S trySplit() { 8414c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return null; 8424c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 8434c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 8444c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public boolean tryAdvance(C consumer) { 8454c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath Objects.requireNonNull(consumer); 8464c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return false; 8474c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 8484c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 8494c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public void forEachRemaining(C consumer) { 8504c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath Objects.requireNonNull(consumer); 8514c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 8524c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 8534c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public long estimateSize() { 8544c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return 0; 8554c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 8564c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 8574c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public int characteristics() { 8584c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return Spliterator.SIZED | Spliterator.SUBSIZED; 8594c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 8604c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 8614c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private static final class OfRef<T> 8624c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath extends EmptySpliterator<T, Spliterator<T>, Consumer<? super T>> 8634c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath implements Spliterator<T> { 8644c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath OfRef() { } 8654c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 8664c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 8674c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private static final class OfInt 8684c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath extends EmptySpliterator<Integer, Spliterator.OfInt, IntConsumer> 8694c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath implements Spliterator.OfInt { 8704c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath OfInt() { } 8714c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 8724c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 8734c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private static final class OfLong 8744c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath extends EmptySpliterator<Long, Spliterator.OfLong, LongConsumer> 8754c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath implements Spliterator.OfLong { 8764c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath OfLong() { } 8774c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 8784c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 8794c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private static final class OfDouble 8804c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath extends EmptySpliterator<Double, Spliterator.OfDouble, DoubleConsumer> 8814c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath implements Spliterator.OfDouble { 8824c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath OfDouble() { } 8834c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 8844c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 8854c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 8864c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath // Array-based spliterators 8874c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 8884c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 8894c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * A Spliterator designed for use by sources that traverse and split 8904c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * elements maintained in an unmodifiable {@code Object[]} array. 8914c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 8924c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath static final class ArraySpliterator<T> implements Spliterator<T> { 8934c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 8944c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * The array, explicitly typed as Object[]. Unlike in some other 8954c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * classes (see for example CR 6260652), we do not need to 8964c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * screen arguments to ensure they are exactly of type Object[] 8974c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * so long as no methods write into the array or serialize it, 8984c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * which we ensure here by defining this class as final. 8994c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 9004c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private final Object[] array; 9014c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private int index; // current index, modified on advance/split 9024c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private final int fence; // one past last index 9034c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private final int characteristics; 9044c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 9054c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 9064c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a spliterator covering all of the given array. 9074c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param array the array, assumed to be unmodified during use 9084c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param additionalCharacteristics Additional spliterator characteristics 9094c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * of this spliterator's source or elements beyond {@code SIZED} and 9104c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code SUBSIZED} which are are always reported 9114c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 9124c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public ArraySpliterator(Object[] array, int additionalCharacteristics) { 9134c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this(array, 0, array.length, additionalCharacteristics); 9144c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 9154c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 9164c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 9174c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a spliterator covering the given array and range 9184c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param array the array, assumed to be unmodified during use 9194c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param origin the least index (inclusive) to cover 9204c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param fence one past the greatest index to cover 9214c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param additionalCharacteristics Additional spliterator characteristics 9224c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * of this spliterator's source or elements beyond {@code SIZED} and 9234c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code SUBSIZED} which are are always reported 9244c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 9254c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public ArraySpliterator(Object[] array, int origin, int fence, int additionalCharacteristics) { 9264c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.array = array; 9274c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.index = origin; 9284c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.fence = fence; 9294c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.characteristics = additionalCharacteristics | Spliterator.SIZED | Spliterator.SUBSIZED; 9304c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 9314c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 9324c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 9334c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public Spliterator<T> trySplit() { 9344c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int lo = index, mid = (lo + fence) >>> 1; 9354c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return (lo >= mid) 9364c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath ? null 9374c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath : new ArraySpliterator<>(array, lo, index = mid, characteristics); 9384c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 9394c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 9404c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @SuppressWarnings("unchecked") 9414c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 9424c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public void forEachRemaining(Consumer<? super T> action) { 9434c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath Object[] a; int i, hi; // hoist accesses and checks from loop 9444c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (action == null) 9454c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath throw new NullPointerException(); 9464c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if ((a = array).length >= (hi = fence) && 9474c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath (i = index) >= 0 && i < (index = hi)) { 9484c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath do { action.accept((T)a[i]); } while (++i < hi); 9494c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 9504c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 9514c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 9524c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 9534c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public boolean tryAdvance(Consumer<? super T> action) { 9544c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (action == null) 9554c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath throw new NullPointerException(); 9564c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (index >= 0 && index < fence) { 9574c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @SuppressWarnings("unchecked") T e = (T) array[index++]; 9584c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath action.accept(e); 9594c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return true; 9604c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 9614c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return false; 9624c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 9634c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 9644c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 9654c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public long estimateSize() { return (long)(fence - index); } 9664c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 9674c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 9684c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public int characteristics() { 9694c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return characteristics; 9704c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 9714c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 9724c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 9734c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public Comparator<? super T> getComparator() { 9744c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (hasCharacteristics(Spliterator.SORTED)) 9754c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return null; 9764c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath throw new IllegalStateException(); 9774c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 9784c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 9794c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 9804c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 9814c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * A Spliterator.OfInt designed for use by sources that traverse and split 9824c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * elements maintained in an unmodifiable {@code int[]} array. 9834c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 9844c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath static final class IntArraySpliterator implements Spliterator.OfInt { 9854c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private final int[] array; 9864c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private int index; // current index, modified on advance/split 9874c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private final int fence; // one past last index 9884c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private final int characteristics; 9894c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 9904c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 9914c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a spliterator covering all of the given array. 9924c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param array the array, assumed to be unmodified during use 9934c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param additionalCharacteristics Additional spliterator characteristics 9944c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * of this spliterator's source or elements beyond {@code SIZED} and 9954c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code SUBSIZED} which are are always reported 9964c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 9974c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public IntArraySpliterator(int[] array, int additionalCharacteristics) { 9984c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this(array, 0, array.length, additionalCharacteristics); 9994c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 10004c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 10014c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 10024c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a spliterator covering the given array and range 10034c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param array the array, assumed to be unmodified during use 10044c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param origin the least index (inclusive) to cover 10054c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param fence one past the greatest index to cover 10064c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param additionalCharacteristics Additional spliterator characteristics 10074c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * of this spliterator's source or elements beyond {@code SIZED} and 10084c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code SUBSIZED} which are are always reported 10094c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 10104c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public IntArraySpliterator(int[] array, int origin, int fence, int additionalCharacteristics) { 10114c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.array = array; 10124c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.index = origin; 10134c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.fence = fence; 10144c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.characteristics = additionalCharacteristics | Spliterator.SIZED | Spliterator.SUBSIZED; 10154c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 10164c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 10174c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 10184c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public OfInt trySplit() { 10194c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int lo = index, mid = (lo + fence) >>> 1; 10204c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return (lo >= mid) 10214c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath ? null 10224c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath : new IntArraySpliterator(array, lo, index = mid, characteristics); 10234c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 10244c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 10254c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 10264c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public void forEachRemaining(IntConsumer action) { 10274c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int[] a; int i, hi; // hoist accesses and checks from loop 10284c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (action == null) 10294c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath throw new NullPointerException(); 10304c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if ((a = array).length >= (hi = fence) && 10314c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath (i = index) >= 0 && i < (index = hi)) { 10324c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath do { action.accept(a[i]); } while (++i < hi); 10334c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 10344c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 10354c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 10364c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 10374c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public boolean tryAdvance(IntConsumer action) { 10384c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (action == null) 10394c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath throw new NullPointerException(); 10404c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (index >= 0 && index < fence) { 10414c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath action.accept(array[index++]); 10424c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return true; 10434c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 10444c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return false; 10454c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 10464c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 10474c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 10484c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public long estimateSize() { return (long)(fence - index); } 10494c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 10504c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 10514c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public int characteristics() { 10524c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return characteristics; 10534c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 10544c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 10554c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 10564c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public Comparator<? super Integer> getComparator() { 10574c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (hasCharacteristics(Spliterator.SORTED)) 10584c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return null; 10594c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath throw new IllegalStateException(); 10604c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 10614c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 10624c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 10634c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 10644c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * A Spliterator.OfLong designed for use by sources that traverse and split 10654c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * elements maintained in an unmodifiable {@code int[]} array. 10664c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 10674c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath static final class LongArraySpliterator implements Spliterator.OfLong { 10684c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private final long[] array; 10694c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private int index; // current index, modified on advance/split 10704c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private final int fence; // one past last index 10714c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private final int characteristics; 10724c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 10734c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 10744c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a spliterator covering all of the given array. 10754c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param array the array, assumed to be unmodified during use 10764c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param additionalCharacteristics Additional spliterator characteristics 10774c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * of this spliterator's source or elements beyond {@code SIZED} and 10784c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code SUBSIZED} which are are always reported 10794c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 10804c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public LongArraySpliterator(long[] array, int additionalCharacteristics) { 10814c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this(array, 0, array.length, additionalCharacteristics); 10824c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 10834c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 10844c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 10854c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a spliterator covering the given array and range 10864c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param array the array, assumed to be unmodified during use 10874c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param origin the least index (inclusive) to cover 10884c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param fence one past the greatest index to cover 10894c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param additionalCharacteristics Additional spliterator characteristics 10904c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * of this spliterator's source or elements beyond {@code SIZED} and 10914c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code SUBSIZED} which are are always reported 10924c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 10934c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public LongArraySpliterator(long[] array, int origin, int fence, int additionalCharacteristics) { 10944c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.array = array; 10954c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.index = origin; 10964c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.fence = fence; 10974c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.characteristics = additionalCharacteristics | Spliterator.SIZED | Spliterator.SUBSIZED; 10984c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 10994c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 11004c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 11014c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public OfLong trySplit() { 11024c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int lo = index, mid = (lo + fence) >>> 1; 11034c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return (lo >= mid) 11044c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath ? null 11054c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath : new LongArraySpliterator(array, lo, index = mid, characteristics); 11064c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 11074c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 11084c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 11094c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public void forEachRemaining(LongConsumer action) { 11104c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath long[] a; int i, hi; // hoist accesses and checks from loop 11114c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (action == null) 11124c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath throw new NullPointerException(); 11134c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if ((a = array).length >= (hi = fence) && 11144c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath (i = index) >= 0 && i < (index = hi)) { 11154c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath do { action.accept(a[i]); } while (++i < hi); 11164c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 11174c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 11184c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 11194c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 11204c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public boolean tryAdvance(LongConsumer action) { 11214c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (action == null) 11224c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath throw new NullPointerException(); 11234c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (index >= 0 && index < fence) { 11244c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath action.accept(array[index++]); 11254c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return true; 11264c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 11274c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return false; 11284c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 11294c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 11304c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 11314c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public long estimateSize() { return (long)(fence - index); } 11324c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 11334c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 11344c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public int characteristics() { 11354c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return characteristics; 11364c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 11374c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 11384c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 11394c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public Comparator<? super Long> getComparator() { 11404c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (hasCharacteristics(Spliterator.SORTED)) 11414c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return null; 11424c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath throw new IllegalStateException(); 11434c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 11444c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 11454c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 11464c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 11474c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * A Spliterator.OfDouble designed for use by sources that traverse and split 11484c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * elements maintained in an unmodifiable {@code int[]} array. 11494c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 11504c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath static final class DoubleArraySpliterator implements Spliterator.OfDouble { 11514c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private final double[] array; 11524c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private int index; // current index, modified on advance/split 11534c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private final int fence; // one past last index 11544c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private final int characteristics; 11554c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 11564c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 11574c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a spliterator covering all of the given array. 11584c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param array the array, assumed to be unmodified during use 11594c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param additionalCharacteristics Additional spliterator characteristics 11604c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * of this spliterator's source or elements beyond {@code SIZED} and 11614c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code SUBSIZED} which are are always reported 11624c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 11634c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public DoubleArraySpliterator(double[] array, int additionalCharacteristics) { 11644c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this(array, 0, array.length, additionalCharacteristics); 11654c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 11664c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 11674c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 11684c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a spliterator covering the given array and range 11694c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param array the array, assumed to be unmodified during use 11704c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param origin the least index (inclusive) to cover 11714c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param fence one past the greatest index to cover 11724c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param additionalCharacteristics Additional spliterator characteristics 11734c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * of this spliterator's source or elements beyond {@code SIZED} and 11744c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code SUBSIZED} which are are always reported 11754c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 11764c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public DoubleArraySpliterator(double[] array, int origin, int fence, int additionalCharacteristics) { 11774c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.array = array; 11784c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.index = origin; 11794c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.fence = fence; 11804c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.characteristics = additionalCharacteristics | Spliterator.SIZED | Spliterator.SUBSIZED; 11814c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 11824c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 11834c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 11844c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public OfDouble trySplit() { 11854c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int lo = index, mid = (lo + fence) >>> 1; 11864c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return (lo >= mid) 11874c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath ? null 11884c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath : new DoubleArraySpliterator(array, lo, index = mid, characteristics); 11894c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 11904c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 11914c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 11924c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public void forEachRemaining(DoubleConsumer action) { 11934c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath double[] a; int i, hi; // hoist accesses and checks from loop 11944c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (action == null) 11954c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath throw new NullPointerException(); 11964c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if ((a = array).length >= (hi = fence) && 11974c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath (i = index) >= 0 && i < (index = hi)) { 11984c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath do { action.accept(a[i]); } while (++i < hi); 11994c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 12004c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 12014c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 12024c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 12034c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public boolean tryAdvance(DoubleConsumer action) { 12044c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (action == null) 12054c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath throw new NullPointerException(); 12064c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (index >= 0 && index < fence) { 12074c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath action.accept(array[index++]); 12084c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return true; 12094c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 12104c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return false; 12114c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 12124c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 12134c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 12144c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public long estimateSize() { return (long)(fence - index); } 12154c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 12164c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 12174c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public int characteristics() { 12184c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return characteristics; 12194c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 12204c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 12214c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 12224c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public Comparator<? super Double> getComparator() { 12234c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (hasCharacteristics(Spliterator.SORTED)) 12244c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return null; 12254c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath throw new IllegalStateException(); 12264c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 12274c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 12284c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 12294c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath // 12304c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 12314c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 12324c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * An abstract {@code Spliterator} that implements {@code trySplit} to 12334c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * permit limited parallelism. 12344c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 12354c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>An extending class need only 12364c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * implement {@link #tryAdvance(java.util.function.Consumer) tryAdvance}. 12374c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * The extending class should override 12384c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@link #forEachRemaining(java.util.function.Consumer) forEach} if it can 12394c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * provide a more performant implementation. 12404c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 12414c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @apiNote 12424c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * This class is a useful aid for creating a spliterator when it is not 12434c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * possible or difficult to efficiently partition elements in a manner 12444c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * allowing balanced parallel computation. 12454c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 12464c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>An alternative to using this class, that also permits limited 12474c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * parallelism, is to create a spliterator from an iterator 12484c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * (see {@link #spliterator(Iterator, long, int)}. Depending on the 12494c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * circumstances using an iterator may be easier or more convenient than 12504c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * extending this class, such as when there is already an iterator 12514c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * available to use. 12524c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 12534c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @see #spliterator(Iterator, long, int) 12544c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @since 1.8 12554c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 12564c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static abstract class AbstractSpliterator<T> implements Spliterator<T> { 12574c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath static final int BATCH_UNIT = 1 << 10; // batch array size increment 12584c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath static final int MAX_BATCH = 1 << 25; // max batch array size; 12594c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private final int characteristics; 12604c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private long est; // size estimate 12614c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private int batch; // batch size for splits 12624c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 12634c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 12644c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a spliterator reporting the given estimated size and 12654c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * additionalCharacteristics. 12664c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 12674c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param est the estimated size of this spliterator if known, otherwise 12684c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code Long.MAX_VALUE}. 12694c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param additionalCharacteristics properties of this spliterator's 12704c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * source or elements. If {@code SIZED} is reported then this 12714c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * spliterator will additionally report {@code SUBSIZED}. 12724c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 12734c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath protected AbstractSpliterator(long est, int additionalCharacteristics) { 12744c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.est = est; 12754c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.characteristics = ((additionalCharacteristics & Spliterator.SIZED) != 0) 12764c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath ? additionalCharacteristics | Spliterator.SUBSIZED 12774c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath : additionalCharacteristics; 12784c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 12794c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 12804c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath static final class HoldingConsumer<T> implements Consumer<T> { 12814c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath Object value; 12824c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 12834c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 12844c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public void accept(T value) { 12854c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.value = value; 12864c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 12874c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 12884c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 12894c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 12904c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@inheritDoc} 12914c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 12924c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * This implementation permits limited parallelism. 12934c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 12944c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 12954c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public Spliterator<T> trySplit() { 12964c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /* 12974c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Split into arrays of arithmetically increasing batch 12984c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * sizes. This will only improve parallel performance if 12994c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * per-element Consumer actions are more costly than 13004c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * transferring them into an array. The use of an 13014c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * arithmetic progression in split sizes provides overhead 13024c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * vs parallelism bounds that do not particularly favor or 13034c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * penalize cases of lightweight vs heavyweight element 13044c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * operations, across combinations of #elements vs #cores, 13054c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * whether or not either are known. We generate 13064c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * O(sqrt(#elements)) splits, allowing O(sqrt(#cores)) 13074c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * potential speedup. 13084c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 13094c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath HoldingConsumer<T> holder = new HoldingConsumer<>(); 13104c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath long s = est; 13114c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (s > 1 && tryAdvance(holder)) { 13124c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int n = batch + BATCH_UNIT; 13134c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (n > s) 13144c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath n = (int) s; 13154c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (n > MAX_BATCH) 13164c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath n = MAX_BATCH; 13174c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath Object[] a = new Object[n]; 13184c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int j = 0; 13194c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath do { a[j] = holder.value; } while (++j < n && tryAdvance(holder)); 13204c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath batch = j; 13214c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (est != Long.MAX_VALUE) 13224c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath est -= j; 13234c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return new ArraySpliterator<>(a, 0, j, characteristics()); 13244c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 13254c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return null; 13264c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 13274c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 13284c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 13294c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@inheritDoc} 13304c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 13314c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @implSpec 13324c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * This implementation returns the estimated size as reported when 13334c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * created and, if the estimate size is known, decreases in size when 13344c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * split. 13354c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 13364c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 13374c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public long estimateSize() { 13384c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return est; 13394c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 13404c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 13414c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 13424c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@inheritDoc} 13434c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 13444c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @implSpec 13454c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * This implementation returns the characteristics as reported when 13464c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * created. 13474c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 13484c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 13494c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public int characteristics() { 13504c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return characteristics; 13514c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 13524c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 13534c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 13544c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 13554c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * An abstract {@code Spliterator.OfInt} that implements {@code trySplit} to 13564c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * permit limited parallelism. 13574c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 13584c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>To implement a spliterator an extending class need only 13594c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * implement {@link #tryAdvance(java.util.function.IntConsumer)} 13604c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * tryAdvance}. The extending class should override 13614c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@link #forEachRemaining(java.util.function.IntConsumer)} forEach} if it 13624c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * can provide a more performant implementation. 13634c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 13644c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @apiNote 13654c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * This class is a useful aid for creating a spliterator when it is not 13664c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * possible or difficult to efficiently partition elements in a manner 13674c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * allowing balanced parallel computation. 13684c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 13694c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>An alternative to using this class, that also permits limited 13704c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * parallelism, is to create a spliterator from an iterator 13714c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * (see {@link #spliterator(java.util.PrimitiveIterator.OfInt, long, int)}. 13724c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Depending on the circumstances using an iterator may be easier or more 13734c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * convenient than extending this class. For example, if there is already an 13744c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * iterator available to use then there is no need to extend this class. 13754c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 13764c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @see #spliterator(java.util.PrimitiveIterator.OfInt, long, int) 13774c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @since 1.8 13784c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 13794c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static abstract class AbstractIntSpliterator implements Spliterator.OfInt { 13804c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath static final int MAX_BATCH = AbstractSpliterator.MAX_BATCH; 13814c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath static final int BATCH_UNIT = AbstractSpliterator.BATCH_UNIT; 13824c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private final int characteristics; 13834c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private long est; // size estimate 13844c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private int batch; // batch size for splits 13854c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 13864c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 13874c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a spliterator reporting the given estimated size and 13884c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * characteristics. 13894c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 13904c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param est the estimated size of this spliterator if known, otherwise 13914c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code Long.MAX_VALUE}. 13924c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param additionalCharacteristics properties of this spliterator's 13934c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * source or elements. If {@code SIZED} is reported then this 13944c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * spliterator will additionally report {@code SUBSIZED}. 13954c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 13964c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath protected AbstractIntSpliterator(long est, int additionalCharacteristics) { 13974c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.est = est; 13984c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.characteristics = ((additionalCharacteristics & Spliterator.SIZED) != 0) 13994c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath ? additionalCharacteristics | Spliterator.SUBSIZED 14004c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath : additionalCharacteristics; 14014c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 14024c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 14034c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath static final class HoldingIntConsumer implements IntConsumer { 14044c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int value; 14054c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 14064c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 14074c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public void accept(int value) { 14084c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.value = value; 14094c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 14104c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 14114c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 14124c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 14134c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@inheritDoc} 14144c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 14154c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * This implementation permits limited parallelism. 14164c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 14174c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 14184c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public Spliterator.OfInt trySplit() { 14194c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath HoldingIntConsumer holder = new HoldingIntConsumer(); 14204c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath long s = est; 14214c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (s > 1 && tryAdvance(holder)) { 14224c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int n = batch + BATCH_UNIT; 14234c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (n > s) 14244c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath n = (int) s; 14254c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (n > MAX_BATCH) 14264c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath n = MAX_BATCH; 14274c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int[] a = new int[n]; 14284c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int j = 0; 14294c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath do { a[j] = holder.value; } while (++j < n && tryAdvance(holder)); 14304c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath batch = j; 14314c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (est != Long.MAX_VALUE) 14324c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath est -= j; 14334c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return new IntArraySpliterator(a, 0, j, characteristics()); 14344c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 14354c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return null; 14364c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 14374c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 14384c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 14394c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@inheritDoc} 14404c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 14414c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @implSpec 14424c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * This implementation returns the estimated size as reported when 14434c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * created and, if the estimate size is known, decreases in size when 14444c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * split. 14454c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 14464c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 14474c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public long estimateSize() { 14484c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return est; 14494c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 14504c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 14514c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 14524c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@inheritDoc} 14534c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 14544c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @implSpec 14554c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * This implementation returns the characteristics as reported when 14564c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * created. 14574c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 14584c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 14594c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public int characteristics() { 14604c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return characteristics; 14614c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 14624c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 14634c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 14644c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 14654c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * An abstract {@code Spliterator.OfLong} that implements {@code trySplit} 14664c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * to permit limited parallelism. 14674c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 14684c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>To implement a spliterator an extending class need only 14694c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * implement {@link #tryAdvance(java.util.function.LongConsumer)} 14704c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * tryAdvance}. The extending class should override 14714c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@link #forEachRemaining(java.util.function.LongConsumer)} forEach} if it 14724c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * can provide a more performant implementation. 14734c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 14744c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @apiNote 14754c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * This class is a useful aid for creating a spliterator when it is not 14764c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * possible or difficult to efficiently partition elements in a manner 14774c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * allowing balanced parallel computation. 14784c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 14794c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>An alternative to using this class, that also permits limited 14804c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * parallelism, is to create a spliterator from an iterator 14814c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * (see {@link #spliterator(java.util.PrimitiveIterator.OfLong, long, int)}. 14824c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Depending on the circumstances using an iterator may be easier or more 14834c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * convenient than extending this class. For example, if there is already an 14844c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * iterator available to use then there is no need to extend this class. 14854c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 14864c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @see #spliterator(java.util.PrimitiveIterator.OfLong, long, int) 14874c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @since 1.8 14884c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 14894c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static abstract class AbstractLongSpliterator implements Spliterator.OfLong { 14904c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath static final int MAX_BATCH = AbstractSpliterator.MAX_BATCH; 14914c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath static final int BATCH_UNIT = AbstractSpliterator.BATCH_UNIT; 14924c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private final int characteristics; 14934c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private long est; // size estimate 14944c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private int batch; // batch size for splits 14954c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 14964c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 14974c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a spliterator reporting the given estimated size and 14984c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * characteristics. 14994c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 15004c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param est the estimated size of this spliterator if known, otherwise 15014c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code Long.MAX_VALUE}. 15024c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param additionalCharacteristics properties of this spliterator's 15034c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * source or elements. If {@code SIZED} is reported then this 15044c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * spliterator will additionally report {@code SUBSIZED}. 15054c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 15064c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath protected AbstractLongSpliterator(long est, int additionalCharacteristics) { 15074c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.est = est; 15084c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.characteristics = ((additionalCharacteristics & Spliterator.SIZED) != 0) 15094c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath ? additionalCharacteristics | Spliterator.SUBSIZED 15104c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath : additionalCharacteristics; 15114c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 15124c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 15134c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath static final class HoldingLongConsumer implements LongConsumer { 15144c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath long value; 15154c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 15164c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 15174c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public void accept(long value) { 15184c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.value = value; 15194c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 15204c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 15214c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 15224c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 15234c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@inheritDoc} 15244c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 15254c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * This implementation permits limited parallelism. 15264c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 15274c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 15284c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public Spliterator.OfLong trySplit() { 15294c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath HoldingLongConsumer holder = new HoldingLongConsumer(); 15304c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath long s = est; 15314c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (s > 1 && tryAdvance(holder)) { 15324c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int n = batch + BATCH_UNIT; 15334c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (n > s) 15344c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath n = (int) s; 15354c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (n > MAX_BATCH) 15364c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath n = MAX_BATCH; 15374c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath long[] a = new long[n]; 15384c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int j = 0; 15394c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath do { a[j] = holder.value; } while (++j < n && tryAdvance(holder)); 15404c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath batch = j; 15414c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (est != Long.MAX_VALUE) 15424c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath est -= j; 15434c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return new LongArraySpliterator(a, 0, j, characteristics()); 15444c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 15454c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return null; 15464c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 15474c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 15484c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 15494c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@inheritDoc} 15504c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 15514c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @implSpec 15524c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * This implementation returns the estimated size as reported when 15534c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * created and, if the estimate size is known, decreases in size when 15544c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * split. 15554c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 15564c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 15574c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public long estimateSize() { 15584c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return est; 15594c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 15604c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 15614c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 15624c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@inheritDoc} 15634c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 15644c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @implSpec 15654c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * This implementation returns the characteristics as reported when 15664c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * created. 15674c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 15684c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 15694c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public int characteristics() { 15704c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return characteristics; 15714c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 15724c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 15734c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 15744c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 15754c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * An abstract {@code Spliterator.OfDouble} that implements 15764c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code trySplit} to permit limited parallelism. 15774c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 15784c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>To implement a spliterator an extending class need only 15794c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * implement {@link #tryAdvance(java.util.function.DoubleConsumer)} 15804c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * tryAdvance}. The extending class should override 15814c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@link #forEachRemaining(java.util.function.DoubleConsumer)} forEach} if 15824c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * it can provide a more performant implementation. 15834c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 15844c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @apiNote 15854c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * This class is a useful aid for creating a spliterator when it is not 15864c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * possible or difficult to efficiently partition elements in a manner 15874c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * allowing balanced parallel computation. 15884c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 15894c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * <p>An alternative to using this class, that also permits limited 15904c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * parallelism, is to create a spliterator from an iterator 15914c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * (see {@link #spliterator(java.util.PrimitiveIterator.OfDouble, long, int)}. 15924c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Depending on the circumstances using an iterator may be easier or more 15934c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * convenient than extending this class. For example, if there is already an 15944c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * iterator available to use then there is no need to extend this class. 15954c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 15964c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @see #spliterator(java.util.PrimitiveIterator.OfDouble, long, int) 15974c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @since 1.8 15984c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 15994c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static abstract class AbstractDoubleSpliterator implements Spliterator.OfDouble { 16004c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath static final int MAX_BATCH = AbstractSpliterator.MAX_BATCH; 16014c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath static final int BATCH_UNIT = AbstractSpliterator.BATCH_UNIT; 16024c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private final int characteristics; 16034c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private long est; // size estimate 16044c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private int batch; // batch size for splits 16054c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 16064c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 16074c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a spliterator reporting the given estimated size and 16084c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * characteristics. 16094c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 16104c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param est the estimated size of this spliterator if known, otherwise 16114c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@code Long.MAX_VALUE}. 16124c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param additionalCharacteristics properties of this spliterator's 16134c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * source or elements. If {@code SIZED} is reported then this 16144c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * spliterator will additionally report {@code SUBSIZED}. 16154c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 16164c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath protected AbstractDoubleSpliterator(long est, int additionalCharacteristics) { 16174c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.est = est; 16184c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.characteristics = ((additionalCharacteristics & Spliterator.SIZED) != 0) 16194c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath ? additionalCharacteristics | Spliterator.SUBSIZED 16204c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath : additionalCharacteristics; 16214c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 16224c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 16234c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath static final class HoldingDoubleConsumer implements DoubleConsumer { 16244c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath double value; 16254c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 16264c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 16274c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public void accept(double value) { 16284c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.value = value; 16294c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 16304c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 16314c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 16324c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 16334c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@inheritDoc} 16344c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 16354c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * This implementation permits limited parallelism. 16364c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 16374c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 16384c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public Spliterator.OfDouble trySplit() { 16394c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath HoldingDoubleConsumer holder = new HoldingDoubleConsumer(); 16404c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath long s = est; 16414c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (s > 1 && tryAdvance(holder)) { 16424c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int n = batch + BATCH_UNIT; 16434c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (n > s) 16444c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath n = (int) s; 16454c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (n > MAX_BATCH) 16464c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath n = MAX_BATCH; 16474c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath double[] a = new double[n]; 16484c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int j = 0; 16494c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath do { a[j] = holder.value; } while (++j < n && tryAdvance(holder)); 16504c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath batch = j; 16514c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (est != Long.MAX_VALUE) 16524c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath est -= j; 16534c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return new DoubleArraySpliterator(a, 0, j, characteristics()); 16544c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 16554c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return null; 16564c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 16574c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 16584c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 16594c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@inheritDoc} 16604c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 16614c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @implSpec 16624c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * This implementation returns the estimated size as reported when 16634c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * created and, if the estimate size is known, decreases in size when 16644c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * split. 16654c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 16664c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 16674c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public long estimateSize() { 16684c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return est; 16694c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 16704c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 16714c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 16724c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * {@inheritDoc} 16734c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 16744c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @implSpec 16754c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * This implementation returns the characteristics as reported when 16764c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * created. 16774c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 16784c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 16794c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public int characteristics() { 16804c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return characteristics; 16814c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 16824c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 16834c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 16844c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath // Iterator-based Spliterators 16854c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 16864c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 16874c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * A Spliterator using a given Iterator for element 16884c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * operations. The spliterator implements {@code trySplit} to 16894c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * permit limited parallelism. 16904c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 16914c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath static class IteratorSpliterator<T> implements Spliterator<T> { 16924c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath static final int BATCH_UNIT = 1 << 10; // batch array size increment 16934c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath static final int MAX_BATCH = 1 << 25; // max batch array size; 16944c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private final Collection<? extends T> collection; // null OK 16954c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private Iterator<? extends T> it; 16964c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private final int characteristics; 16974c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private long est; // size estimate 16984c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private int batch; // batch size for splits 16994c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 17004c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 17014c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a spliterator using the given given 17024c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * collection's {@link java.util.Collection#iterator()) for traversal, 17034c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * and reporting its {@link java.util.Collection#size()) as its initial 17044c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * size. 17054c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 17064c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param c the collection 17074c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param characteristics properties of this spliterator's 17084c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * source or elements. 17094c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 17104c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public IteratorSpliterator(Collection<? extends T> collection, int characteristics) { 17114c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.collection = collection; 17124c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.it = null; 17134c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.characteristics = (characteristics & Spliterator.CONCURRENT) == 0 17144c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath ? characteristics | Spliterator.SIZED | Spliterator.SUBSIZED 17154c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath : characteristics; 17164c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 17174c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 17184c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 17194c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a spliterator using the given iterator 17204c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * for traversal, and reporting the given initial size 17214c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * and characteristics. 17224c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 17234c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param iterator the iterator for the source 17244c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param size the number of elements in the source 17254c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param characteristics properties of this spliterator's 17264c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * source or elements. 17274c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 17284c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public IteratorSpliterator(Iterator<? extends T> iterator, long size, int characteristics) { 17294c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.collection = null; 17304c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.it = iterator; 17314c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.est = size; 17324c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.characteristics = (characteristics & Spliterator.CONCURRENT) == 0 17334c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath ? characteristics | Spliterator.SIZED | Spliterator.SUBSIZED 17344c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath : characteristics; 17354c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 17364c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 17374c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 17384c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a spliterator using the given iterator 17394c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * for traversal, and reporting the given initial size 17404c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * and characteristics. 17414c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 17424c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param iterator the iterator for the source 17434c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param characteristics properties of this spliterator's 17444c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * source or elements. 17454c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 17464c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public IteratorSpliterator(Iterator<? extends T> iterator, int characteristics) { 17474c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.collection = null; 17484c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.it = iterator; 17494c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.est = Long.MAX_VALUE; 17504c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.characteristics = characteristics & ~(Spliterator.SIZED | Spliterator.SUBSIZED); 17514c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 17524c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 17534c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 17544c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public Spliterator<T> trySplit() { 17554c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /* 17564c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Split into arrays of arithmetically increasing batch 17574c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * sizes. This will only improve parallel performance if 17584c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * per-element Consumer actions are more costly than 17594c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * transferring them into an array. The use of an 17604c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * arithmetic progression in split sizes provides overhead 17614c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * vs parallelism bounds that do not particularly favor or 17624c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * penalize cases of lightweight vs heavyweight element 17634c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * operations, across combinations of #elements vs #cores, 17644c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * whether or not either are known. We generate 17654c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * O(sqrt(#elements)) splits, allowing O(sqrt(#cores)) 17664c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * potential speedup. 17674c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 17684c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath Iterator<? extends T> i; 17694c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath long s; 17704c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if ((i = it) == null) { 17714c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath i = it = collection.iterator(); 17724c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath s = est = (long) collection.size(); 17734c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 17744c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath else 17754c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath s = est; 17764c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (s > 1 && i.hasNext()) { 17774c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int n = batch + BATCH_UNIT; 17784c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (n > s) 17794c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath n = (int) s; 17804c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (n > MAX_BATCH) 17814c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath n = MAX_BATCH; 17824c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath Object[] a = new Object[n]; 17834c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int j = 0; 17844c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath do { a[j] = i.next(); } while (++j < n && i.hasNext()); 17854c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath batch = j; 17864c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (est != Long.MAX_VALUE) 17874c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath est -= j; 17884c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return new ArraySpliterator<>(a, 0, j, characteristics); 17894c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 17904c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return null; 17914c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 17924c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 17934c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 17944c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public void forEachRemaining(Consumer<? super T> action) { 17954c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (action == null) throw new NullPointerException(); 17964c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath Iterator<? extends T> i; 17974c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if ((i = it) == null) { 17984c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath i = it = collection.iterator(); 17994c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath est = (long)collection.size(); 18004c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 18014c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath i.forEachRemaining(action); 18024c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 18034c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 18044c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 18054c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public boolean tryAdvance(Consumer<? super T> action) { 18064c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (action == null) throw new NullPointerException(); 18074c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (it == null) { 18084c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath it = collection.iterator(); 18094c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath est = (long) collection.size(); 18104c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 18114c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (it.hasNext()) { 18124c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath action.accept(it.next()); 18134c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return true; 18144c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 18154c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return false; 18164c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 18174c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 18184c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 18194c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public long estimateSize() { 18204c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (it == null) { 18214c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath it = collection.iterator(); 18224c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return est = (long)collection.size(); 18234c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 18244c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return est; 18254c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 18264c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 18274c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 18284c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public int characteristics() { return characteristics; } 18294c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 18304c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 18314c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public Comparator<? super T> getComparator() { 18324c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (hasCharacteristics(Spliterator.SORTED)) 18334c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return null; 18344c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath throw new IllegalStateException(); 18354c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 18364c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 18374c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 18384c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 18394c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * A Spliterator.OfInt using a given IntStream.IntIterator for element 18404c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * operations. The spliterator implements {@code trySplit} to 18414c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * permit limited parallelism. 18424c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 18434c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath static final class IntIteratorSpliterator implements Spliterator.OfInt { 18444c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath static final int BATCH_UNIT = IteratorSpliterator.BATCH_UNIT; 18454c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath static final int MAX_BATCH = IteratorSpliterator.MAX_BATCH; 18464c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private PrimitiveIterator.OfInt it; 18474c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private final int characteristics; 18484c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private long est; // size estimate 18494c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private int batch; // batch size for splits 18504c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 18514c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 18524c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a spliterator using the given iterator 18534c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * for traversal, and reporting the given initial size 18544c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * and characteristics. 18554c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 18564c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param iterator the iterator for the source 18574c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param size the number of elements in the source 18584c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param characteristics properties of this spliterator's 18594c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * source or elements. 18604c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 18614c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public IntIteratorSpliterator(PrimitiveIterator.OfInt iterator, long size, int characteristics) { 18624c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.it = iterator; 18634c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.est = size; 18644c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.characteristics = (characteristics & Spliterator.CONCURRENT) == 0 18654c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath ? characteristics | Spliterator.SIZED | Spliterator.SUBSIZED 18664c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath : characteristics; 18674c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 18684c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 18694c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 18704c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a spliterator using the given iterator for a 18714c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * source of unknown size, reporting the given 18724c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * characteristics. 18734c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 18744c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param iterator the iterator for the source 18754c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param characteristics properties of this spliterator's 18764c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * source or elements. 18774c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 18784c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public IntIteratorSpliterator(PrimitiveIterator.OfInt iterator, int characteristics) { 18794c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.it = iterator; 18804c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.est = Long.MAX_VALUE; 18814c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.characteristics = characteristics & ~(Spliterator.SIZED | Spliterator.SUBSIZED); 18824c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 18834c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 18844c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 18854c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public OfInt trySplit() { 18864c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath PrimitiveIterator.OfInt i = it; 18874c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath long s = est; 18884c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (s > 1 && i.hasNext()) { 18894c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int n = batch + BATCH_UNIT; 18904c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (n > s) 18914c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath n = (int) s; 18924c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (n > MAX_BATCH) 18934c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath n = MAX_BATCH; 18944c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int[] a = new int[n]; 18954c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int j = 0; 18964c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath do { a[j] = i.nextInt(); } while (++j < n && i.hasNext()); 18974c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath batch = j; 18984c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (est != Long.MAX_VALUE) 18994c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath est -= j; 19004c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return new IntArraySpliterator(a, 0, j, characteristics); 19014c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 19024c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return null; 19034c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 19044c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 19054c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 19064c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public void forEachRemaining(IntConsumer action) { 19074c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (action == null) throw new NullPointerException(); 19084c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath it.forEachRemaining(action); 19094c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 19104c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 19114c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 19124c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public boolean tryAdvance(IntConsumer action) { 19134c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (action == null) throw new NullPointerException(); 19144c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (it.hasNext()) { 19154c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath action.accept(it.nextInt()); 19164c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return true; 19174c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 19184c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return false; 19194c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 19204c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 19214c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 19224c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public long estimateSize() { 19234c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return est; 19244c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 19254c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 19264c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 19274c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public int characteristics() { return characteristics; } 19284c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 19294c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 19304c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public Comparator<? super Integer> getComparator() { 19314c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (hasCharacteristics(Spliterator.SORTED)) 19324c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return null; 19334c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath throw new IllegalStateException(); 19344c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 19354c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 19364c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 19374c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath static final class LongIteratorSpliterator implements Spliterator.OfLong { 19384c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath static final int BATCH_UNIT = IteratorSpliterator.BATCH_UNIT; 19394c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath static final int MAX_BATCH = IteratorSpliterator.MAX_BATCH; 19404c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private PrimitiveIterator.OfLong it; 19414c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private final int characteristics; 19424c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private long est; // size estimate 19434c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private int batch; // batch size for splits 19444c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 19454c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 19464c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a spliterator using the given iterator 19474c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * for traversal, and reporting the given initial size 19484c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * and characteristics. 19494c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 19504c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param iterator the iterator for the source 19514c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param size the number of elements in the source 19524c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param characteristics properties of this spliterator's 19534c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * source or elements. 19544c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 19554c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public LongIteratorSpliterator(PrimitiveIterator.OfLong iterator, long size, int characteristics) { 19564c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.it = iterator; 19574c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.est = size; 19584c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.characteristics = (characteristics & Spliterator.CONCURRENT) == 0 19594c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath ? characteristics | Spliterator.SIZED | Spliterator.SUBSIZED 19604c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath : characteristics; 19614c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 19624c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 19634c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 19644c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a spliterator using the given iterator for a 19654c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * source of unknown size, reporting the given 19664c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * characteristics. 19674c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 19684c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param iterator the iterator for the source 19694c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param characteristics properties of this spliterator's 19704c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * source or elements. 19714c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 19724c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public LongIteratorSpliterator(PrimitiveIterator.OfLong iterator, int characteristics) { 19734c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.it = iterator; 19744c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.est = Long.MAX_VALUE; 19754c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.characteristics = characteristics & ~(Spliterator.SIZED | Spliterator.SUBSIZED); 19764c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 19774c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 19784c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 19794c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public OfLong trySplit() { 19804c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath PrimitiveIterator.OfLong i = it; 19814c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath long s = est; 19824c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (s > 1 && i.hasNext()) { 19834c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int n = batch + BATCH_UNIT; 19844c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (n > s) 19854c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath n = (int) s; 19864c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (n > MAX_BATCH) 19874c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath n = MAX_BATCH; 19884c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath long[] a = new long[n]; 19894c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int j = 0; 19904c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath do { a[j] = i.nextLong(); } while (++j < n && i.hasNext()); 19914c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath batch = j; 19924c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (est != Long.MAX_VALUE) 19934c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath est -= j; 19944c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return new LongArraySpliterator(a, 0, j, characteristics); 19954c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 19964c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return null; 19974c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 19984c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 19994c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 20004c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public void forEachRemaining(LongConsumer action) { 20014c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (action == null) throw new NullPointerException(); 20024c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath it.forEachRemaining(action); 20034c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 20044c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 20054c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 20064c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public boolean tryAdvance(LongConsumer action) { 20074c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (action == null) throw new NullPointerException(); 20084c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (it.hasNext()) { 20094c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath action.accept(it.nextLong()); 20104c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return true; 20114c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 20124c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return false; 20134c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 20144c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 20154c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 20164c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public long estimateSize() { 20174c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return est; 20184c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 20194c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 20204c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 20214c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public int characteristics() { return characteristics; } 20224c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 20234c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 20244c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public Comparator<? super Long> getComparator() { 20254c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (hasCharacteristics(Spliterator.SORTED)) 20264c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return null; 20274c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath throw new IllegalStateException(); 20284c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 20294c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 20304c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 20314c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath static final class DoubleIteratorSpliterator implements Spliterator.OfDouble { 20324c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath static final int BATCH_UNIT = IteratorSpliterator.BATCH_UNIT; 20334c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath static final int MAX_BATCH = IteratorSpliterator.MAX_BATCH; 20344c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private PrimitiveIterator.OfDouble it; 20354c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private final int characteristics; 20364c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private long est; // size estimate 20374c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private int batch; // batch size for splits 20384c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 20394c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 20404c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a spliterator using the given iterator 20414c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * for traversal, and reporting the given initial size 20424c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * and characteristics. 20434c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 20444c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param iterator the iterator for the source 20454c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param size the number of elements in the source 20464c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param characteristics properties of this spliterator's 20474c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * source or elements. 20484c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 20494c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public DoubleIteratorSpliterator(PrimitiveIterator.OfDouble iterator, long size, int characteristics) { 20504c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.it = iterator; 20514c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.est = size; 20524c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.characteristics = (characteristics & Spliterator.CONCURRENT) == 0 20534c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath ? characteristics | Spliterator.SIZED | Spliterator.SUBSIZED 20544c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath : characteristics; 20554c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 20564c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 20574c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 20584c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Creates a spliterator using the given iterator for a 20594c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * source of unknown size, reporting the given 20604c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * characteristics. 20614c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 20624c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param iterator the iterator for the source 20634c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * @param characteristics properties of this spliterator's 20644c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * source or elements. 20654c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 20664c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public DoubleIteratorSpliterator(PrimitiveIterator.OfDouble iterator, int characteristics) { 20674c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.it = iterator; 20684c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.est = Long.MAX_VALUE; 20694c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath this.characteristics = characteristics & ~(Spliterator.SIZED | Spliterator.SUBSIZED); 20704c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 20714c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 20724c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 20734c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public OfDouble trySplit() { 20744c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath PrimitiveIterator.OfDouble i = it; 20754c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath long s = est; 20764c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (s > 1 && i.hasNext()) { 20774c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int n = batch + BATCH_UNIT; 20784c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (n > s) 20794c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath n = (int) s; 20804c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (n > MAX_BATCH) 20814c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath n = MAX_BATCH; 20824c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath double[] a = new double[n]; 20834c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath int j = 0; 20844c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath do { a[j] = i.nextDouble(); } while (++j < n && i.hasNext()); 20854c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath batch = j; 20864c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (est != Long.MAX_VALUE) 20874c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath est -= j; 20884c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return new DoubleArraySpliterator(a, 0, j, characteristics); 20894c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 20904c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return null; 20914c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 20924c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 20934c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 20944c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public void forEachRemaining(DoubleConsumer action) { 20954c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (action == null) throw new NullPointerException(); 20964c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath it.forEachRemaining(action); 20974c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 20984c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 20994c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 21004c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public boolean tryAdvance(DoubleConsumer action) { 21014c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (action == null) throw new NullPointerException(); 21024c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (it.hasNext()) { 21034c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath action.accept(it.nextDouble()); 21044c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return true; 21054c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 21064c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return false; 21074c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 21084c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 21094c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 21104c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public long estimateSize() { 21114c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return est; 21124c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 21134c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 21144c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 21154c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public int characteristics() { return characteristics; } 21164c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 21174c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath @Override 21184c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public Comparator<? super Double> getComparator() { 21194c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (hasCharacteristics(Spliterator.SORTED)) 21204c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath return null; 21214c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath throw new IllegalStateException(); 21224c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 21234c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 21244c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath} 2125