src/share/classes/java/util/stream/SliceOps.java
Print this page
rev 7923 : 8023681: Fix raw type warning caused by Sink
Reviewed-by:
*** 94,103 ****
--- 94,108 ----
default:
throw new IllegalStateException("Unknown shape " + shape);
}
}
+ @SuppressWarnings("unchecked")
+ private static <T> IntFunction<T[]> castingArray() {
+ return size -> (T[]) new Object[size];
+ }
+
/**
* Appends a "slice" operation to the provided stream. The slice operation
* may be may be skip-only, limit-only, or skip-and-limit.
*
* @param <T> the type of both input and output elements
*** 109,119 ****
public static <T> Stream<T> makeRef(AbstractPipeline<?, T, ?> upstream,
long skip, long limit) {
if (skip < 0)
throw new IllegalArgumentException("Skip must be non-negative: " + skip);
! return new ReferencePipeline.StatefulOp<T,T>(upstream, StreamShape.REFERENCE,
flags(limit)) {
Spliterator<T> unorderedSkipLimitSpliterator(Spliterator<T> s,
long skip, long limit, long sizeIfKnown) {
if (skip <= sizeIfKnown) {
// Use just the limit if the number of elements
--- 114,124 ----
public static <T> Stream<T> makeRef(AbstractPipeline<?, T, ?> upstream,
long skip, long limit) {
if (skip < 0)
throw new IllegalArgumentException("Skip must be non-negative: " + skip);
! return new ReferencePipeline.StatefulOp<T, T>(upstream, StreamShape.REFERENCE,
flags(limit)) {
Spliterator<T> unorderedSkipLimitSpliterator(Spliterator<T> s,
long skip, long limit, long sizeIfKnown) {
if (skip <= sizeIfKnown) {
// Use just the limit if the number of elements
*** 144,154 ****
// SliceTask from say (size / k) to say min(size / k, 1 << 14)
// This will limit the size of the buffers created at the leaf nodes
// cancellation will be more aggressive cancelling later tasks
// if the target slice size has been reached from a given task,
// cancellation should also clear local results if any
! return new SliceTask<>(this, helper, spliterator, i -> (T[]) new Object[i], skip, limit).
invoke().spliterator();
}
}
@Override
--- 149,159 ----
// SliceTask from say (size / k) to say min(size / k, 1 << 14)
// This will limit the size of the buffers created at the leaf nodes
// cancellation will be more aggressive cancelling later tasks
// if the target slice size has been reached from a given task,
// cancellation should also clear local results if any
! return new SliceTask<>(this, helper, spliterator, castingArray(), skip, limit).
invoke().spliterator();
}
}
@Override
*** 180,190 ****
}
}
@Override
Sink<T> opWrapSink(int flags, Sink<T> sink) {
! return new Sink.ChainedReference<T>(sink) {
long n = skip;
long m = limit >= 0 ? limit : Long.MAX_VALUE;
@Override
public void begin(long size) {
--- 185,195 ----
}
}
@Override
Sink<T> opWrapSink(int flags, Sink<T> sink) {
! return new Sink.ChainedReference<T, T>(sink) {
long n = skip;
long m = limit >= 0 ? limit : Long.MAX_VALUE;
@Override
public void begin(long size) {
*** 289,299 ****
}
}
@Override
Sink<Integer> opWrapSink(int flags, Sink<Integer> sink) {
! return new Sink.ChainedInt(sink) {
long n = skip;
long m = limit >= 0 ? limit : Long.MAX_VALUE;
@Override
public void begin(long size) {
--- 294,304 ----
}
}
@Override
Sink<Integer> opWrapSink(int flags, Sink<Integer> sink) {
! return new Sink.ChainedInt<Integer>(sink) {
long n = skip;
long m = limit >= 0 ? limit : Long.MAX_VALUE;
@Override
public void begin(long size) {
*** 398,408 ****
}
}
@Override
Sink<Long> opWrapSink(int flags, Sink<Long> sink) {
! return new Sink.ChainedLong(sink) {
long n = skip;
long m = limit >= 0 ? limit : Long.MAX_VALUE;
@Override
public void begin(long size) {
--- 403,413 ----
}
}
@Override
Sink<Long> opWrapSink(int flags, Sink<Long> sink) {
! return new Sink.ChainedLong<Long>(sink) {
long n = skip;
long m = limit >= 0 ? limit : Long.MAX_VALUE;
@Override
public void begin(long size) {
*** 507,517 ****
}
}
@Override
Sink<Double> opWrapSink(int flags, Sink<Double> sink) {
! return new Sink.ChainedDouble(sink) {
long n = skip;
long m = limit >= 0 ? limit : Long.MAX_VALUE;
@Override
public void begin(long size) {
--- 512,522 ----
}
}
@Override
Sink<Double> opWrapSink(int flags, Sink<Double> sink) {
! return new Sink.ChainedDouble<Double>(sink) {
long n = skip;
long m = limit >= 0 ? limit : Long.MAX_VALUE;
@Override
public void begin(long size) {
*** 558,574 ****
private final long targetOffset, targetSize;
private long thisNodeSize;
private volatile boolean completed;
! SliceTask(AbstractPipeline<?, P_OUT, ?> op,
PipelineHelper<P_OUT> helper,
Spliterator<P_IN> spliterator,
IntFunction<P_OUT[]> generator,
long offset, long size) {
super(helper, spliterator);
! this.op = (AbstractPipeline<P_OUT, P_OUT, ?>) op;
this.generator = generator;
this.targetOffset = offset;
this.targetSize = size;
}
--- 563,579 ----
private final long targetOffset, targetSize;
private long thisNodeSize;
private volatile boolean completed;
! SliceTask(AbstractPipeline<P_OUT, P_OUT, ?> op,
PipelineHelper<P_OUT> helper,
Spliterator<P_IN> spliterator,
IntFunction<P_OUT[]> generator,
long offset, long size) {
super(helper, spliterator);
! this.op = op;
this.generator = generator;
this.targetOffset = offset;
this.targetSize = size;
}