--- a/jdk/src/share/classes/java/util/stream/LongStream.java Mon Jun 10 11:06:26 2013 -0700
+++ b/jdk/src/share/classes/java/util/stream/LongStream.java Tue Jun 11 12:13:26 2013 +0200
@@ -750,12 +750,13 @@
/**
* Returns a sequential {@code LongStream} from {@code startInclusive}
* (inclusive) to {@code endExclusive} (exclusive) by an incremental step of
- * 1.
+ * {@code 1}.
*
- * @implSpec
- * The implementation behaves as if:
+ * @apiNote
+ * <p>An equivalent sequence of increasing values can be produced
+ * sequentially using a {@code for} loop as follows:
* <pre>{@code
- * longRange(startInclusive, endExclusive, 1);
+ * for (long i = startInclusive; i < endExclusive ; i++) { ... }
* }</pre>
*
* @param startInclusive the (inclusive) initial value
@@ -764,36 +765,56 @@
* elements
*/
public static LongStream range(long startInclusive, final long endExclusive) {
- return range(startInclusive, endExclusive, 1);
+ if (startInclusive >= endExclusive) {
+ return empty();
+ } else if (endExclusive - startInclusive < 0) {
+ // Size of range > Long.MAX_VALUE
+ // Split the range in two and concatenate
+ // Note: if the range is [Long.MIN_VALUE, Long.MAX_VALUE) then
+ // the lower range, [Long.MIN_VALUE, 0) will be further split in two
+// long m = startInclusive + Long.divideUnsigned(endExclusive - startInclusive, 2) + 1;
+// return Streams.concat(range(startInclusive, m), range(m, endExclusive));
+ // This is temporary until Streams.concat is supported
+ throw new UnsupportedOperationException();
+ } else {
+ return StreamSupport.longStream(
+ new Streams.RangeLongSpliterator(startInclusive, endExclusive, false));
+ }
}
/**
* Returns a sequential {@code LongStream} from {@code startInclusive}
- * (inclusive) to {@code endExclusive} (exclusive) by {@code step}. If
- * {@code startInclusive} is greater than or equal to {@code
- * endExclusive}, an empty stream is returned.
+ * (inclusive) to {@code endInclusive} (inclusive) by an incremental step of
+ * {@code 1}.
*
+ * @apiNote
* <p>An equivalent sequence of increasing values can be produced
* sequentially using a {@code for} loop as follows:
* <pre>{@code
- * for (long i = startInclusive; i < endExclusive ; i += step) { ... }
+ * for (long i = startInclusive; i <= endInclusive ; i++) { ... }
* }</pre>
*
* @param startInclusive the (inclusive) initial value
- * @param endExclusive the exclusive upper bound
- * @param step the difference between consecutive values
+ * @param endInclusive the inclusive upper bound
* @return a sequential {@code LongStream} for the range of {@code long}
* elements
- * @throws IllegalArgumentException if {@code step} is less than or equal to
- * 0
*/
- public static LongStream range(long startInclusive, final long endExclusive, final long step) {
- if (step <= 0) {
- throw new IllegalArgumentException(String.format("Illegal step: %d", step));
- } else if (startInclusive >= endExclusive) {
+ public static LongStream rangeClosed(long startInclusive, final long endInclusive) {
+ if (startInclusive > endInclusive) {
return empty();
+ } else if (endInclusive - startInclusive + 1 <= 0) {
+ // Size of range > Long.MAX_VALUE
+ // Split the range in two and concatenate
+ // Note: if the range is [Long.MIN_VALUE, Long.MAX_VALUE] then
+ // the lower range, [Long.MIN_VALUE, 0), and upper range,
+ // [0, Long.MAX_VALUE], will both be further split in two
+// long m = startInclusive + Long.divideUnsigned(endInclusive - startInclusive, 2) + 1;
+// return Streams.concat(range(startInclusive, m), rangeClosed(m, endInclusive));
+ // This is temporary until Streams.concat is supported
+ throw new UnsupportedOperationException();
} else {
- return StreamSupport.longStream(new Streams.RangeLongSpliterator(startInclusive, endExclusive, step));
+ return StreamSupport.longStream(
+ new Streams.RangeLongSpliterator(startInclusive, endInclusive, true));
}
}
}