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