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.Spliterator; 26289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.function.IntFunction; 27289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.stream.*; 28289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 29289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin/** 30289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * The base type for a stateful test operation. 31289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin */ 32289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkininterface StatefulTestOp<E> extends IntermediateTestOp<E, E> { 33289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 34289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin @SuppressWarnings({"rawtypes", "unchecked"}) 35289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public static<T> AbstractPipeline chain(AbstractPipeline upstream, 36289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin StatefulTestOp op) { 37289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin switch (op.outputShape()) { 38289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin case REFERENCE: 39289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return new ReferencePipeline.StatefulOp<Object, T>(upstream, op.inputShape(), op.opGetFlags()) { 40289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin @Override 41289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public Sink opWrapSink(int flags, Sink sink) { 42289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return op.opWrapSink(flags, isParallel(), sink); 43289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 44289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 45289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin @Override 46289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public <P_IN> Spliterator<T> opEvaluateParallelLazy(PipelineHelper<T> helper, 47289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Spliterator<P_IN> spliterator) { 48289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return op.opEvaluateParallelLazy(helper, spliterator); 49289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 50289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 51289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin @Override 52289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public <P_IN> Node<T> opEvaluateParallel(PipelineHelper<T> helper, 53289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Spliterator<P_IN> spliterator, 54289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin IntFunction<T[]> generator) { 55289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return op.opEvaluateParallel(helper, spliterator, generator); 56289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 57289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin }; 58289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin case INT_VALUE: 59289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return new IntPipeline.StatefulOp<Object>(upstream, op.inputShape(), op.opGetFlags()) { 60289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin @Override 61289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public Sink opWrapSink(int flags, Sink sink) { 62289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return op.opWrapSink(flags, isParallel(), sink); 63289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 64289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 65289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin @Override 66289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public <P_IN> Spliterator<Integer> opEvaluateParallelLazy(PipelineHelper<Integer> helper, 67289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Spliterator<P_IN> spliterator) { 68289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return op.opEvaluateParallelLazy(helper, spliterator); 69289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 70289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 71289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin @Override 72289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public <P_IN> Node<Integer> opEvaluateParallel(PipelineHelper<Integer> helper, 73289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Spliterator<P_IN> spliterator, 74289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin IntFunction<Integer[]> generator) { 75289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return (Node<Integer>) op.opEvaluateParallel(helper, spliterator, generator); 76289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 77289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin }; 78289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin case LONG_VALUE: 79289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return new LongPipeline.StatefulOp<Object>(upstream, op.inputShape(), op.opGetFlags()) { 80289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin @Override 81289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public Sink opWrapSink(int flags, Sink sink) { 82289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return op.opWrapSink(flags, isParallel(), sink); 83289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 84289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 85289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public @Override 86289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin <P_IN> Spliterator<Long> opEvaluateParallelLazy(PipelineHelper<Long> helper, 87289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Spliterator<P_IN> spliterator) { 88289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return op.opEvaluateParallelLazy(helper, spliterator); 89289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 90289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 91289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public @Override 92289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin <P_IN> Node<Long> opEvaluateParallel(PipelineHelper<Long> helper, 93289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Spliterator<P_IN> spliterator, 94289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin IntFunction<Long[]> generator) { 95289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return (Node<Long>) op.opEvaluateParallel(helper, spliterator, generator); 96289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 97289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin }; 98289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin case DOUBLE_VALUE: 99289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return new DoublePipeline.StatefulOp<Object>(upstream, op.inputShape(), op.opGetFlags()) { 100289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin @Override 101289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public Sink opWrapSink(int flags, Sink sink) { 102289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return op.opWrapSink(flags, isParallel(), sink); 103289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 104289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 105289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin @Override 106289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public <P_IN> Spliterator<Double> opEvaluateParallelLazy(PipelineHelper<Double> helper, 107289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Spliterator<P_IN> spliterator) { 108289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return op.opEvaluateParallelLazy(helper, spliterator); 109289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 110289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 111289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin @Override 112289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public <P_IN> Node<Double> opEvaluateParallel(PipelineHelper<Double> helper, 113289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Spliterator<P_IN> spliterator, 114289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin IntFunction<Double[]> generator) { 115289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return (Node<Double>) op.opEvaluateParallel(helper, spliterator, generator); 116289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 117289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin }; 118289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin default: throw new IllegalStateException(op.outputShape().toString()); 119289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 120289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 121289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 122289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin default StreamShape inputShape() { return StreamShape.REFERENCE; } 123289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 124289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin default StreamShape outputShape() { return StreamShape.REFERENCE; } 125289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 126289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin default int opGetFlags() { return 0; } 127289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 128289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Sink<E> opWrapSink(int flags, boolean parallel, Sink<E> sink); 129289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 130289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin @SuppressWarnings("unchecked") 131289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin default <P_IN> Spliterator<E> opEvaluateParallelLazy(PipelineHelper<E> helper, 132289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Spliterator<P_IN> spliterator) { 133289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin return opEvaluateParallel(helper, spliterator, i -> (E[]) new Object[i]).spliterator(); 134289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin } 135289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin 136289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin <P_IN> Node<E> opEvaluateParallel(PipelineHelper<E> helper, 137289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin Spliterator<P_IN> spliterator, 138289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin IntFunction<E[]> generator); 139289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin} 140