1289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin/* 2289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. 3289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * 5289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * This code is free software; you can redistribute it and/or modify it 6289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * under the terms of the GNU General Public License version 2 only, as 7289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * published by the Free Software Foundation. 8289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * 9289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * This code is distributed in the hope that it will be useful, but WITHOUT 10289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * version 2 for more details (a copy is included in the LICENSE file that 13289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * accompanied this code). 14289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * 15289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * You should have received a copy of the GNU General Public License version 16289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * 2 along with this work; if not, write to the Free Software Foundation, 17289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * 19289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * or visit www.oracle.com if you need additional information or have any 21289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * questions. 22289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin */ 23289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinpackage org.openjdk.testlib.java.util.stream; 24289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 25289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.Arrays; 26289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.Collection; 27289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.Iterator; 28289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.PrimitiveIterator; 29289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.Spliterator; 30289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.Spliterators; 31289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.function.DoubleConsumer; 32289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.function.Function; 33289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.function.IntConsumer; 34289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.function.LongConsumer; 35289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.function.Supplier; 36289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.function.ToIntFunction; 37289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.stream.*; 38289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 39289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin/** Describes a test data set for use in stream tests */ 40289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinpublic interface TestData<T, S extends BaseStream<T, S>> 41289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin extends Iterable<T> { 42289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 43289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin default int size() { 44289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin throw new UnsupportedOperationException(); 45289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 46289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 47289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin @Override 48289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin default Iterator<T> iterator() { 49289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return Spliterators.iterator(spliterator()); 50289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 51289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 52289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Spliterator<T> spliterator(); 53289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 54289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin default boolean isOrdered() { 55289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return spliterator().hasCharacteristics(Spliterator.ORDERED); 56289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 57289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 58289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin StreamShape getShape(); 59289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 60289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin default <A extends Collection<? super T>> A into(A target) { 61289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin spliterator().forEachRemaining(target::add); 62289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return target; 63289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 64289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 65289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin S stream(); 66289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 67289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin S parallelStream(); 68289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 69289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public interface OfRef<T> extends TestData<T, Stream<T>> { } 70289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 71289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public interface OfInt extends TestData<Integer, IntStream> { } 72289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 73289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public interface OfLong extends TestData<Long, LongStream> { } 74289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 75289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public interface OfDouble extends TestData<Double, DoubleStream> { } 76289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 77289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin // @@@ Temporary garbage class to avoid triggering bugs with lambdas in static methods in interfaces 78289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public static class Factory { 79289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public static <T> OfRef<T> ofArray(String name, T[] array) { 80289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return new AbstractTestData.RefTestData<>(name, array, Arrays::stream, a -> Arrays.stream(a).parallel(), 81289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Arrays::spliterator, a -> a.length); 82289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 83289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 84289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public static <T> OfRef<T> ofCollection(String name, Collection<T> collection) { 85289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return new AbstractTestData.RefTestData<>(name, collection, Collection::stream, Collection::parallelStream, 86289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Collection::spliterator, Collection::size); 87289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 88289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 89289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public static <T> OfRef<T> ofSpinedBuffer(String name, SpinedBuffer<T> buffer) { 90289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return new AbstractTestData.RefTestData<>(name, buffer, 91289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin b -> StreamSupport.stream(b.spliterator(), false), 92289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin b -> StreamSupport.stream(b.spliterator(), true), 93289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin SpinedBuffer::spliterator, 94289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin b -> (int) b.count()); 95289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 96289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 97289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public static <T> OfRef<T> ofSupplier(String name, Supplier<Stream<T>> supplier) { 98289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return new AbstractTestData.RefTestData<>(name, supplier, 99289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Supplier::get, 100289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin s -> s.get().parallel(), 101289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin s -> s.get().spliterator(), 102289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin s -> (int) s.get().spliterator().getExactSizeIfKnown()); 103289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 104289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 105289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public static <T> OfRef<T> ofRefNode(String name, Node<T> node) { 106289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return new AbstractTestData.RefTestData<>(name, node, 107289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin n -> StreamSupport.stream(n::spliterator, Spliterator.SIZED | Spliterator.ORDERED, false), 108289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin n -> StreamSupport.stream(n::spliterator, Spliterator.SIZED | Spliterator.ORDERED, true), 109289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Node::spliterator, 110289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin n -> (int) n.count()); 111289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 112289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 113289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin // int factories 114289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public static <T> OfInt ofArray(String name, int[] array) { 115289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return new AbstractTestData.IntTestData<>(name, array, Arrays::stream, a -> Arrays.stream(a).parallel(), 116289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Arrays::spliterator, a -> a.length); 117289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 118289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 119289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public static OfInt ofSpinedBuffer(String name, SpinedBuffer.OfInt buffer) { 120289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return new AbstractTestData.IntTestData<>(name, buffer, 121289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin b -> StreamSupport.intStream(b.spliterator(), false), 122289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin b -> StreamSupport.intStream(b.spliterator(), true), 123289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin SpinedBuffer.OfInt::spliterator, 124289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin b -> (int) b.count()); 125289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 126289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 127289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public static OfInt ofIntSupplier(String name, Supplier<IntStream> supplier) { 128289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return new AbstractTestData.IntTestData<>(name, supplier, 129289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Supplier::get, 130289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin s -> s.get().parallel(), 131289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin s -> s.get().spliterator(), 132289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin s -> (int) s.get().spliterator().getExactSizeIfKnown()); 133289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 134289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 135289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public static OfInt ofNode(String name, Node.OfInt node) { 136289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin int characteristics = Spliterator.SIZED | Spliterator.ORDERED; 137289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return new AbstractTestData.IntTestData<>(name, node, 138289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin n -> StreamSupport.intStream(n::spliterator, characteristics, false), 139289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin n -> StreamSupport.intStream(n::spliterator, characteristics, true), 140289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Node.OfInt::spliterator, 141289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin n -> (int) n.count()); 142289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 143289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 144289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin // long factories 145289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public static <T> OfLong ofArray(String name, long[] array) { 146289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return new AbstractTestData.LongTestData<>(name, array, Arrays::stream, a -> Arrays.stream(a).parallel(), 147289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Arrays::spliterator, a -> a.length); 148289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 149289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 150289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public static OfLong ofSpinedBuffer(String name, SpinedBuffer.OfLong buffer) { 151289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return new AbstractTestData.LongTestData<>(name, buffer, 152289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin b -> StreamSupport.longStream(b.spliterator(), false), 153289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin b -> StreamSupport.longStream(b.spliterator(), true), 154289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin SpinedBuffer.OfLong::spliterator, 155289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin b -> (int) b.count()); 156289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 157289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 158289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public static OfLong ofLongSupplier(String name, Supplier<LongStream> supplier) { 159289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return new AbstractTestData.LongTestData<>(name, supplier, 160289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Supplier::get, 161289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin s -> s.get().parallel(), 162289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin s -> s.get().spliterator(), 163289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin s -> (int) s.get().spliterator().getExactSizeIfKnown()); 164289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 165289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 166289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public static OfLong ofNode(String name, Node.OfLong node) { 167289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin int characteristics = Spliterator.SIZED | Spliterator.ORDERED; 168289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return new AbstractTestData.LongTestData<>(name, node, 169289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin n -> StreamSupport.longStream(n::spliterator, characteristics, false), 170289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin n -> StreamSupport.longStream(n::spliterator, characteristics, true), 171289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Node.OfLong::spliterator, 172289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin n -> (int) n.count()); 173289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 174289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 175289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin // double factories 176289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public static <T> OfDouble ofArray(String name, double[] array) { 177289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return new AbstractTestData.DoubleTestData<>(name, array, Arrays::stream, a -> Arrays.stream(a).parallel(), 178289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Arrays::spliterator, a -> a.length); 179289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 180289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 181289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public static OfDouble ofSpinedBuffer(String name, SpinedBuffer.OfDouble buffer) { 182289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return new AbstractTestData.DoubleTestData<>(name, buffer, 183289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin b -> StreamSupport.doubleStream(b.spliterator(), false), 184289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin b -> StreamSupport.doubleStream(b.spliterator(), true), 185289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin SpinedBuffer.OfDouble::spliterator, 186289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin b -> (int) b.count()); 187289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 188289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 189289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public static OfDouble ofDoubleSupplier(String name, Supplier<DoubleStream> supplier) { 190289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return new AbstractTestData.DoubleTestData<>(name, supplier, 191289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Supplier::get, 192289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin s -> s.get().parallel(), 193289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin s -> s.get().spliterator(), 194289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin s -> (int) s.get().spliterator().getExactSizeIfKnown()); 195289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 196289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 197289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public static OfDouble ofNode(String name, Node.OfDouble node) { 198289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin int characteristics = Spliterator.SIZED | Spliterator.ORDERED; 199289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return new AbstractTestData.DoubleTestData<>(name, node, 200289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin n -> StreamSupport.doubleStream(n::spliterator, characteristics, false), 201289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin n -> StreamSupport.doubleStream(n::spliterator, characteristics, true), 202289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Node.OfDouble::spliterator, 203289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin n -> (int) n.count()); 204289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 205289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 206289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 207289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 208289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin abstract class AbstractTestData<T, S extends BaseStream<T, S>, 209289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin T_STATE, 210289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin T_SPLITR extends Spliterator<T>> 211289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin implements TestData<T, S> { 212289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin private final String name; 213289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin private final StreamShape shape; 214289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin protected final T_STATE state; 215289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin private final ToIntFunction<T_STATE> sizeFn; 216289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin private final Function<T_STATE, S> streamFn; 217289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin private final Function<T_STATE, S> parStreamFn; 218289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin private final Function<T_STATE, T_SPLITR> splitrFn; 219289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 220289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin AbstractTestData(String name, 221289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin StreamShape shape, 222289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin T_STATE state, 223289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Function<T_STATE, S> streamFn, 224289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Function<T_STATE, S> parStreamFn, 225289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Function<T_STATE, T_SPLITR> splitrFn, 226289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin ToIntFunction<T_STATE> sizeFn) { 227289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin this.name = name; 228289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin this.shape = shape; 229289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin this.state = state; 230289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin this.streamFn = streamFn; 231289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin this.parStreamFn = parStreamFn; 232289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin this.splitrFn = splitrFn; 233289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin this.sizeFn = sizeFn; 234289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 235289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 236289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin @Override 237289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public StreamShape getShape() { 238289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return shape; 239289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 240289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 241289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin @Override 242289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public String toString() { 243289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return getClass().getSimpleName() + "[" + name + "]"; 244289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 245289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 246289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin @Override 247289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public int size() { 248289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return sizeFn.applyAsInt(state); 249289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 250289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 251289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin @Override 252289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public T_SPLITR spliterator() { 253289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return splitrFn.apply(state); 254289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 255289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 256289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin @Override 257289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public S stream() { 258289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return streamFn.apply(state); 259289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 260289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 261289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin @Override 262289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public S parallelStream() { 263289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return parStreamFn.apply(state); 264289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 265289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 266289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public static class RefTestData<T, I> 267289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin extends AbstractTestData<T, Stream<T>, I, Spliterator<T>> 268289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin implements TestData.OfRef<T> { 269289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 270289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin protected RefTestData(String name, 271289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin I state, 272289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Function<I, Stream<T>> streamFn, 273289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Function<I, Stream<T>> parStreamFn, 274289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Function<I, Spliterator<T>> splitrFn, 275289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin ToIntFunction<I> sizeFn) { 276289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin super(name, StreamShape.REFERENCE, state, streamFn, parStreamFn, splitrFn, sizeFn); 277289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 278289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 279289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 280289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 281289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin static class IntTestData<I> 282289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin extends AbstractTestData<Integer, IntStream, I, Spliterator.OfInt> 283289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin implements TestData.OfInt { 284289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 285289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin protected IntTestData(String name, 286289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin I state, 287289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Function<I, IntStream> streamFn, 288289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Function<I, IntStream> parStreamFn, 289289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Function<I, Spliterator.OfInt> splitrFn, 290289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin ToIntFunction<I> sizeFn) { 291289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin super(name, StreamShape.INT_VALUE, state, streamFn, parStreamFn, splitrFn, sizeFn); 292289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 293289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 294289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin @Override 295289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public PrimitiveIterator.OfInt iterator() { 296289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return Spliterators.iterator(spliterator()); 297289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 298289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 299289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin @Override 300289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public <A extends Collection<? super Integer>> A into(A target) { 301289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin spliterator().forEachRemaining((IntConsumer) target::add); 302289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return target; 303289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 304289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 305289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 306289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin static class LongTestData<I> 307289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin extends AbstractTestData<Long, LongStream, I, Spliterator.OfLong> 308289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin implements TestData.OfLong { 309289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 310289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin protected LongTestData(String name, 311289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin I state, 312289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Function<I, LongStream> streamFn, 313289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Function<I, LongStream> parStreamFn, 314289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Function<I, Spliterator.OfLong> splitrFn, 315289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin ToIntFunction<I> sizeFn) { 316289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin super(name, StreamShape.LONG_VALUE, state, streamFn, parStreamFn, splitrFn, sizeFn); 317289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 318289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 319289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin @Override 320289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public PrimitiveIterator.OfLong iterator() { 321289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return Spliterators.iterator(spliterator()); 322289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 323289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 324289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin @Override 325289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public <A extends Collection<? super Long>> A into(A target) { 326289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin spliterator().forEachRemaining((LongConsumer) target::add); 327289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return target; 328289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 329289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 330289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 331289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin static class DoubleTestData<I> 332289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin extends AbstractTestData<Double, DoubleStream, I, Spliterator.OfDouble> 333289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin implements OfDouble { 334289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 335289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin protected DoubleTestData(String name, 336289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin I state, 337289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Function<I, DoubleStream> streamFn, 338289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Function<I, DoubleStream> parStreamFn, 339289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Function<I, Spliterator.OfDouble> splitrFn, 340289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin ToIntFunction<I> sizeFn) { 341289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin super(name, StreamShape.DOUBLE_VALUE, state, streamFn, parStreamFn, splitrFn, sizeFn); 342289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 343289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 344289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin @Override 345289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public PrimitiveIterator.OfDouble iterator() { 346289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return Spliterators.iterator(spliterator()); 347289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 348289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 349289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin @Override 350289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public <A extends Collection<? super Double>> A into(A target) { 351289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin spliterator().forEachRemaining((DoubleConsumer) target::add); 352289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return target; 353289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 354289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 355289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 356289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin} 357