1289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin/*
2289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * Copyright (c) 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.stream.AbstractPipeline;
26289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.stream.DoublePipeline;
27289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.stream.IntPipeline;
28289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.stream.LongPipeline;
29289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.stream.ReferencePipeline;
30289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.stream.StreamShape;
31289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.stream.Sink;
32289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
33289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin/**
34289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * The base type of a stateless test operation
35289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin */
36289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkininterface StatelessTestOp<E_IN, E_OUT> extends IntermediateTestOp<E_IN, E_OUT> {
37289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
38289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    @SuppressWarnings({"rawtypes", "unchecked"})
39289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static<T> AbstractPipeline chain(AbstractPipeline upstream,
40289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                            StatelessTestOp<?, T> op) {
41289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        int flags = op.opGetFlags();
42289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        switch (op.outputShape()) {
43289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            case REFERENCE:
44289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                return new ReferencePipeline.StatelessOp<Object, T>(upstream, op.inputShape(), flags) {
45289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                    @Override
46289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                    public Sink opWrapSink(int flags, Sink<T> sink) {
47289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                        return op.opWrapSink(flags, isParallel(), sink);
48289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                    }
49289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                };
50289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            case INT_VALUE:
51289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                return new IntPipeline.StatelessOp<Object>(upstream, op.inputShape(), flags) {
52289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                    @Override
53289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                    public Sink opWrapSink(int flags, Sink sink) {
54289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                        return op.opWrapSink(flags, isParallel(), sink);
55289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                    }
56289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                };
57289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            case LONG_VALUE:
58289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                return new LongPipeline.StatelessOp<Object>(upstream, op.inputShape(), flags) {
59289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                    @Override
60289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                    public Sink opWrapSink(int flags, Sink sink) {
61289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                        return op.opWrapSink(flags, isParallel(), sink);
62289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                    }
63289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                };
64289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            case DOUBLE_VALUE:
65289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                return new DoublePipeline.StatelessOp<Object>(upstream, op.inputShape(), flags) {
66289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                    @Override
67289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                    public Sink opWrapSink(int flags, Sink sink) {
68289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                        return op.opWrapSink(flags, isParallel(), sink);
69289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                    }
70289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                };
71289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            default: throw new IllegalStateException(op.outputShape().toString());
72289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
73289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
74289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
75289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    default StreamShape inputShape() { return StreamShape.REFERENCE; }
76289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
77289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    default StreamShape outputShape() { return StreamShape.REFERENCE; }
78289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
79289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    default int opGetFlags() { return 0; }
80289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
81289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    Sink<E_IN> opWrapSink(int flags, boolean parallel, Sink<E_OUT> sink);
82289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin}
83289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
84