1ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin/*
2ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * Copyright (c) 2013, 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.LongSummaryStatistics;
28ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.Objects;
29ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.OptionalDouble;
30ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.OptionalLong;
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.IntFunction;
37ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.function.LongBinaryOperator;
38ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.function.LongConsumer;
39ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.function.LongFunction;
40ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.function.LongPredicate;
41ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.function.LongToDoubleFunction;
42ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.function.LongToIntFunction;
43ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.function.LongUnaryOperator;
44ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.function.ObjLongConsumer;
45ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.function.Supplier;
46ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
47ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin/**
48ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * Abstract base class for an intermediate pipeline stage or pipeline source
49ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * stage implementing whose elements are of type {@code long}.
50ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin *
51ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * @param  type of elements in the upstream source
52ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * @since 1.8
53289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * @hide Visible for CTS testing only (OpenJDK8 tests).
54ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin */
55289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinpublic abstract class LongPipeline<E_IN>
56ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        extends AbstractPipeline<E_IN, Long, LongStream>
57ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        implements LongStream {
58ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
59ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    /**
60ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * Constructor for the head of a stream pipeline.
61ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *
62ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param source {@code Supplier<Spliterator>} describing the stream source
63ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param sourceFlags the source flags for the stream source, described in
64ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *        {@link StreamOpFlag}
65ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param parallel {@code true} if the pipeline is parallel
66ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     */
67ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    LongPipeline(Supplier<? extends Spliterator<Long>> source,
68ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                 int sourceFlags, boolean parallel) {
69ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        super(source, sourceFlags, parallel);
70ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
71ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
72ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    /**
73ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * Constructor for the head of a stream pipeline.
74ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *
75ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param source {@code Spliterator} describing the stream source
76ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param sourceFlags the source flags for the stream source, described in
77ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *        {@link StreamOpFlag}
78ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param parallel {@code true} if the pipeline is parallel
79ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     */
80ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    LongPipeline(Spliterator<Long> source,
81ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                 int sourceFlags, boolean parallel) {
82ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        super(source, sourceFlags, parallel);
83ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
84ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
85ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    /**
86ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * Constructor for appending an intermediate operation onto an existing pipeline.
87ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *
88ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param upstream the upstream element source.
89ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param opFlags the operation flags
90ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     */
91ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    LongPipeline(AbstractPipeline<?, E_IN, ?> upstream, int opFlags) {
92ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        super(upstream, opFlags);
93ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
94ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
95ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    /**
96ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * Adapt a {@code Sink<Long> to an {@code LongConsumer}, ideally simply
97ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * by casting.
98ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     */
99ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    private static LongConsumer adapt(Sink<Long> sink) {
100ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        if (sink instanceof LongConsumer) {
101ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            return (LongConsumer) sink;
102ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        } else {
103ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            if (Tripwire.ENABLED)
104ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                Tripwire.trip(AbstractPipeline.class,
105ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                              "using LongStream.adapt(Sink<Long> s)");
106ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            return sink::accept;
107ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        }
108ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
109ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
110ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    /**
111ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * Adapt a {@code Spliterator<Long>} to a {@code Spliterator.OfLong}.
112ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *
113ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @implNote
114ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * The implementation attempts to cast to a Spliterator.OfLong, and throws
115ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * an exception if this cast is not possible.
116ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     */
117ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    private static Spliterator.OfLong adapt(Spliterator<Long> s) {
118ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        if (s instanceof Spliterator.OfLong) {
119ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            return (Spliterator.OfLong) s;
120ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        } else {
121ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            if (Tripwire.ENABLED)
122ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                Tripwire.trip(AbstractPipeline.class,
123ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                              "using LongStream.adapt(Spliterator<Long> s)");
124ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            throw new UnsupportedOperationException("LongStream.adapt(Spliterator<Long> s)");
125ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        }
126ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
127ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
128ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
129ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    // Shape-specific methods
130ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
131ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
132289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public final StreamShape getOutputShape() {
133ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return StreamShape.LONG_VALUE;
134ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
135ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
136ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
137289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public final <P_IN> Node<Long> evaluateToNode(PipelineHelper<Long> helper,
138ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                           Spliterator<P_IN> spliterator,
139ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                           boolean flattenTree,
140ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                           IntFunction<Long[]> generator) {
141ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return Nodes.collectLong(helper, spliterator, flattenTree);
142ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
143ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
144ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
145289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public final <P_IN> Spliterator<Long> wrap(PipelineHelper<Long> ph,
146ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                        Supplier<Spliterator<P_IN>> supplier,
147ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                        boolean isParallel) {
148ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return new StreamSpliterators.LongWrappingSpliterator<>(ph, supplier, isParallel);
149ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
150ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
151ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
152ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @SuppressWarnings("unchecked")
153289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public final Spliterator.OfLong lazySpliterator(Supplier<? extends Spliterator<Long>> supplier) {
154ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return new StreamSpliterators.DelegatingSpliterator.OfLong((Supplier<Spliterator.OfLong>) supplier);
155ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
156ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
157ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
158289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public final void forEachWithCancel(Spliterator<Long> spliterator, Sink<Long> sink) {
159ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        Spliterator.OfLong spl = adapt(spliterator);
160ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        LongConsumer adaptedSink =  adapt(sink);
161ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        do { } while (!sink.cancellationRequested() && spl.tryAdvance(adaptedSink));
162ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
163ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
164ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
165289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public final Node.Builder<Long> makeNodeBuilder(long exactSizeIfKnown, IntFunction<Long[]> generator) {
166ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return Nodes.longBuilder(exactSizeIfKnown);
167ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
168ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
169ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
170ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    // LongStream
171ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
172ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
173ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final PrimitiveIterator.OfLong iterator() {
174ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return Spliterators.iterator(spliterator());
175ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
176ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
177ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
178ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final Spliterator.OfLong spliterator() {
179ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return adapt(super.spliterator());
180ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
181ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
182ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    // Stateless intermediate ops from LongStream
183ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
184ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
185ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final DoubleStream asDoubleStream() {
186ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return new DoublePipeline.StatelessOp<Long>(this, StreamShape.LONG_VALUE,
187ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                                    StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT) {
188ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            @Override
189289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            public Sink<Long> opWrapSink(int flags, Sink<Double> sink) {
190ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                return new Sink.ChainedLong<Double>(sink) {
191ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    @Override
192ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    public void accept(long t) {
193ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                        downstream.accept((double) t);
194ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    }
195ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                };
196ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            }
197ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        };
198ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
199ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
200ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
201ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final Stream<Long> boxed() {
202ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return mapToObj(Long::valueOf);
203ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
204ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
205ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
206ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final LongStream map(LongUnaryOperator mapper) {
207ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        Objects.requireNonNull(mapper);
208ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return new StatelessOp<Long>(this, StreamShape.LONG_VALUE,
209ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                     StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT) {
210ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            @Override
211289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            public Sink<Long> opWrapSink(int flags, Sink<Long> sink) {
212ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                return new Sink.ChainedLong<Long>(sink) {
213ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    @Override
214ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    public void accept(long t) {
215ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                        downstream.accept(mapper.applyAsLong(t));
216ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    }
217ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                };
218ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            }
219ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        };
220ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
221ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
222ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
223ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final <U> Stream<U> mapToObj(LongFunction<? extends U> mapper) {
224ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        Objects.requireNonNull(mapper);
225ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return new ReferencePipeline.StatelessOp<Long, U>(this, StreamShape.LONG_VALUE,
226ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                                          StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT) {
227ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            @Override
228289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            public Sink<Long> opWrapSink(int flags, Sink<U> sink) {
229ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                return new Sink.ChainedLong<U>(sink) {
230ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    @Override
231ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    public void accept(long t) {
232ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                        downstream.accept(mapper.apply(t));
233ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    }
234ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                };
235ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            }
236ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        };
237ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
238ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
239ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
240ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final IntStream mapToInt(LongToIntFunction mapper) {
241ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        Objects.requireNonNull(mapper);
242ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return new IntPipeline.StatelessOp<Long>(this, StreamShape.LONG_VALUE,
243ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                                 StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT) {
244ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            @Override
245289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            public Sink<Long> opWrapSink(int flags, Sink<Integer> sink) {
246ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                return new Sink.ChainedLong<Integer>(sink) {
247ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    @Override
248ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    public void accept(long t) {
249ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                        downstream.accept(mapper.applyAsInt(t));
250ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    }
251ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                };
252ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            }
253ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        };
254ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
255ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
256ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
257ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final DoubleStream mapToDouble(LongToDoubleFunction mapper) {
258ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        Objects.requireNonNull(mapper);
259ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return new DoublePipeline.StatelessOp<Long>(this, StreamShape.LONG_VALUE,
260ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                                    StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT) {
261ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            @Override
262289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            public Sink<Long> opWrapSink(int flags, Sink<Double> sink) {
263ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                return new Sink.ChainedLong<Double>(sink) {
264ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    @Override
265ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    public void accept(long t) {
266ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                        downstream.accept(mapper.applyAsDouble(t));
267ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    }
268ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                };
269ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            }
270ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        };
271ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
272ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
273ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
274ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final LongStream flatMap(LongFunction<? extends LongStream> mapper) {
275ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return new StatelessOp<Long>(this, StreamShape.LONG_VALUE,
276ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                     StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT | StreamOpFlag.NOT_SIZED) {
277ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            @Override
278289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            public Sink<Long> opWrapSink(int flags, Sink<Long> sink) {
279ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                return new Sink.ChainedLong<Long>(sink) {
280ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    @Override
281ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    public void begin(long size) {
282ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                        downstream.begin(-1);
283ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    }
284ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
285ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    @Override
286ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    public void accept(long t) {
287ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                        try (LongStream result = mapper.apply(t)) {
288ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                            // We can do better that this too; optimize for depth=0 case and just grab spliterator and forEach it
289ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                            if (result != null)
290ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                result.sequential().forEach(i -> downstream.accept(i));
291ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                        }
292ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    }
293ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                };
294ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            }
295ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        };
296ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
297ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
298ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
299ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public LongStream unordered() {
300ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        if (!isOrdered())
301ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            return this;
302ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return new StatelessOp<Long>(this, StreamShape.LONG_VALUE, StreamOpFlag.NOT_ORDERED) {
303ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            @Override
304289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            public Sink<Long> opWrapSink(int flags, Sink<Long> sink) {
305ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                return sink;
306ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            }
307ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        };
308ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
309ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
310ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
311ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final LongStream filter(LongPredicate predicate) {
312ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        Objects.requireNonNull(predicate);
313ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return new StatelessOp<Long>(this, StreamShape.LONG_VALUE,
314ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                     StreamOpFlag.NOT_SIZED) {
315ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            @Override
316289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            public Sink<Long> opWrapSink(int flags, Sink<Long> sink) {
317ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                return new Sink.ChainedLong<Long>(sink) {
318ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    @Override
319ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    public void begin(long size) {
320ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                        downstream.begin(-1);
321ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    }
322ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
323ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    @Override
324ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    public void accept(long t) {
325ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                        if (predicate.test(t))
326ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                            downstream.accept(t);
327ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    }
328ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                };
329ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            }
330ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        };
331ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
332ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
333ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
334ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final LongStream peek(LongConsumer action) {
335ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        Objects.requireNonNull(action);
336ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return new StatelessOp<Long>(this, StreamShape.LONG_VALUE,
337ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                     0) {
338ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            @Override
339289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            public Sink<Long> opWrapSink(int flags, Sink<Long> sink) {
340ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                return new Sink.ChainedLong<Long>(sink) {
341ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    @Override
342ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    public void accept(long t) {
343ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                        action.accept(t);
344ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                        downstream.accept(t);
345ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    }
346ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                };
347ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            }
348ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        };
349ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
350ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
351ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    // Stateful intermediate ops from LongStream
352ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
353ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
354ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final LongStream limit(long maxSize) {
355ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        if (maxSize < 0)
356ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            throw new IllegalArgumentException(Long.toString(maxSize));
357ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return SliceOps.makeLong(this, 0, maxSize);
358ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
359ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
360ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
361ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final LongStream skip(long n) {
362ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        if (n < 0)
363ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            throw new IllegalArgumentException(Long.toString(n));
364ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        if (n == 0)
365ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            return this;
366ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        else
367ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            return SliceOps.makeLong(this, n, -1);
368ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
369ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
370ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
371ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final LongStream sorted() {
372ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return SortedOps.makeLong(this);
373ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
374ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
375ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
376ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final LongStream distinct() {
377ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        // While functional and quick to implement, this approach is not very efficient.
378ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        // An efficient version requires a long-specific map/set implementation.
379ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return boxed().distinct().mapToLong(i -> (long) i);
380ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
381ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
382ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    // Terminal ops from LongStream
383ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
384ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
385ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public void forEach(LongConsumer action) {
386ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        evaluate(ForEachOps.makeLong(action, false));
387ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
388ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
389ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
390ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public void forEachOrdered(LongConsumer action) {
391ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        evaluate(ForEachOps.makeLong(action, true));
392ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
393ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
394ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
395ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final long sum() {
396ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        // use better algorithm to compensate for intermediate overflow?
397ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return reduce(0, Long::sum);
398ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
399ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
400ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
401ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final OptionalLong min() {
402ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return reduce(Math::min);
403ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
404ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
405ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
406ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final OptionalLong max() {
407ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return reduce(Math::max);
408ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
409ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
410ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
411ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final OptionalDouble average() {
412ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        long[] avg = collect(() -> new long[2],
413ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                             (ll, i) -> {
414ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                 ll[0]++;
415ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                 ll[1] += i;
416ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                             },
417ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                             (ll, rr) -> {
418ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                 ll[0] += rr[0];
419ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                 ll[1] += rr[1];
420ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                             });
421ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return avg[0] > 0
422ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin               ? OptionalDouble.of((double) avg[1] / avg[0])
423ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin               : OptionalDouble.empty();
424ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
425ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
426ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
427ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final long count() {
428ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return map(e -> 1L).sum();
429ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
430ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
431ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
432ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final LongSummaryStatistics summaryStatistics() {
433ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return collect(LongSummaryStatistics::new, LongSummaryStatistics::accept,
434ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                       LongSummaryStatistics::combine);
435ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
436ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
437ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
438ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final long reduce(long identity, LongBinaryOperator op) {
439ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return evaluate(ReduceOps.makeLong(identity, op));
440ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
441ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
442ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
443ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final OptionalLong reduce(LongBinaryOperator op) {
444ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return evaluate(ReduceOps.makeLong(op));
445ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
446ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
447ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
448ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final <R> R collect(Supplier<R> supplier,
449ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                               ObjLongConsumer<R> accumulator,
450ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                               BiConsumer<R, R> combiner) {
451ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        BinaryOperator<R> operator = (left, right) -> {
452ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            combiner.accept(left, right);
453ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            return left;
454ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        };
455ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return evaluate(ReduceOps.makeLong(supplier, accumulator, operator));
456ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
457ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
458ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
459ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final boolean anyMatch(LongPredicate predicate) {
460ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return evaluate(MatchOps.makeLong(predicate, MatchOps.MatchKind.ANY));
461ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
462ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
463ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
464ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final boolean allMatch(LongPredicate predicate) {
465ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return evaluate(MatchOps.makeLong(predicate, MatchOps.MatchKind.ALL));
466ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
467ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
468ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
469ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final boolean noneMatch(LongPredicate predicate) {
470ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return evaluate(MatchOps.makeLong(predicate, MatchOps.MatchKind.NONE));
471ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
472ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
473ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
474ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final OptionalLong findFirst() {
475ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return evaluate(FindOps.makeLong(true));
476ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
477ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
478ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
479ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final OptionalLong findAny() {
480ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return evaluate(FindOps.makeLong(false));
481ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
482ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
483ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    @Override
484ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public final long[] toArray() {
485ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return Nodes.flattenLong((Node.OfLong) evaluateToArrayNode(Long[]::new))
486ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                .asPrimitiveArray();
487ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
488ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
489ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
490ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    //
491ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
492ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    /**
493ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * Source stage of a LongPipeline.
494ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *
495ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param  type of elements in the upstream source
496ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @since 1.8
497289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin     * @hide Visibility for CTS only (OpenJDK 8 streams tests).
498ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     */
499289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static class Head<E_IN> extends LongPipeline<E_IN> {
500ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        /**
501ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * Constructor for the source stage of a LongStream.
502ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         *
503ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * @param source {@code Supplier<Spliterator>} describing the stream
504ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         *               source
505ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * @param sourceFlags the source flags for the stream source, described
506ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         *                    in {@link StreamOpFlag}
507ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * @param parallel {@code true} if the pipeline is parallel
508ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         */
509289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public Head(Supplier<? extends Spliterator<Long>> source,
510ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin             int sourceFlags, boolean parallel) {
511ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            super(source, sourceFlags, parallel);
512ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        }
513ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
514ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        /**
515ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * Constructor for the source stage of a LongStream.
516ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         *
517ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * @param source {@code Spliterator} describing the stream source
518ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * @param sourceFlags the source flags for the stream source, described
519ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         *                    in {@link StreamOpFlag}
520ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * @param parallel {@code true} if the pipeline is parallel
521ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         */
522289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public Head(Spliterator<Long> source,
523ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin             int sourceFlags, boolean parallel) {
524ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            super(source, sourceFlags, parallel);
525ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        }
526ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
527ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        @Override
528289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public final boolean opIsStateful() {
529ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            throw new UnsupportedOperationException();
530ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        }
531ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
532ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        @Override
533289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public final Sink<E_IN> opWrapSink(int flags, Sink<Long> sink) {
534ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            throw new UnsupportedOperationException();
535ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        }
536ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
537ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        // Optimized sequential terminal operations for the head of the pipeline
538ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
539ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        @Override
540ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        public void forEach(LongConsumer action) {
541ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            if (!isParallel()) {
542ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                adapt(sourceStageSpliterator()).forEachRemaining(action);
543ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            } else {
544ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                super.forEach(action);
545ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            }
546ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        }
547ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
548ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        @Override
549ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        public void forEachOrdered(LongConsumer action) {
550ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            if (!isParallel()) {
551ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                adapt(sourceStageSpliterator()).forEachRemaining(action);
552ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            } else {
553ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                super.forEachOrdered(action);
554ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            }
555ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        }
556ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
557ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
558ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    /** Base class for a stateless intermediate stage of a LongStream.
559ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *
560ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param  type of elements in the upstream source
561ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @since 1.8
562289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin     * @hide Visible for CTS testing only (OpenJDK8 tests).
563ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     */
564289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public abstract static class StatelessOp<E_IN> extends LongPipeline<E_IN> {
565ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        /**
566ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * Construct a new LongStream by appending a stateless intermediate
567ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * operation to an existing stream.
568ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * @param upstream The upstream pipeline stage
569ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * @param inputShape The stream shape for the upstream pipeline stage
570ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * @param opFlags Operation flags for the new stage
571ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         */
572289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public StatelessOp(AbstractPipeline<?, E_IN, ?> upstream,
573ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    StreamShape inputShape,
574ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                    int opFlags) {
575ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            super(upstream, opFlags);
576ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            assert upstream.getOutputShape() == inputShape;
577ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        }
578ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
579ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        @Override
580289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public final boolean opIsStateful() {
581ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            return false;
582ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        }
583ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
584ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
585ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    /**
586ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * Base class for a stateful intermediate stage of a LongStream.
587ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *
588ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param  type of elements in the upstream source
589ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @since 1.8
590289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin     * @hide Visible for CTS testing only (OpenJDK8 tests).
591ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     */
592289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public abstract static class StatefulOp<E_IN> extends LongPipeline<E_IN> {
593ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        /**
594ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * Construct a new LongStream by appending a stateful intermediate
595ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * operation to an existing stream.
596ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * @param upstream The upstream pipeline stage
597ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * @param inputShape The stream shape for the upstream pipeline stage
598ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         * @param opFlags Operation flags for the new stage
599289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin         * @hide Visible for CTS testing only (OpenJDK8 tests).
600ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin         */
601289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public StatefulOp(AbstractPipeline<?, E_IN, ?> upstream,
602ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                   StreamShape inputShape,
603ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                   int opFlags) {
604ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            super(upstream, opFlags);
605ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            assert upstream.getOutputShape() == inputShape;
606ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        }
607ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
608ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        @Override
609289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public final boolean opIsStateful() {
610ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            return true;
611ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        }
612ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
613ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        @Override
614289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public abstract <P_IN> Node<Long> opEvaluateParallel(PipelineHelper<Long> helper,
615ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                                      Spliterator<P_IN> spliterator,
616ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                                      IntFunction<Long[]> generator);
617ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
618ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin}
619