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