mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-28 15:24:43 +02:00
8265029: Preserve SIZED characteristics on slice operations (skip, limit)
Reviewed-by: psandoz
This commit is contained in:
parent
95b1fa7a88
commit
0c9daa7ed5
12 changed files with 704 additions and 89 deletions
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2021, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
|
@ -466,7 +466,32 @@ abstract class AbstractPipeline<E_IN, E_OUT, S extends BaseStream<E_OUT, S>>
|
|||
|
||||
@Override
|
||||
final <P_IN> long exactOutputSizeIfKnown(Spliterator<P_IN> spliterator) {
|
||||
return StreamOpFlag.SIZED.isKnown(getStreamAndOpFlags()) ? spliterator.getExactSizeIfKnown() : -1;
|
||||
int flags = getStreamAndOpFlags();
|
||||
long size = StreamOpFlag.SIZED.isKnown(flags) ? spliterator.getExactSizeIfKnown() : -1;
|
||||
// Currently, we have no stateless SIZE_ADJUSTING intermediate operations,
|
||||
// so we can simply ignore SIZE_ADJUSTING in parallel streams, since adjustments
|
||||
// are already accounted in the input spliterator.
|
||||
//
|
||||
// If we ever have a stateless SIZE_ADJUSTING intermediate operation,
|
||||
// we would need step back until depth == 0, then call exactOutputSize() for
|
||||
// the subsequent stages.
|
||||
if (size != -1 && StreamOpFlag.SIZE_ADJUSTING.isKnown(flags) && !isParallel()) {
|
||||
// Skip the source stage as it's never SIZE_ADJUSTING
|
||||
for (AbstractPipeline<?, ?, ?> stage = sourceStage.nextStage; stage != null; stage = stage.nextStage) {
|
||||
size = stage.exactOutputSize(size);
|
||||
}
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the exact output size of the pipeline given the exact size reported by the previous stage.
|
||||
*
|
||||
* @param previousSize the exact size reported by the previous stage
|
||||
* @return the output size of this stage
|
||||
*/
|
||||
long exactOutputSize(long previousSize) {
|
||||
return previousSize;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue