jdk/src/java.base/share/classes/java/util/stream/ForEachOps.java
author mchung
Fri, 22 May 2015 16:43:39 -0700
changeset 30789 9eca83469588
parent 25859 3317bb8137f4
child 32649 2ee9017c7597
permissions -rw-r--r--
8074431: Remove native2ascii tool Reviewed-by: erikj, alanb, okutsu, mfang, naoto
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;
22297
1c62c67d9dd2 8031373: Lint warnings in java.util.stream
briangoetz
parents: 22289
diff changeset
    35
import java.util.function.IntFunction;
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    36
import java.util.function.LongConsumer;
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
/**
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    39
 * Factory for creating instances of {@code TerminalOp} that perform an
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    40
 * 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
    41
 * 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
    42
 * available), and ordered traversal (elements are provided to the
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    43
 * {@code Consumer} in encounter order.)
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    44
 *
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    45
 * <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
    46
 * whatever order they become available.  For ordered traversals, it is
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    47
 * guaranteed that processing an element <em>happens-before</em> processing
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    48
 * subsequent elements in the encounter order.
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    49
 *
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    50
 * <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
    51
 * {@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
    52
 * prematurely terminated.
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    53
 *
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    54
 * @since 1.8
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    55
 */
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    56
final class ForEachOps {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    57
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    58
    private ForEachOps() { }
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
    /**
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    61
     * 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
    62
     * of a stream.
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    63
     *
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    64
     * @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
    65
     *        stream
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    66
     * @param ordered whether an ordered traversal is requested
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    67
     * @param <T> the type of the stream elements
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    68
     * @return the {@code TerminalOp} instance
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    69
     */
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    70
    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
    71
                                                  boolean ordered) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    72
        Objects.requireNonNull(action);
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    73
        return new ForEachOp.OfRef<>(action, ordered);
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
    /**
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    77
     * 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
    78
     * of an {@code IntStream}.
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    79
     *
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    80
     * @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
    81
     *        stream
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    82
     * @param ordered whether an ordered traversal is requested
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    83
     * @return the {@code TerminalOp} instance
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    84
     */
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    85
    public static TerminalOp<Integer, Void> makeInt(IntConsumer action,
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    86
                                                    boolean ordered) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    87
        Objects.requireNonNull(action);
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    88
        return new ForEachOp.OfInt(action, ordered);
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
    /**
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    92
     * 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
    93
     * of a {@code LongStream}.
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    94
     *
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    95
     * @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
    96
     *        stream
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    97
     * @param ordered whether an ordered traversal is requested
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    98
     * @return the {@code TerminalOp} instance
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
    99
     */
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   100
    public static TerminalOp<Long, Void> makeLong(LongConsumer action,
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   101
                                                  boolean ordered) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   102
        Objects.requireNonNull(action);
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   103
        return new ForEachOp.OfLong(action, ordered);
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
    /**
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   107
     * 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
   108
     * of a {@code DoubleStream}.
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   109
     *
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   110
     * @param action the {@code DoubleConsumer} that receives all elements of
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   111
     *        a stream
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   112
     * @param ordered whether an ordered traversal is requested
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   113
     * @return the {@code TerminalOp} instance
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   114
     */
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   115
    public static TerminalOp<Double, Void> makeDouble(DoubleConsumer action,
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   116
                                                      boolean ordered) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   117
        Objects.requireNonNull(action);
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   118
        return new ForEachOp.OfDouble(action, ordered);
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
    /**
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   122
     * 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
   123
     * 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
   124
     * whatever thread they become available.  If the traversal is unordered,
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   125
     * 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
   126
     *
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   127
     * <p>This terminal operation is stateless.  For parallel evaluation, each
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   128
     * 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
   129
     * {@code TerminalSink} reference that is an instance of this class.
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   130
     *
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   131
     * @param <T> the output type of the stream pipeline
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   132
     */
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   133
    static abstract class ForEachOp<T>
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   134
            implements TerminalOp<T, Void>, TerminalSink<T, Void> {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   135
        private final boolean ordered;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   136
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   137
        protected ForEachOp(boolean ordered) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   138
            this.ordered = ordered;
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
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   141
        // TerminalOp
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   142
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   143
        @Override
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   144
        public int getOpFlags() {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   145
            return ordered ? 0 : StreamOpFlag.NOT_ORDERED;
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
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   148
        @Override
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   149
        public <S> Void evaluateSequential(PipelineHelper<T> helper,
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   150
                                           Spliterator<S> spliterator) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   151
            return helper.wrapAndCopyInto(this, spliterator).get();
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
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   154
        @Override
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   155
        public <S> Void evaluateParallel(PipelineHelper<T> helper,
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   156
                                         Spliterator<S> spliterator) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   157
            if (ordered)
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   158
                new ForEachOrderedTask<>(helper, spliterator, this).invoke();
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   159
            else
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   160
                new ForEachTask<>(helper, spliterator, helper.wrapSink(this)).invoke();
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   161
            return null;
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
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   164
        // TerminalSink
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   165
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   166
        @Override
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   167
        public Void get() {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   168
            return null;
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
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   171
        // Implementations
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   172
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   173
        /** 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
   174
        static final class OfRef<T> extends ForEachOp<T> {
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   175
            final Consumer<? super T> consumer;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   176
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   177
            OfRef(Consumer<? super T> consumer, boolean ordered) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   178
                super(ordered);
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   179
                this.consumer = consumer;
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
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   182
            @Override
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   183
            public void accept(T t) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   184
                consumer.accept(t);
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
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   188
        /** 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
   189
        static final class OfInt extends ForEachOp<Integer>
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   190
                implements Sink.OfInt {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   191
            final IntConsumer consumer;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   192
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   193
            OfInt(IntConsumer consumer, boolean ordered) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   194
                super(ordered);
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   195
                this.consumer = consumer;
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
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   198
            @Override
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   199
            public StreamShape inputShape() {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   200
                return StreamShape.INT_VALUE;
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
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   203
            @Override
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   204
            public void accept(int t) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   205
                consumer.accept(t);
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
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   209
        /** 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
   210
        static final class OfLong extends ForEachOp<Long>
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   211
                implements Sink.OfLong {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   212
            final LongConsumer consumer;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   213
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   214
            OfLong(LongConsumer consumer, boolean ordered) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   215
                super(ordered);
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   216
                this.consumer = consumer;
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
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   219
            @Override
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   220
            public StreamShape inputShape() {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   221
                return StreamShape.LONG_VALUE;
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
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   224
            @Override
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   225
            public void accept(long t) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   226
                consumer.accept(t);
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
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   230
        /** 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
   231
        static final class OfDouble extends ForEachOp<Double>
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   232
                implements Sink.OfDouble {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   233
            final DoubleConsumer consumer;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   234
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   235
            OfDouble(DoubleConsumer consumer, boolean ordered) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   236
                super(ordered);
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   237
                this.consumer = consumer;
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
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   240
            @Override
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   241
            public StreamShape inputShape() {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   242
                return StreamShape.DOUBLE_VALUE;
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
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   245
            @Override
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   246
            public void accept(double t) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   247
                consumer.accept(t);
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
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   252
    /** A {@code ForkJoinTask} for performing a parallel for-each operation */
19218
8e7212b90b81 8022446: Fix serial warnings in java.util.stream
henryjen
parents: 18795
diff changeset
   253
    @SuppressWarnings("serial")
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   254
    static final class ForEachTask<S, T> extends CountedCompleter<Void> {
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   255
        private Spliterator<S> spliterator;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   256
        private final Sink<S> sink;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   257
        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
   258
        private long targetSize;
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   259
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   260
        ForEachTask(PipelineHelper<T> helper,
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   261
                    Spliterator<S> spliterator,
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   262
                    Sink<S> sink) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   263
            super(null);
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   264
            this.sink = sink;
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   265
            this.helper = helper;
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   266
            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
   267
            this.targetSize = 0L;
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   268
        }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   269
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   270
        ForEachTask(ForEachTask<S, T> parent, Spliterator<S> spliterator) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   271
            super(parent);
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   272
            this.spliterator = spliterator;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   273
            this.sink = parent.sink;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   274
            this.targetSize = parent.targetSize;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   275
            this.helper = parent.helper;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   276
        }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   277
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   278
        // 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
   279
        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
   280
            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
   281
            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
   282
            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
   283
                targetSize = sizeThreshold = AbstractTask.suggestTargetSize(sizeEstimate);
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   284
            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
   285
            boolean forkRight = false;
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   286
            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
   287
            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
   288
            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
   289
                if (sizeEstimate <= sizeThreshold ||
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   290
                    (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
   291
                    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
   292
                    break;
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   293
                }
18795
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> 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
   295
                task.addToPendingCount(1);
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   296
                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
   297
                if (forkRight) {
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   298
                    forkRight = false;
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   299
                    rightSplit = leftSplit;
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   300
                    taskToFork = task;
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   301
                    task = leftTask;
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   302
                }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   303
                else {
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   304
                    forkRight = true;
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   305
                    taskToFork = leftTask;
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   306
                }
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   307
                taskToFork.fork();
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   308
                sizeEstimate = rightSplit.estimateSize();
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   309
            }
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   310
            task.spliterator = null;
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   311
            task.propagateCompletion();
17163
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
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   315
    /**
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   316
     * A {@code ForkJoinTask} for performing a parallel for-each operation
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   317
     * which visits the elements in encounter order
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   318
     */
19218
8e7212b90b81 8022446: Fix serial warnings in java.util.stream
henryjen
parents: 18795
diff changeset
   319
    @SuppressWarnings("serial")
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   320
    static final class ForEachOrderedTask<S, T> extends CountedCompleter<Void> {
22289
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   321
        /*
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   322
         * Our goal is to ensure that the elements associated with a task are
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   323
         * processed according to an in-order traversal of the computation tree.
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   324
         * We use completion counts for representing these dependencies, so that
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   325
         * a task does not complete until all the tasks preceding it in this
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   326
         * order complete.  We use the "completion map" to associate the next
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   327
         * task in this order for any left child.  We increase the pending count
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   328
         * of any node on the right side of such a mapping by one to indicate
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   329
         * its dependency, and when a node on the left side of such a mapping
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   330
         * completes, it decrements the pending count of its corresponding right
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   331
         * side.  As the computation tree is expanded by splitting, we must
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   332
         * atomically update the mappings to maintain the invariant that the
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   333
         * completion map maps left children to the next node in the in-order
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   334
         * traversal.
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   335
         *
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   336
         * Take, for example, the following computation tree of tasks:
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   337
         *
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   338
         *       a
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   339
         *      / \
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   340
         *     b   c
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   341
         *    / \ / \
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   342
         *   d  e f  g
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   343
         *
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   344
         * The complete map will contain (not necessarily all at the same time)
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   345
         * the following associations:
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   346
         *
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   347
         *   d -> e
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   348
         *   b -> f
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   349
         *   f -> g
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   350
         *
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   351
         * Tasks e, f, g will have their pending counts increased by 1.
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   352
         *
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   353
         * The following relationships hold:
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   354
         *
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   355
         *   - completion of d "happens-before" e;
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   356
         *   - completion of d and e "happens-before b;
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   357
         *   - completion of b "happens-before" f; and
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   358
         *   - completion of f "happens-before" g
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   359
         *
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   360
         * Thus overall the "happens-before" relationship holds for the
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   361
         * reporting of elements, covered by tasks d, e, f and g, as specified
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   362
         * by the forEachOrdered operation.
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   363
         */
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   364
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   365
        private final PipelineHelper<T> helper;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   366
        private Spliterator<S> spliterator;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   367
        private final long targetSize;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   368
        private final ConcurrentHashMap<ForEachOrderedTask<S, T>, ForEachOrderedTask<S, T>> completionMap;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   369
        private final Sink<T> action;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   370
        private final ForEachOrderedTask<S, T> leftPredecessor;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   371
        private Node<T> node;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   372
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   373
        protected ForEachOrderedTask(PipelineHelper<T> helper,
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   374
                                     Spliterator<S> spliterator,
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   375
                                     Sink<T> action) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   376
            super(null);
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   377
            this.helper = helper;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   378
            this.spliterator = spliterator;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   379
            this.targetSize = AbstractTask.suggestTargetSize(spliterator.estimateSize());
22289
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   380
            // Size map to avoid concurrent re-sizes
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   381
            this.completionMap = new ConcurrentHashMap<>(Math.max(16, AbstractTask.LEAF_TARGET << 1));
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   382
            this.action = action;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   383
            this.leftPredecessor = null;
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
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   386
        ForEachOrderedTask(ForEachOrderedTask<S, T> parent,
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   387
                           Spliterator<S> spliterator,
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   388
                           ForEachOrderedTask<S, T> leftPredecessor) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   389
            super(parent);
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   390
            this.helper = parent.helper;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   391
            this.spliterator = spliterator;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   392
            this.targetSize = parent.targetSize;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   393
            this.completionMap = parent.completionMap;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   394
            this.action = parent.action;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   395
            this.leftPredecessor = leftPredecessor;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   396
        }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   397
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   398
        @Override
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   399
        public final void compute() {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   400
            doCompute(this);
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   401
        }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   402
18572
53b8b8c30086 8012987: Optimizations for Stream.limit/substream
psandoz
parents: 17163
diff changeset
   403
        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
   404
            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
   405
            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
   406
            boolean forkRight = false;
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   407
            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
   408
                   (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
   409
                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
   410
                    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
   411
                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
   412
                    new ForEachOrderedTask<>(task, rightSplit, leftChild);
22289
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   413
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   414
                // Fork the parent task
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   415
                // Completion of the left and right children "happens-before"
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   416
                // completion of the parent
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   417
                task.addToPendingCount(1);
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   418
                // Completion of the left child "happens-before" completion of
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   419
                // the right child
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   420
                rightChild.addToPendingCount(1);
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   421
                task.completionMap.put(leftChild, rightChild);
22289
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   422
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   423
                // If task is not on the left spine
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   424
                if (task.leftPredecessor != null) {
22289
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   425
                    /*
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   426
                     * Completion of left-predecessor, or left subtree,
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   427
                     * "happens-before" completion of left-most leaf node of
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   428
                     * right subtree.
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   429
                     * The left child's pending count needs to be updated before
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   430
                     * it is associated in the completion map, otherwise the
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   431
                     * left child can complete prematurely and violate the
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   432
                     * "happens-before" constraint.
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   433
                     */
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   434
                    leftChild.addToPendingCount(1);
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   435
                    // Update association of left-predecessor to left-most
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   436
                    // leaf node of right subtree
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   437
                    if (task.completionMap.replace(task.leftPredecessor, task, leftChild)) {
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   438
                        // If replaced, adjust the pending count of the parent
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   439
                        // to complete when its children complete
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   440
                        task.addToPendingCount(-1);
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   441
                    } else {
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   442
                        // Left-predecessor has already completed, parent's
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   443
                        // pending count is adjusted by left-predecessor;
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   444
                        // left child is ready to complete
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   445
                        leftChild.addToPendingCount(-1);
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   446
                    }
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   447
                }
22289
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   448
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   449
                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
   450
                if (forkRight) {
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   451
                    forkRight = false;
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   452
                    rightSplit = leftSplit;
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   453
                    task = leftChild;
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   454
                    taskToFork = rightChild;
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   455
                }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   456
                else {
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   457
                    forkRight = true;
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   458
                    task = rightChild;
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   459
                    taskToFork = leftChild;
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   460
                }
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   461
                taskToFork.fork();
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   462
            }
22289
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   463
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   464
            /*
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   465
             * Task's pending count is either 0 or 1.  If 1 then the completion
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   466
             * map will contain a value that is task, and two calls to
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   467
             * tryComplete are required for completion, one below and one
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   468
             * triggered by the completion of task's left-predecessor in
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   469
             * onCompletion.  Therefore there is no data race within the if
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   470
             * block.
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   471
             */
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   472
            if (task.getPendingCount() > 0) {
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   473
                // Cannot complete just yet so buffer elements into a Node
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   474
                // for use when completion occurs
22297
1c62c67d9dd2 8031373: Lint warnings in java.util.stream
briangoetz
parents: 22289
diff changeset
   475
                @SuppressWarnings("unchecked")
1c62c67d9dd2 8031373: Lint warnings in java.util.stream
briangoetz
parents: 22289
diff changeset
   476
                IntFunction<T[]> generator = size -> (T[]) new Object[size];
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   477
                Node.Builder<T> nb = task.helper.makeNodeBuilder(
22289
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   478
                        task.helper.exactOutputSizeIfKnown(rightSplit),
22297
1c62c67d9dd2 8031373: Lint warnings in java.util.stream
briangoetz
parents: 22289
diff changeset
   479
                        generator);
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   480
                task.node = task.helper.wrapAndCopyInto(nb, rightSplit).build();
22289
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   481
                task.spliterator = null;
18795
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   482
            }
25d68f4a1b38 8020040: Improve and generalize the F/J tasks to handle right or left-balanced trees
psandoz
parents: 18572
diff changeset
   483
            task.tryComplete();
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   484
        }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   485
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   486
        @Override
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   487
        public void onCompletion(CountedCompleter<?> caller) {
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   488
            if (node != null) {
22289
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   489
                // Dump buffered elements from this leaf into the sink
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   490
                node.forEach(action);
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   491
                node = null;
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   492
            }
22289
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   493
            else if (spliterator != null) {
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   494
                // Dump elements output from this leaf's pipeline into the sink
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   495
                helper.wrapAndCopyInto(action, spliterator);
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   496
                spliterator = null;
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   497
            }
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   498
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   499
            // The completion of this task *and* the dumping of elements
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   500
            // "happens-before" completion of the associated left-most leaf task
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   501
            // of right subtree (if any, which can be this task's right sibling)
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   502
            //
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   503
            ForEachOrderedTask<S, T> leftDescendant = completionMap.remove(this);
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   504
            if (leftDescendant != null)
bb9c71b84919 8029452: Fork/Join task ForEachOps.ForEachOrderedTask clarifications and minor improvements
psandoz
parents: 19218
diff changeset
   505
                leftDescendant.tryComplete();
17163
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   506
        }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   507
    }
6a5e9b4f27d2 8008670: Initial java.util.stream putback -- internal API classes
mduigou
parents:
diff changeset
   508
}