Skip to content

Commit ce6bc8e

Browse files
tomballcopybara-github
authored andcommitted
Updates java.util.stream package to latest Android release.
PiperOrigin-RevId: 669383223
1 parent e612774 commit ce6bc8e

17 files changed

+2192
-143
lines changed

jre_emul/android/platform/libcore/ojluni/src/main/java/java/util/stream/AbstractPipeline.java

+36-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2012, 2021, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -333,6 +333,9 @@ public void close() {
333333
@Override
334334
@SuppressWarnings("unchecked")
335335
public S onClose(Runnable closeHandler) {
336+
if (linkedOrConsumed)
337+
throw new IllegalStateException(MSG_STREAM_LINKED);
338+
Objects.requireNonNull(closeHandler);
336339
Runnable existingHandler = sourceStage.sourceCloseAction;
337340
sourceStage.sourceCloseAction =
338341
(existingHandler == null)
@@ -470,7 +473,32 @@ final StreamShape getSourceShape() {
470473

471474
@Override
472475
final <P_IN> long exactOutputSizeIfKnown(Spliterator<P_IN> spliterator) {
473-
return StreamOpFlag.SIZED.isKnown(getStreamAndOpFlags()) ? spliterator.getExactSizeIfKnown() : -1;
476+
int flags = getStreamAndOpFlags();
477+
long size = StreamOpFlag.SIZED.isKnown(flags) ? spliterator.getExactSizeIfKnown() : -1;
478+
// Currently, we have no stateless SIZE_ADJUSTING intermediate operations,
479+
// so we can simply ignore SIZE_ADJUSTING in parallel streams, since adjustments
480+
// are already accounted in the input spliterator.
481+
//
482+
// If we ever have a stateless SIZE_ADJUSTING intermediate operation,
483+
// we would need step back until depth == 0, then call exactOutputSize() for
484+
// the subsequent stages.
485+
if (size != -1 && StreamOpFlag.SIZE_ADJUSTING.isKnown(flags) && !isParallel()) {
486+
// Skip the source stage as it's never SIZE_ADJUSTING
487+
for (AbstractPipeline<?, ?, ?> stage = sourceStage.nextStage; stage != null; stage = stage.nextStage) {
488+
size = stage.exactOutputSize(size);
489+
}
490+
}
491+
return size;
492+
}
493+
494+
/**
495+
* Returns the exact output size of the pipeline given the exact size reported by the previous stage.
496+
*
497+
* @param previousSize the exact size reported by the previous stage
498+
* @return the output size of this stage
499+
*/
500+
long exactOutputSize(long previousSize) {
501+
return previousSize;
474502
}
475503

476504
@Override
@@ -495,15 +523,17 @@ final <P_IN> void copyInto(Sink<P_IN> wrappedSink, Spliterator<P_IN> spliterator
495523

496524
@Override
497525
@SuppressWarnings("unchecked")
498-
final <P_IN> void copyIntoWithCancel(Sink<P_IN> wrappedSink, Spliterator<P_IN> spliterator) {
526+
final <P_IN> boolean copyIntoWithCancel(Sink<P_IN> wrappedSink, Spliterator<P_IN> spliterator) {
499527
@SuppressWarnings({"rawtypes","unchecked"})
500528
AbstractPipeline p = AbstractPipeline.this;
501529
while (p.depth > 0) {
502530
p = p.previousStage;
503531
}
532+
504533
wrappedSink.begin(spliterator.getExactSizeIfKnown());
505-
p.forEachWithCancel(spliterator, wrappedSink);
534+
boolean cancelled = p.forEachWithCancel(spliterator, wrappedSink);
506535
wrappedSink.end();
536+
return cancelled;
507537
}
508538

509539
@Override
@@ -615,9 +645,10 @@ public abstract <P_IN> Spliterator<E_OUT> wrap(PipelineHelper<E_OUT> ph,
615645
*
616646
* @param spliterator the spliterator to pull elements from
617647
* @param sink the sink to push elements to
648+
* @return true if the cancellation was requested
618649
*/
619650
// Android-changed: Made public for CTS tests only.
620-
public abstract void forEachWithCancel(Spliterator<E_OUT> spliterator, Sink<E_OUT> sink);
651+
public abstract boolean forEachWithCancel(Spliterator<E_OUT> spliterator, Sink<E_OUT> sink);
621652

622653
/**
623654
* Make a node builder compatible with this stream shape.

jre_emul/android/platform/libcore/ojluni/src/main/java/java/util/stream/DoublePipeline.java

+10-8
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,9 @@ private static DoubleConsumer adapt(Sink<Double> sink) {
100100
if (sink instanceof DoubleConsumer) {
101101
return (DoubleConsumer) sink;
102102
} else {
103-
// if (Tripwire.ENABLED)
104-
// Tripwire.trip(AbstractPipeline.class,
105-
// "using DoubleStream.adapt(Sink<Double> s)");
103+
if (Tripwire.ENABLED)
104+
Tripwire.trip(AbstractPipeline.class,
105+
"using DoubleStream.adapt(Sink<Double> s)");
106106
return sink::accept;
107107
}
108108
}
@@ -118,9 +118,9 @@ private static Spliterator.OfDouble adapt(Spliterator<Double> s) {
118118
if (s instanceof Spliterator.OfDouble) {
119119
return (Spliterator.OfDouble) s;
120120
} else {
121-
// if (Tripwire.ENABLED)
122-
// Tripwire.trip(AbstractPipeline.class,
123-
// "using DoubleStream.adapt(Spliterator<Double> s)");
121+
if (Tripwire.ENABLED)
122+
Tripwire.trip(AbstractPipeline.class,
123+
"using DoubleStream.adapt(Spliterator<Double> s)");
124124
throw new UnsupportedOperationException("DoubleStream.adapt(Spliterator<Double> s)");
125125
}
126126
}
@@ -160,10 +160,12 @@ public final Spliterator.OfDouble lazySpliterator(Supplier<? extends Spliterator
160160

161161
@Override
162162
// Android-changed: Make public, to match the method it's overriding.
163-
public final void forEachWithCancel(Spliterator<Double> spliterator, Sink<Double> sink) {
163+
public final boolean forEachWithCancel(Spliterator<Double> spliterator, Sink<Double> sink) {
164164
Spliterator.OfDouble spl = adapt(spliterator);
165165
DoubleConsumer adaptedSink = adapt(sink);
166-
do { } while (!sink.cancellationRequested() && spl.tryAdvance(adaptedSink));
166+
boolean cancelled;
167+
do { } while (!(cancelled = sink.cancellationRequested()) && spl.tryAdvance(adaptedSink));
168+
return cancelled;
167169
}
168170

169171
@Override

jre_emul/android/platform/libcore/ojluni/src/main/java/java/util/stream/IntPipeline.java

+10-8
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,9 @@ private static IntConsumer adapt(Sink<Integer> sink) {
102102
return (IntConsumer) sink;
103103
}
104104
else {
105-
// if (Tripwire.ENABLED)
106-
// Tripwire.trip(AbstractPipeline.class,
107-
// "using IntStream.adapt(Sink<Integer> s)");
105+
if (Tripwire.ENABLED)
106+
Tripwire.trip(AbstractPipeline.class,
107+
"using IntStream.adapt(Sink<Integer> s)");
108108
return sink::accept;
109109
}
110110
}
@@ -121,9 +121,9 @@ private static Spliterator.OfInt adapt(Spliterator<Integer> s) {
121121
return (Spliterator.OfInt) s;
122122
}
123123
else {
124-
// if (Tripwire.ENABLED)
125-
// Tripwire.trip(AbstractPipeline.class,
126-
// "using IntStream.adapt(Spliterator<Integer> s)");
124+
if (Tripwire.ENABLED)
125+
Tripwire.trip(AbstractPipeline.class,
126+
"using IntStream.adapt(Spliterator<Integer> s)");
127127
throw new UnsupportedOperationException("IntStream.adapt(Spliterator<Integer> s)");
128128
}
129129
}
@@ -163,10 +163,12 @@ public final Spliterator.OfInt lazySpliterator(Supplier<? extends Spliterator<In
163163

164164
@Override
165165
// Android-changed: Make public, to match the method it's overriding.
166-
public final void forEachWithCancel(Spliterator<Integer> spliterator, Sink<Integer> sink) {
166+
public final boolean forEachWithCancel(Spliterator<Integer> spliterator, Sink<Integer> sink) {
167167
Spliterator.OfInt spl = adapt(spliterator);
168168
IntConsumer adaptedSink = adapt(sink);
169-
do { } while (!sink.cancellationRequested() && spl.tryAdvance(adaptedSink));
169+
boolean cancelled;
170+
do { } while (!(cancelled = sink.cancellationRequested()) && spl.tryAdvance(adaptedSink));
171+
return cancelled;
170172
}
171173

172174
@Override

jre_emul/android/platform/libcore/ojluni/src/main/java/java/util/stream/LongPipeline.java

+10-8
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,9 @@ private static LongConsumer adapt(Sink<Long> sink) {
101101
if (sink instanceof LongConsumer) {
102102
return (LongConsumer) sink;
103103
} else {
104-
// if (Tripwire.ENABLED)
105-
// Tripwire.trip(AbstractPipeline.class,
106-
// "using LongStream.adapt(Sink<Long> s)");
104+
if (Tripwire.ENABLED)
105+
Tripwire.trip(AbstractPipeline.class,
106+
"using LongStream.adapt(Sink<Long> s)");
107107
return sink::accept;
108108
}
109109
}
@@ -119,9 +119,9 @@ private static Spliterator.OfLong adapt(Spliterator<Long> s) {
119119
if (s instanceof Spliterator.OfLong) {
120120
return (Spliterator.OfLong) s;
121121
} else {
122-
// if (Tripwire.ENABLED)
123-
// Tripwire.trip(AbstractPipeline.class,
124-
// "using LongStream.adapt(Spliterator<Long> s)");
122+
if (Tripwire.ENABLED)
123+
Tripwire.trip(AbstractPipeline.class,
124+
"using LongStream.adapt(Spliterator<Long> s)");
125125
throw new UnsupportedOperationException("LongStream.adapt(Spliterator<Long> s)");
126126
}
127127
}
@@ -161,10 +161,12 @@ public final Spliterator.OfLong lazySpliterator(Supplier<? extends Spliterator<L
161161

162162
@Override
163163
// Android-changed: Make public, to match the method it's overriding.
164-
public final void forEachWithCancel(Spliterator<Long> spliterator, Sink<Long> sink) {
164+
public final boolean forEachWithCancel(Spliterator<Long> spliterator, Sink<Long> sink) {
165165
Spliterator.OfLong spl = adapt(spliterator);
166166
LongConsumer adaptedSink = adapt(sink);
167-
do { } while (!sink.cancellationRequested() && spl.tryAdvance(adaptedSink));
167+
boolean cancelled;
168+
do { } while (!(cancelled = sink.cancellationRequested()) && spl.tryAdvance(adaptedSink));
169+
return cancelled;
168170
}
169171

170172
@Override

jre_emul/android/platform/libcore/ojluni/src/main/java/java/util/stream/Node.java

+14-14
Original file line numberDiff line numberDiff line change
@@ -263,8 +263,8 @@ default T_NODE getChild(int i) {
263263
*/
264264
@Override
265265
default T[] asArray(IntFunction<T[]> generator) {
266-
// if (java.util.stream.Tripwire.ENABLED)
267-
// java.util.stream.Tripwire.trip(getClass(), "{0} calling Node.OfPrimitive.asArray");
266+
if (java.util.stream.Tripwire.ENABLED)
267+
java.util.stream.Tripwire.trip(getClass(), "{0} calling Node.OfPrimitive.asArray");
268268

269269
long size = count();
270270
if (size >= Nodes.MAX_ARRAY_SIZE)
@@ -328,8 +328,8 @@ default void forEach(Consumer<? super Integer> consumer) {
328328
forEach((IntConsumer) consumer);
329329
}
330330
else {
331-
// if (Tripwire.ENABLED)
332-
// Tripwire.trip(getClass(), "{0} calling Node.OfInt.forEachRemaining(Consumer)");
331+
if (Tripwire.ENABLED)
332+
Tripwire.trip(getClass(), "{0} calling Node.OfInt.forEachRemaining(Consumer)");
333333
spliterator().forEachRemaining(consumer);
334334
}
335335
}
@@ -344,8 +344,8 @@ default void forEach(Consumer<? super Integer> consumer) {
344344
*/
345345
@Override
346346
default void copyInto(Integer[] boxed, int offset) {
347-
// if (Tripwire.ENABLED)
348-
// Tripwire.trip(getClass(), "{0} calling Node.OfInt.copyInto(Integer[], int)");
347+
if (Tripwire.ENABLED)
348+
Tripwire.trip(getClass(), "{0} calling Node.OfInt.copyInto(Integer[], int)");
349349

350350
int[] array = asPrimitiveArray();
351351
for (int i = 0; i < array.length; i++) {
@@ -401,8 +401,8 @@ default void forEach(Consumer<? super Long> consumer) {
401401
forEach((LongConsumer) consumer);
402402
}
403403
else {
404-
// if (Tripwire.ENABLED)
405-
// Tripwire.trip(getClass(), "{0} calling Node.OfLong.forEachRemaining(Consumer)");
404+
if (Tripwire.ENABLED)
405+
Tripwire.trip(getClass(), "{0} calling Node.OfLong.forEachRemaining(Consumer)");
406406
spliterator().forEachRemaining(consumer);
407407
}
408408
}
@@ -417,8 +417,8 @@ default void forEach(Consumer<? super Long> consumer) {
417417
*/
418418
@Override
419419
default void copyInto(Long[] boxed, int offset) {
420-
// if (Tripwire.ENABLED)
421-
// Tripwire.trip(getClass(), "{0} calling Node.OfInt.copyInto(Long[], int)");
420+
if (Tripwire.ENABLED)
421+
Tripwire.trip(getClass(), "{0} calling Node.OfInt.copyInto(Long[], int)");
422422

423423
long[] array = asPrimitiveArray();
424424
for (int i = 0; i < array.length; i++) {
@@ -474,8 +474,8 @@ default void forEach(Consumer<? super Double> consumer) {
474474
forEach((DoubleConsumer) consumer);
475475
}
476476
else {
477-
// if (Tripwire.ENABLED)
478-
// Tripwire.trip(getClass(), "{0} calling Node.OfLong.forEachRemaining(Consumer)");
477+
if (Tripwire.ENABLED)
478+
Tripwire.trip(getClass(), "{0} calling Node.OfLong.forEachRemaining(Consumer)");
479479
spliterator().forEachRemaining(consumer);
480480
}
481481
}
@@ -492,8 +492,8 @@ default void forEach(Consumer<? super Double> consumer) {
492492
*/
493493
@Override
494494
default void copyInto(Double[] boxed, int offset) {
495-
// if (Tripwire.ENABLED)
496-
// Tripwire.trip(getClass(), "{0} calling Node.OfDouble.copyInto(Double[], int)");
495+
if (Tripwire.ENABLED)
496+
Tripwire.trip(getClass(), "{0} calling Node.OfDouble.copyInto(Double[], int)");
497497

498498
double[] array = asPrimitiveArray();
499499
for (int i = 0; i < array.length; i++) {

jre_emul/android/platform/libcore/ojluni/src/main/java/java/util/stream/Nodes.java

+15-7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -69,6 +69,14 @@ private Nodes() {
6969
private static final Node.OfLong EMPTY_LONG_NODE = new EmptyNode.OfLong();
7070
private static final Node.OfDouble EMPTY_DOUBLE_NODE = new EmptyNode.OfDouble();
7171

72+
/**
73+
* @return an array generator for an array whose elements are of type T.
74+
*/
75+
@SuppressWarnings("unchecked")
76+
static <T> IntFunction<T[]> castingArray() {
77+
return size -> (T[]) new Object[size];
78+
}
79+
7280
// General shape-based node creation methods
7381

7482
/**
@@ -554,7 +562,7 @@ public static Node.OfDouble flattenDouble(Node.OfDouble node) {
554562

555563
// Implementations
556564

557-
private static abstract class EmptyNode<T, T_ARR, T_CONS> implements Node<T> {
565+
private abstract static class EmptyNode<T, T_ARR, T_CONS> implements Node<T> {
558566
EmptyNode() { }
559567

560568
@Override
@@ -742,7 +750,7 @@ public String toString() {
742750
/**
743751
* Node class for an internal node with two or more children
744752
*/
745-
private static abstract class AbstractConcNode<T, T_NODE extends Node<T>> implements Node<T> {
753+
private abstract static class AbstractConcNode<T, T_NODE extends Node<T>> implements Node<T> {
746754
protected final T_NODE left;
747755
protected final T_NODE right;
748756
private final long size;
@@ -924,7 +932,7 @@ public Spliterator.OfDouble spliterator() {
924932
}
925933

926934
/** Abstract class for spliterator for all internal node classes */
927-
private static abstract class InternalNodeSpliterator<T,
935+
private abstract static class InternalNodeSpliterator<T,
928936
S extends Spliterator<T>,
929937
N extends Node<T>>
930938
implements Spliterator<T> {
@@ -1106,7 +1114,7 @@ public void forEachRemaining(Consumer<? super T> consumer) {
11061114
}
11071115
}
11081116

1109-
private static abstract class OfPrimitive<T, T_CONS, T_ARR,
1117+
private abstract static class OfPrimitive<T, T_CONS, T_ARR,
11101118
T_SPLITR extends Spliterator.OfPrimitive<T, T_CONS, T_SPLITR>,
11111119
N extends Node.OfPrimitive<T, T_CONS, T_ARR, T_SPLITR, N>>
11121120
extends InternalNodeSpliterator<T, T_SPLITR, N>
@@ -1819,7 +1827,7 @@ public Node.OfDouble build() {
18191827
* This and subclasses are not intended to be serializable
18201828
*/
18211829
@SuppressWarnings("serial")
1822-
private static abstract class SizedCollectorTask<P_IN, P_OUT, T_SINK extends Sink<P_OUT>,
1830+
private abstract static class SizedCollectorTask<P_IN, P_OUT, T_SINK extends Sink<P_OUT>,
18231831
K extends SizedCollectorTask<P_IN, P_OUT, T_SINK, K>>
18241832
extends CountedCompleter<Void>
18251833
implements Sink<P_OUT> {
@@ -2022,7 +2030,7 @@ public void accept(double value) {
20222030
}
20232031

20242032
@SuppressWarnings("serial")
2025-
private static abstract class ToArrayTask<T, T_NODE extends Node<T>,
2033+
private abstract static class ToArrayTask<T, T_NODE extends Node<T>,
20262034
K extends ToArrayTask<T, T_NODE, K>>
20272035
extends CountedCompleter<Void> {
20282036
protected final T_NODE node;

jre_emul/android/platform/libcore/ojluni/src/main/java/java/util/stream/PipelineHelper.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ public abstract class PipelineHelper<P_OUT> {
140140
* @param wrappedSink the destination {@code Sink}
141141
* @param spliterator the source {@code Spliterator}
142142
*/
143-
abstract <P_IN> void copyIntoWithCancel(Sink<P_IN> wrappedSink, Spliterator<P_IN> spliterator);
143+
abstract <P_IN> boolean copyIntoWithCancel(Sink<P_IN> wrappedSink, Spliterator<P_IN> spliterator);
144144

145145
/**
146146
* Takes a {@code Sink} that accepts elements of the output type of the

jre_emul/android/platform/libcore/ojluni/src/main/java/java/util/stream/ReferencePipeline.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,10 @@ public final Spliterator<P_OUT> lazySpliterator(Supplier<? extends Spliterator<P
129129

130130
@Override
131131
// Android-changed: Make public, to match the method it's overriding.
132-
public final void forEachWithCancel(Spliterator<P_OUT> spliterator, Sink<P_OUT> sink) {
133-
do { } while (!sink.cancellationRequested() && spliterator.tryAdvance(sink));
132+
public final boolean forEachWithCancel(Spliterator<P_OUT> spliterator, Sink<P_OUT> sink) {
133+
boolean cancelled;
134+
do { } while (!(cancelled = sink.cancellationRequested()) && spliterator.tryAdvance(sink));
135+
return cancelled;
134136
}
135137

136138
@Override

0 commit comments

Comments
 (0)