1ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin/*
2ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
3ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin *
5ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * This code is free software; you can redistribute it and/or modify it
6ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * under the terms of the GNU General Public License version 2 only, as
7ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * published by the Free Software Foundation.  Oracle designates this
8ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * particular file as subject to the "Classpath" exception as provided
9ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * by Oracle in the LICENSE file that accompanied this code.
10ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin *
11ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * This code is distributed in the hope that it will be useful, but WITHOUT
12ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * version 2 for more details (a copy is included in the LICENSE file that
15ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * accompanied this code).
16ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin *
17ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * You should have received a copy of the GNU General Public License version
18ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * 2 along with this work; if not, write to the Free Software Foundation,
19ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin *
21ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * or visit www.oracle.com if you need additional information or have any
23ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * questions.
24ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin */
25ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinpackage java.util.stream;
26ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
27ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.IntSummaryStatistics;
28ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.Objects;
29ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.OptionalDouble;
30ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.OptionalInt;
31ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.PrimitiveIterator;
32ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.Spliterator;
33ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.Spliterators;
34ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.function.BiConsumer;
35ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.function.BinaryOperator;
36ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.function.IntBinaryOperator;
37ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.function.IntConsumer;
38ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.function.IntFunction;
39ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.function.IntPredicate;
40ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.function.IntToDoubleFunction;
41ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.function.IntToLongFunction;
42ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.function.IntUnaryOperator;
43ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.function.ObjIntConsumer;
44ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.function.Supplier;
45ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
46ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin/**
47ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * Abstract base class for an intermediate pipeline stage or pipeline source
48ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * stage implementing whose elements are of type {@code int}.
49ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin *
50ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * @param  type of elements in the upstream source
51ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * @since 1.8
52289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * @hide Visible for CTS testing only (OpenJDK8 tests).
53ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin */
54289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinpublic abstract class IntPipeline<E_IN>
55ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        extends AbstractPipeline<E_IN, Integer, IntStream>
56ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        implements IntStream {
57ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
58ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    /**
59ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * Constructor for the head of a stream pipeline.
60ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *
61ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param source {@code Supplier<Spliterator>} describing the stream source
62ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param sourceFlags The source flags for the stream source, described in
63ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *        {@link StreamOpFlag}
64ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param parallel {@code true} if the pipeline is parallel
65ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     */
66ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    IntPipeline(Supplier<? extends Spliterator<Integer>> source,
67ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                int sourceFlags, boolean parallel) {
68ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        super(source, sourceFlags, parallel);
69ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
70ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
71ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    /**
72ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * Constructor for the head of a stream pipeline.
73ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *
74ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param source {@code Spliterator} describing the stream source
75ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param sourceFlags The source flags for the stream source, described in
76ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *        {@link StreamOpFlag}
77ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param parallel {@code true} if the pipeline is parallel
78ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     */
79ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    IntPipeline(Spliterator<Integer> source,
80ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                int sourceFlags, boolean parallel) {
81ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        super(source, sourceFlags, parallel);
82ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
83ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
84ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    /**
85ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * Constructor for appending an intermediate operation onto an existing
86ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * pipeline.
87ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *
88ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param upstream the upstream element source
89ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param opFlags the operation flags for the new operation
90ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     */
91ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    IntPipeline(AbstractPipeline<?, E_IN, ?> upstream, int opFlags) {
92ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        super(upstream, opFlags);
93ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
94ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
95ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    /**
96ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * Adapt a {@code Sink<Integer> to an {@code IntConsumer}, ideally simply
97ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * by casting.
98ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     */
99ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    private static IntConsumer adapt(Sink<Integer> sink) {
100ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        if (sink instanceof IntConsumer) {
101ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            return (IntConsumer) sink;
102ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        }
103ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        else {
104ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            if (Tripwire.ENABLED)
105ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                Tripwire.trip(AbstractPipeline.class,
106ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                              "using IntStream.adapt(Sink<Integer> s)");
107ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            return sink::accept;
108ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        }
109ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
110ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
111ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    /**
112ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * Adapt a {@code Spliterator<Integer>} to a {@code Spliterator.OfInt}.
113ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *
114ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @implNote
115ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * The implementation attempts to cast to a Spliterator.OfInt, and throws an
116ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * exception if this cast is not possible.
117ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     */
118ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    private static Spliterator.OfInt adapt(Spliterator<Integer> s) {
119ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        if (s instanceof Spliterator.OfInt) {
120ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            return (Spliterator.OfInt) s;
121ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        }
122ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        else {
123ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            if (Tripwire.ENABLED)
124ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                Tripwire.trip(AbstractPipeline.class,
125ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                              "using IntStream.adapt(Spliterator<Integer> s)");
126ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            throw new UnsupportedOperationException("IntStream.adapt(Spliterator<Integer> s)");
127ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        }
128ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
129ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
130ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
131ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    // Shape-specific methods
132ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
133ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
134289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public final StreamShape getOutputShape() {
135ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return StreamShape.INT_VALUE;
136ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
137ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
138ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
139289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public final <P_IN> Node<Integer> evaluateToNode(PipelineHelper<Integer> helper,
140289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                     Spliterator<P_IN> spliterator,
141289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                     boolean flattenTree,
142289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                     IntFunction<Integer[]> generator) {
143ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return Nodes.collectInt(helper, spliterator, flattenTree);
144ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
145ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
146ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
147289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public final <P_IN> Spliterator<Integer> wrap(PipelineHelper<Integer> ph,
148289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                  Supplier<Spliterator<P_IN>> supplier,
149289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                  boolean isParallel) {
150ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return new StreamSpliterators.IntWrappingSpliterator<>(ph, supplier, isParallel);
151ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
152ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
153ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
154ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @SuppressWarnings("unchecked")
155289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public final Spliterator.OfInt lazySpliterator(Supplier<? extends Spliterator<Integer>> supplier) {
156ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return new StreamSpliterators.DelegatingSpliterator.OfInt((Supplier<Spliterator.OfInt>) supplier);
157ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
158ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
159ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
160289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public final void forEachWithCancel(Spliterator<Integer> spliterator, Sink<Integer> sink) {
161ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        Spliterator.OfInt spl = adapt(spliterator);
162ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        IntConsumer adaptedSink = adapt(sink);
163ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        do { } while (!sink.cancellationRequested() && spl.tryAdvance(adaptedSink));
164ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
165ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
166ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
167289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public final Node.Builder<Integer> makeNodeBuilder(long exactSizeIfKnown,
168289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                       IntFunction<Integer[]> generator) {
169ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return Nodes.intBuilder(exactSizeIfKnown);
170ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
171ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
172ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
173ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    // IntStream
174ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
175ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
176ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final PrimitiveIterator.OfInt iterator() {
177ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return Spliterators.iterator(spliterator());
178ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
179ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
180ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
181ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final Spliterator.OfInt spliterator() {
182ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return adapt(super.spliterator());
183ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
184ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
185ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    // Stateless intermediate ops from IntStream
186ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
187ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
188ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final LongStream asLongStream() {
189ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return new LongPipeline.StatelessOp<Integer>(this, StreamShape.INT_VALUE,
190ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                                     StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT) {
191ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            @Override
192289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            public Sink<Integer> opWrapSink(int flags, Sink<Long> sink) {
193ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                return new Sink.ChainedInt<Long>(sink) {
194ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    @Override
195ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    public void accept(int t) {
196ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                        downstream.accept((long) t);
197ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    }
198ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                };
199ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            }
200ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        };
201ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
202ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
203ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
204ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final DoubleStream asDoubleStream() {
205ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return new DoublePipeline.StatelessOp<Integer>(this, StreamShape.INT_VALUE,
206ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                                       StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT) {
207ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            @Override
208289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            public Sink<Integer> opWrapSink(int flags, Sink<Double> sink) {
209ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                return new Sink.ChainedInt<Double>(sink) {
210ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    @Override
211ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    public void accept(int t) {
212ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                        downstream.accept((double) t);
213ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    }
214ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                };
215ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            }
216ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        };
217ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
218ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
219ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
220ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final Stream<Integer> boxed() {
221ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return mapToObj(Integer::valueOf);
222ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
223ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
224ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
225ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final IntStream map(IntUnaryOperator mapper) {
226ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        Objects.requireNonNull(mapper);
227ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return new StatelessOp<Integer>(this, StreamShape.INT_VALUE,
228ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                        StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT) {
229ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            @Override
230289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            public Sink<Integer> opWrapSink(int flags, Sink<Integer> sink) {
231ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                return new Sink.ChainedInt<Integer>(sink) {
232ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    @Override
233ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    public void accept(int t) {
234ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                        downstream.accept(mapper.applyAsInt(t));
235ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    }
236ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                };
237ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            }
238ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        };
239ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
240ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
241ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
242ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final <U> Stream<U> mapToObj(IntFunction<? extends U> mapper) {
243ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        Objects.requireNonNull(mapper);
244ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return new ReferencePipeline.StatelessOp<Integer, U>(this, StreamShape.INT_VALUE,
245ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                                             StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT) {
246ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            @Override
247289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            public Sink<Integer> opWrapSink(int flags, Sink<U> sink) {
248ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                return new Sink.ChainedInt<U>(sink) {
249ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    @Override
250ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    public void accept(int t) {
251ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                        downstream.accept(mapper.apply(t));
252ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    }
253ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                };
254ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            }
255ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        };
256ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
257ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
258ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
259ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final LongStream mapToLong(IntToLongFunction mapper) {
260ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        Objects.requireNonNull(mapper);
261ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return new LongPipeline.StatelessOp<Integer>(this, StreamShape.INT_VALUE,
262ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                                     StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT) {
263ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            @Override
264289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            public Sink<Integer> opWrapSink(int flags, Sink<Long> sink) {
265ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                return new Sink.ChainedInt<Long>(sink) {
266ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    @Override
267ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    public void accept(int t) {
268ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                        downstream.accept(mapper.applyAsLong(t));
269ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    }
270ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                };
271ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            }
272ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        };
273ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
274ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
275ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
276ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final DoubleStream mapToDouble(IntToDoubleFunction mapper) {
277ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        Objects.requireNonNull(mapper);
278ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return new DoublePipeline.StatelessOp<Integer>(this, StreamShape.INT_VALUE,
279ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                                       StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT) {
280ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            @Override
281289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            public Sink<Integer> opWrapSink(int flags, Sink<Double> sink) {
282ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                return new Sink.ChainedInt<Double>(sink) {
283ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    @Override
284ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    public void accept(int t) {
285ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                        downstream.accept(mapper.applyAsDouble(t));
286ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    }
287ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                };
288ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            }
289ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        };
290ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
291ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
292ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
293ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final IntStream flatMap(IntFunction<? extends IntStream> mapper) {
294ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return new StatelessOp<Integer>(this, StreamShape.INT_VALUE,
295ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                        StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT | StreamOpFlag.NOT_SIZED) {
296ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            @Override
297289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            public Sink<Integer> opWrapSink(int flags, Sink<Integer> sink) {
298ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                return new Sink.ChainedInt<Integer>(sink) {
299ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    @Override
300ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    public void begin(long size) {
301ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                        downstream.begin(-1);
302ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    }
303ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
304ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    @Override
305ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    public void accept(int t) {
306ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                        try (IntStream result = mapper.apply(t)) {
307ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                            // We can do better that this too; optimize for depth=0 case and just grab spliterator and forEach it
308ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                            if (result != null)
309ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                result.sequential().forEach(i -> downstream.accept(i));
310ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                        }
311ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    }
312ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                };
313ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            }
314ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        };
315ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
316ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
317ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
318ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public IntStream unordered() {
319ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        if (!isOrdered())
320ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            return this;
321ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return new StatelessOp<Integer>(this, StreamShape.INT_VALUE, StreamOpFlag.NOT_ORDERED) {
322ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            @Override
323289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            public Sink<Integer> opWrapSink(int flags, Sink<Integer> sink) {
324ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                return sink;
325ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            }
326ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        };
327ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
328ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
329ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
330ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final IntStream filter(IntPredicate predicate) {
331ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        Objects.requireNonNull(predicate);
332ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return new StatelessOp<Integer>(this, StreamShape.INT_VALUE,
333ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                        StreamOpFlag.NOT_SIZED) {
334ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            @Override
335289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            public Sink<Integer> opWrapSink(int flags, Sink<Integer> sink) {
336ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                return new Sink.ChainedInt<Integer>(sink) {
337ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    @Override
338ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    public void begin(long size) {
339ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                        downstream.begin(-1);
340ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    }
341ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
342ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    @Override
343ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    public void accept(int t) {
344ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                        if (predicate.test(t))
345ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                            downstream.accept(t);
346ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    }
347ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                };
348ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            }
349ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        };
350ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
351ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
352ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
353ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final IntStream peek(IntConsumer action) {
354ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        Objects.requireNonNull(action);
355ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return new StatelessOp<Integer>(this, StreamShape.INT_VALUE,
356ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                        0) {
357ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            @Override
358289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            public Sink<Integer> opWrapSink(int flags, Sink<Integer> sink) {
359ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                return new Sink.ChainedInt<Integer>(sink) {
360ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    @Override
361ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    public void accept(int t) {
362ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                        action.accept(t);
363ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                        downstream.accept(t);
364ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    }
365ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                };
366ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            }
367ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        };
368ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
369ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
370ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    // Stateful intermediate ops from IntStream
371ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
372ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
373ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final IntStream limit(long maxSize) {
374ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        if (maxSize < 0)
375ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            throw new IllegalArgumentException(Long.toString(maxSize));
376ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return SliceOps.makeInt(this, 0, maxSize);
377ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
378ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
379ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
380ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final IntStream skip(long n) {
381ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        if (n < 0)
382ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            throw new IllegalArgumentException(Long.toString(n));
383ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        if (n == 0)
384ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            return this;
385ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        else
386ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            return SliceOps.makeInt(this, n, -1);
387ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
388ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
389ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
390ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final IntStream sorted() {
391ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return SortedOps.makeInt(this);
392ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
393ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
394ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
395ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final IntStream distinct() {
396ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        // While functional and quick to implement, this approach is not very efficient.
397ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        // An efficient version requires an int-specific map/set implementation.
398ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return boxed().distinct().mapToInt(i -> i);
399ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
400ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
401ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    // Terminal ops from IntStream
402ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
403ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
404ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public void forEach(IntConsumer action) {
405ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        evaluate(ForEachOps.makeInt(action, false));
406ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
407ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
408ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
409ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public void forEachOrdered(IntConsumer action) {
410ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        evaluate(ForEachOps.makeInt(action, true));
411ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
412ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
413ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
414ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final int sum() {
415ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return reduce(0, Integer::sum);
416ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
417ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
418ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
419ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final OptionalInt min() {
420ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return reduce(Math::min);
421ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
422ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
423ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
424ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final OptionalInt max() {
425ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return reduce(Math::max);
426ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
427ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
428ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
429ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final long count() {
430ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return mapToLong(e -> 1L).sum();
431ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
432ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
433ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
434ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final OptionalDouble average() {
435ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        long[] avg = collect(() -> new long[2],
436ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                             (ll, i) -> {
437ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                 ll[0]++;
438ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                 ll[1] += i;
439ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                             },
440ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                             (ll, rr) -> {
441ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                 ll[0] += rr[0];
442ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                 ll[1] += rr[1];
443ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                             });
444ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return avg[0] > 0
445ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin               ? OptionalDouble.of((double) avg[1] / avg[0])
446ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin               : OptionalDouble.empty();
447ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
448ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
449ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
450ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final IntSummaryStatistics summaryStatistics() {
451ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return collect(IntSummaryStatistics::new, IntSummaryStatistics::accept,
452ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                       IntSummaryStatistics::combine);
453ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
454ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
455ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
456ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final int reduce(int identity, IntBinaryOperator op) {
457ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return evaluate(ReduceOps.makeInt(identity, op));
458ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
459ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
460ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
461ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final OptionalInt reduce(IntBinaryOperator op) {
462ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return evaluate(ReduceOps.makeInt(op));
463ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
464ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
465ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
466ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final <R> R collect(Supplier<R> supplier,
467ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                               ObjIntConsumer<R> accumulator,
468ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                               BiConsumer<R, R> combiner) {
469ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        BinaryOperator<R> operator = (left, right) -> {
470ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            combiner.accept(left, right);
471ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            return left;
472ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        };
473ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return evaluate(ReduceOps.makeInt(supplier, accumulator, operator));
474ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
475ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
476ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
477ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final boolean anyMatch(IntPredicate predicate) {
478ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return evaluate(MatchOps.makeInt(predicate, MatchOps.MatchKind.ANY));
479ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
480ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
481ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
482ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final boolean allMatch(IntPredicate predicate) {
483ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return evaluate(MatchOps.makeInt(predicate, MatchOps.MatchKind.ALL));
484ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
485ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
486ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
487ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final boolean noneMatch(IntPredicate predicate) {
488ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return evaluate(MatchOps.makeInt(predicate, MatchOps.MatchKind.NONE));
489ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
490ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
491ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
492ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final OptionalInt findFirst() {
493ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return evaluate(FindOps.makeInt(true));
494ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
495ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
496ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
497ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final OptionalInt findAny() {
498ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return evaluate(FindOps.makeInt(false));
499ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
500ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
501ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
502ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final int[] toArray() {
503ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return Nodes.flattenInt((Node.OfInt) evaluateToArrayNode(Integer[]::new))
504ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                        .asPrimitiveArray();
505ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
506ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
507ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    //
508ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
509ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    /**
510ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * Source stage of an IntStream.
511ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *
512ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param  type of elements in the upstream source
513ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @since 1.8
514289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin     * @hide Visible for CTS testing only (OpenJDK8 tests).
515ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     */
516289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static class Head<E_IN> extends IntPipeline<E_IN> {
517ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        /**
518ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * Constructor for the source stage of an IntStream.
519ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         *
520ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * @param source {@code Supplier<Spliterator>} describing the stream
521ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         *               source
522ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * @param sourceFlags the source flags for the stream source, described
523ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         *                    in {@link StreamOpFlag}
524ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * @param parallel {@code true} if the pipeline is parallel
525ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         */
526289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public Head(Supplier<? extends Spliterator<Integer>> source,
527ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin             int sourceFlags, boolean parallel) {
528ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            super(source, sourceFlags, parallel);
529ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        }
530ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
531ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        /**
532ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * Constructor for the source stage of an IntStream.
533ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         *
534ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * @param source {@code Spliterator} describing the stream source
535ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * @param sourceFlags the source flags for the stream source, described
536ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         *                    in {@link StreamOpFlag}
537ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * @param parallel {@code true} if the pipeline is parallel
538ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         */
539289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public Head(Spliterator<Integer> source,
540ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin             int sourceFlags, boolean parallel) {
541ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            super(source, sourceFlags, parallel);
542ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        }
543ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
544ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        @Override
545289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public final boolean opIsStateful() {
546ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            throw new UnsupportedOperationException();
547ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        }
548ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
549ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        @Override
550289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public final Sink<E_IN> opWrapSink(int flags, Sink<Integer> sink) {
551ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            throw new UnsupportedOperationException();
552ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        }
553ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
554ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        // Optimized sequential terminal operations for the head of the pipeline
555ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
556ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        @Override
557ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        public void forEach(IntConsumer action) {
558ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            if (!isParallel()) {
559ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                adapt(sourceStageSpliterator()).forEachRemaining(action);
560ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            }
561ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            else {
562ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                super.forEach(action);
563ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            }
564ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        }
565ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
566ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        @Override
567ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        public void forEachOrdered(IntConsumer action) {
568ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            if (!isParallel()) {
569ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                adapt(sourceStageSpliterator()).forEachRemaining(action);
570ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            }
571ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            else {
572ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                super.forEachOrdered(action);
573ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            }
574ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        }
575ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
576ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
577ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    /**
578ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * Base class for a stateless intermediate stage of an IntStream
579ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *
580ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param  type of elements in the upstream source
581ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @since 1.8
582289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin     * @hide Visible for CTS testing only (OpenJDK8 tests).
583ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     */
584289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public abstract static class StatelessOp<E_IN> extends IntPipeline<E_IN> {
585ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        /**
586ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * Construct a new IntStream by appending a stateless intermediate
587ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * operation to an existing stream.
588ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * @param upstream The upstream pipeline stage
589ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * @param inputShape The stream shape for the upstream pipeline stage
590ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * @param opFlags Operation flags for the new stage
591ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         */
592289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public StatelessOp(AbstractPipeline<?, E_IN, ?> upstream,
593ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    StreamShape inputShape,
594ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    int opFlags) {
595ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            super(upstream, opFlags);
596ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            assert upstream.getOutputShape() == inputShape;
597ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        }
598ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
599ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        @Override
600289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public final boolean opIsStateful() {
601ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            return false;
602ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        }
603ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
604ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
605ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    /**
606ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * Base class for a stateful intermediate stage of an IntStream.
607ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *
608ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param  type of elements in the upstream source
609ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @since 1.8
610289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin     * @hide Visible for CTS testing only (OpenJDK8 tests).
611ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     */
612289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public abstract static class StatefulOp<E_IN> extends IntPipeline<E_IN> {
613ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        /**
614ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * Construct a new IntStream by appending a stateful intermediate
615ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * operation to an existing stream.
616ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * @param upstream The upstream pipeline stage
617ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * @param inputShape The stream shape for the upstream pipeline stage
618ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * @param opFlags Operation flags for the new stage
619ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         */
620289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public StatefulOp(AbstractPipeline<?, E_IN, ?> upstream,
621ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                   StreamShape inputShape,
622ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                   int opFlags) {
623ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            super(upstream, opFlags);
624ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            assert upstream.getOutputShape() == inputShape;
625ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        }
626ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
627ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        @Override
628289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public final boolean opIsStateful() {
629ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            return true;
630ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        }
631ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
632ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        @Override
633289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public abstract <P_IN> Node<Integer> opEvaluateParallel(PipelineHelper<Integer> helper,
634ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                                         Spliterator<P_IN> spliterator,
635ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                                         IntFunction<Integer[]> generator);
636ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
637ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin}
638