jdk/src/share/classes/java/util/stream/ForEachOps.java
author henryjen
Mon, 08 Jul 2013 15:46:26 -0400
changeset 18825 06636235cd12
parent 18795 25d68f4a1b38
child 19218 8e7212b90b81
permissions -rw-r--r--
8020062: Nest StreamBuilder interfaces inside relevant Stream interfaces Reviewed-by: psandoz, mduigou Contributed-by: brian goetz <brian.goetz@oracle.com>
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
     1
/*
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
     2
 * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
     4
 *
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    10
 *
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    15
 * accompanied this code).
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    16
 *
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    20
 *
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    23
 * questions.
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    24
 */
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    25
package java.util.stream;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    26
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    27
import java.util.Objects;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    28
import java.util.Spliterator;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    29
import java.util.concurrent.ConcurrentHashMap;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    30
import java.util.concurrent.CountedCompleter;
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
    31
import java.util.concurrent.ForkJoinTask;
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    32
import java.util.function.Consumer;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    33
import java.util.function.DoubleConsumer;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    34
import java.util.function.IntConsumer;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    35
import java.util.function.LongConsumer;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    36
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    37
/**
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    38
 * Factory for creating instances of {@code TerminalOp} that perform an
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    39
 * action for every element of a stream.  Supported variants include unordered
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    40
 * traversal (elements are provided to the {@code Consumer} as soon as they are
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    41
 * available), and ordered traversal (elements are provided to the
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    42
 * {@code Consumer} in encounter order.)
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    43
 *
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    44
 * <p>Elements are provided to the {@code Consumer} on whatever thread and
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    45
 * whatever order they become available.  For ordered traversals, it is
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    46
 * guaranteed that processing an element <em>happens-before</em> processing
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    47
 * subsequent elements in the encounter order.
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    48
 *
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    49
 * <p>Exceptions occurring as a result of sending an element to the
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    50
 * {@code Consumer} will be relayed to the caller and traversal will be
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    51
 * prematurely terminated.
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    52
 *
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    53
 * @since 1.8
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    54
 */
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    55
final class ForEachOps {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    56
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    57
    private ForEachOps() { }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    58
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    59
    /**
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    60
     * Constructs a {@code TerminalOp} that perform an action for every element
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    61
     * of a stream.
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    62
     *
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    63
     * @param action the {@code Consumer} that receives all elements of a
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    64
     *        stream
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    65
     * @param ordered whether an ordered traversal is requested
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    66
     * @param <T> the type of the stream elements
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    67
     * @return the {@code TerminalOp} instance
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    68
     */
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    69
    public static <T> TerminalOp<T, Void> makeRef(Consumer<? super T> action,
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    70
                                                  boolean ordered) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    71
        Objects.requireNonNull(action);
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    72
        return new ForEachOp.OfRef<>(action, ordered);
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    73
    }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    74
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    75
    /**
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    76
     * Constructs a {@code TerminalOp} that perform an action for every element
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    77
     * of an {@code IntStream}.
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    78
     *
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    79
     * @param action the {@code IntConsumer} that receives all elements of a
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    80
     *        stream
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    81
     * @param ordered whether an ordered traversal is requested
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    82
     * @return the {@code TerminalOp} instance
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    83
     */
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    84
    public static TerminalOp<Integer, Void> makeInt(IntConsumer action,
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    85
                                                    boolean ordered) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    86
        Objects.requireNonNull(action);
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    87
        return new ForEachOp.OfInt(action, ordered);
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    88
    }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    89
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    90
    /**
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    91
     * Constructs a {@code TerminalOp} that perform an action for every element
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    92
     * of a {@code LongStream}.
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    93
     *
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    94
     * @param action the {@code LongConsumer} that receives all elements of a
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    95
     *        stream
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    96
     * @param ordered whether an ordered traversal is requested
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    97
     * @return the {@code TerminalOp} instance
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    98
     */
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    99
    public static TerminalOp<Long, Void> makeLong(LongConsumer action,
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   100
                                                  boolean ordered) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   101
        Objects.requireNonNull(action);
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   102
        return new ForEachOp.OfLong(action, ordered);
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   103
    }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   104
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   105
    /**
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   106
     * Constructs a {@code TerminalOp} that perform an action for every element
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   107
     * of a {@code DoubleStream}.
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   108
     *
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   109
     * @param action the {@code DoubleConsumer} that receives all elements of
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   110
     *        a stream
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   111
     * @param ordered whether an ordered traversal is requested
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   112
     * @return the {@code TerminalOp} instance
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   113
     */
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   114
    public static TerminalOp<Double, Void> makeDouble(DoubleConsumer action,
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   115
                                                      boolean ordered) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   116
        Objects.requireNonNull(action);
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   117
        return new ForEachOp.OfDouble(action, ordered);
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   118
    }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   119
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   120
    /**
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   121
     * A {@code TerminalOp} that evaluates a stream pipeline and sends the
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   122
     * output to itself as a {@code TerminalSink}.  Elements will be sent in
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   123
     * whatever thread they become available.  If the traversal is unordered,
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   124
     * they will be sent independent of the stream's encounter order.
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   125
     *
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   126
     * <p>This terminal operation is stateless.  For parallel evaluation, each
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   127
     * leaf instance of a {@code ForEachTask} will send elements to the same
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   128
     * {@code TerminalSink} reference that is an instance of this class.
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   129
     *
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   130
     * @param <T> the output type of the stream pipeline
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   131
     */
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   132
    static abstract class ForEachOp<T>
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   133
            implements TerminalOp<T, Void>, TerminalSink<T, Void> {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   134
        private final boolean ordered;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   135
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   136
        protected ForEachOp(boolean ordered) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   137
            this.ordered = ordered;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   138
        }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   139
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   140
        // TerminalOp
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   141
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   142
        @Override
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   143
        public int getOpFlags() {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   144
            return ordered ? 0 : StreamOpFlag.NOT_ORDERED;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   145
        }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   146
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   147
        @Override
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   148
        public <S> Void evaluateSequential(PipelineHelper<T> helper,
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   149
                                           Spliterator<S> spliterator) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   150
            return helper.wrapAndCopyInto(this, spliterator).get();
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   151
        }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   152
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   153
        @Override
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   154
        public <S> Void evaluateParallel(PipelineHelper<T> helper,
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   155
                                         Spliterator<S> spliterator) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   156
            if (ordered)
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   157
                new ForEachOrderedTask<>(helper, spliterator, this).invoke();
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   158
            else
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   159
                new ForEachTask<>(helper, spliterator, helper.wrapSink(this)).invoke();
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   160
            return null;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   161
        }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   162
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   163
        // TerminalSink
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   164
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   165
        @Override
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   166
        public Void get() {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   167
            return null;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   168
        }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   169
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   170
        // Implementations
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   171
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   172
        /** Implementation class for reference streams */
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   173
        static final class OfRef<T> extends ForEachOp<T> {
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   174
            final Consumer<? super T> consumer;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   175
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   176
            OfRef(Consumer<? super T> consumer, boolean ordered) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   177
                super(ordered);
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   178
                this.consumer = consumer;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   179
            }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   180
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   181
            @Override
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   182
            public void accept(T t) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   183
                consumer.accept(t);
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   184
            }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   185
        }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   186
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   187
        /** Implementation class for {@code IntStream} */
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   188
        static final class OfInt extends ForEachOp<Integer>
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   189
                implements Sink.OfInt {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   190
            final IntConsumer consumer;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   191
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   192
            OfInt(IntConsumer consumer, boolean ordered) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   193
                super(ordered);
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   194
                this.consumer = consumer;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   195
            }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   196
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   197
            @Override
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   198
            public StreamShape inputShape() {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   199
                return StreamShape.INT_VALUE;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   200
            }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   201
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   202
            @Override
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   203
            public void accept(int t) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   204
                consumer.accept(t);
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   205
            }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   206
        }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   207
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   208
        /** Implementation class for {@code LongStream} */
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   209
        static final class OfLong extends ForEachOp<Long>
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   210
                implements Sink.OfLong {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   211
            final LongConsumer consumer;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   212
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   213
            OfLong(LongConsumer consumer, boolean ordered) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   214
                super(ordered);
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   215
                this.consumer = consumer;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   216
            }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   217
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   218
            @Override
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   219
            public StreamShape inputShape() {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   220
                return StreamShape.LONG_VALUE;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   221
            }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   222
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   223
            @Override
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   224
            public void accept(long t) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   225
                consumer.accept(t);
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   226
            }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   227
        }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   228
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   229
        /** Implementation class for {@code DoubleStream} */
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   230
        static final class OfDouble extends ForEachOp<Double>
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   231
                implements Sink.OfDouble {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   232
            final DoubleConsumer consumer;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   233
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   234
            OfDouble(DoubleConsumer consumer, boolean ordered) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   235
                super(ordered);
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   236
                this.consumer = consumer;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   237
            }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   238
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   239
            @Override
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   240
            public StreamShape inputShape() {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   241
                return StreamShape.DOUBLE_VALUE;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   242
            }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   243
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   244
            @Override
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   245
            public void accept(double t) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   246
                consumer.accept(t);
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   247
            }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   248
        }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   249
    }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   250
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   251
    /** A {@code ForkJoinTask} for performing a parallel for-each operation */
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   252
    static final class ForEachTask<S, T> extends CountedCompleter<Void> {
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   253
        private Spliterator<S> spliterator;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   254
        private final Sink<S> sink;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   255
        private final PipelineHelper<T> helper;
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   256
        private long targetSize;
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   257
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   258
        ForEachTask(PipelineHelper<T> helper,
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   259
                    Spliterator<S> spliterator,
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   260
                    Sink<S> sink) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   261
            super(null);
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   262
            this.sink = sink;
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   263
            this.helper = helper;
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   264
            this.spliterator = spliterator;
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   265
            this.targetSize = 0L;
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   266
        }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   267
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   268
        ForEachTask(ForEachTask<S, T> parent, Spliterator<S> spliterator) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   269
            super(parent);
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   270
            this.spliterator = spliterator;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   271
            this.sink = parent.sink;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   272
            this.targetSize = parent.targetSize;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   273
            this.helper = parent.helper;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   274
        }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   275
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   276
        // Similar to AbstractTask but doesn't need to track child tasks
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   277
        public void compute() {
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   278
            Spliterator<S> rightSplit = spliterator, leftSplit;
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   279
            long sizeEstimate = rightSplit.estimateSize(), sizeThreshold;
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   280
            if ((sizeThreshold = targetSize) == 0L)
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   281
                targetSize = sizeThreshold = AbstractTask.suggestTargetSize(sizeEstimate);
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   282
            boolean isShortCircuit = StreamOpFlag.SHORT_CIRCUIT.isKnown(helper.getStreamAndOpFlags());
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   283
            boolean forkRight = false;
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   284
            Sink<S> taskSink = sink;
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   285
            ForEachTask<S, T> task = this;
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   286
            while (!isShortCircuit || !taskSink.cancellationRequested()) {
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   287
                if (sizeEstimate <= sizeThreshold ||
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   288
                    (leftSplit = rightSplit.trySplit()) == null) {
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   289
                    task.helper.copyInto(taskSink, rightSplit);
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   290
                    break;
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   291
                }
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   292
                ForEachTask<S, T> leftTask = new ForEachTask<>(task, leftSplit);
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   293
                task.addToPendingCount(1);
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   294
                ForEachTask<S, T> taskToFork;
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   295
                if (forkRight) {
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   296
                    forkRight = false;
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   297
                    rightSplit = leftSplit;
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   298
                    taskToFork = task;
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   299
                    task = leftTask;
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   300
                }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   301
                else {
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   302
                    forkRight = true;
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   303
                    taskToFork = leftTask;
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   304
                }
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   305
                taskToFork.fork();
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   306
                sizeEstimate = rightSplit.estimateSize();
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   307
            }
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   308
            task.spliterator = null;
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   309
            task.propagateCompletion();
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   310
        }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   311
    }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   312
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   313
    /**
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   314
     * A {@code ForkJoinTask} for performing a parallel for-each operation
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   315
     * which visits the elements in encounter order
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   316
     */
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   317
    static final class ForEachOrderedTask<S, T> extends CountedCompleter<Void> {
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   318
        private final PipelineHelper<T> helper;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   319
        private Spliterator<S> spliterator;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   320
        private final long targetSize;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   321
        private final ConcurrentHashMap<ForEachOrderedTask<S, T>, ForEachOrderedTask<S, T>> completionMap;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   322
        private final Sink<T> action;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   323
        private final Object lock;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   324
        private final ForEachOrderedTask<S, T> leftPredecessor;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   325
        private Node<T> node;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   326
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   327
        protected ForEachOrderedTask(PipelineHelper<T> helper,
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   328
                                     Spliterator<S> spliterator,
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   329
                                     Sink<T> action) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   330
            super(null);
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   331
            this.helper = helper;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   332
            this.spliterator = spliterator;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   333
            this.targetSize = AbstractTask.suggestTargetSize(spliterator.estimateSize());
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   334
            this.completionMap = new ConcurrentHashMap<>();
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   335
            this.action = action;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   336
            this.lock = new Object();
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   337
            this.leftPredecessor = null;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   338
        }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   339
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   340
        ForEachOrderedTask(ForEachOrderedTask<S, T> parent,
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   341
                           Spliterator<S> spliterator,
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   342
                           ForEachOrderedTask<S, T> leftPredecessor) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   343
            super(parent);
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   344
            this.helper = parent.helper;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   345
            this.spliterator = spliterator;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   346
            this.targetSize = parent.targetSize;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   347
            this.completionMap = parent.completionMap;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   348
            this.action = parent.action;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   349
            this.lock = parent.lock;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   350
            this.leftPredecessor = leftPredecessor;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   351
        }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   352
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   353
        @Override
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   354
        public final void compute() {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   355
            doCompute(this);
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   356
        }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   357
18572
53b8b8c30086 8012987: Optimizations for Stream.limit/substream
psandoz
parents: 17163
diff changeset
   358
        private static <S, T> void doCompute(ForEachOrderedTask<S, T> task) {
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   359
            Spliterator<S> rightSplit = task.spliterator, leftSplit;
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   360
            long sizeThreshold = task.targetSize;
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   361
            boolean forkRight = false;
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   362
            while (rightSplit.estimateSize() > sizeThreshold &&
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   363
                   (leftSplit = rightSplit.trySplit()) != null) {
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   364
                ForEachOrderedTask<S, T> leftChild =
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   365
                    new ForEachOrderedTask<>(task, leftSplit, task.leftPredecessor);
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   366
                ForEachOrderedTask<S, T> rightChild =
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   367
                    new ForEachOrderedTask<>(task, rightSplit, leftChild);
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   368
                task.completionMap.put(leftChild, rightChild);
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   369
                task.addToPendingCount(1); // forking
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   370
                rightChild.addToPendingCount(1); // right pending on left child
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   371
                if (task.leftPredecessor != null) {
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   372
                    leftChild.addToPendingCount(1); // left pending on previous subtree, except left spine
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   373
                    if (task.completionMap.replace(task.leftPredecessor, task, leftChild))
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   374
                        task.addToPendingCount(-1); // transfer my "right child" count to my left child
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   375
                    else
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   376
                        leftChild.addToPendingCount(-1); // left child is ready to go when ready
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   377
                }
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   378
                ForEachOrderedTask<S, T> taskToFork;
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   379
                if (forkRight) {
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   380
                    forkRight = false;
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   381
                    rightSplit = leftSplit;
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   382
                    task = leftChild;
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   383
                    taskToFork = rightChild;
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   384
                }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   385
                else {
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   386
                    forkRight = true;
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   387
                    task = rightChild;
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   388
                    taskToFork = leftChild;
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   389
                }
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   390
                taskToFork.fork();
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   391
            }
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   392
            if (task.getPendingCount() == 0) {
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   393
                task.helper.wrapAndCopyInto(task.action, rightSplit);
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   394
            }
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   395
            else {
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   396
                Node.Builder<T> nb = task.helper.makeNodeBuilder(
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   397
                  task.helper.exactOutputSizeIfKnown(rightSplit),
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   398
                  size -> (T[]) new Object[size]);
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   399
                task.node = task.helper.wrapAndCopyInto(nb, rightSplit).build();
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   400
            }
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   401
            task.tryComplete();
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   402
        }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   403
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   404
        @Override
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   405
        public void onCompletion(CountedCompleter<?> caller) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   406
            spliterator = null;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   407
            if (node != null) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   408
                // Dump any data from this leaf into the sink
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   409
                synchronized (lock) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   410
                    node.forEach(action);
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   411
                }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   412
                node = null;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   413
            }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   414
            ForEachOrderedTask<S, T> victim = completionMap.remove(this);
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   415
            if (victim != null)
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   416
                victim.tryComplete();
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   417
        }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   418
    }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   419
}