summaryrefslogtreecommitdiff
path: root/src/library/scala/collection/IterableLike.scala
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2011-04-20 20:43:37 +0000
committerPaul Phillips <paulp@improving.org>2011-04-20 20:43:37 +0000
commit21ea5ad62747504e2c17c10c779e5c7054a2a297 (patch)
tree8e3d4ac052ffd406d179da2694a9fd93724a4e13 /src/library/scala/collection/IterableLike.scala
parent9be2e5463396e4a5022745c9d61a8431d53e2f99 (diff)
downloadscala-21ea5ad62747504e2c17c10c779e5c7054a2a297.tar.gz
scala-21ea5ad62747504e2c17c10c779e5c7054a2a297.tar.bz2
scala-21ea5ad62747504e2c17c10c779e5c7054a2a297.zip
One of the blips in the performance charts seem...
One of the blips in the performance charts seems to implicate some changes I made with slice to reduce the number of implementations and surface area for inconsistencies and bugs. Altering those changes in a more performance-mindful way, although I don't see anything here which is likely to help much. Also fixing some wrong documentation about copyToArray. No review.
Diffstat (limited to 'src/library/scala/collection/IterableLike.scala')
-rw-r--r--src/library/scala/collection/IterableLike.scala46
1 files changed, 43 insertions, 3 deletions
diff --git a/src/library/scala/collection/IterableLike.scala b/src/library/scala/collection/IterableLike.scala
index 458b26207e..b6713b65e4 100644
--- a/src/library/scala/collection/IterableLike.scala
+++ b/src/library/scala/collection/IterableLike.scala
@@ -90,9 +90,49 @@ self =>
iterator.next
override /*TraversableLike*/ def slice(from: Int, until: Int): Repr = {
- val lo = from max 0
- if (until <= lo) newBuilder.result
- else newBuilder ++= (iterator drop lo take (until - lo)) result
+ val lo = math.max(from, 0)
+ val elems = until - lo
+ val b = newBuilder
+ if (elems <= 0) b.result
+ else {
+ b.sizeHintBounded(elems, this)
+ var i = 0
+ val it = iterator drop lo
+ while (i < elems && it.hasNext) {
+ b += it.next
+ i += 1
+ }
+ b.result
+ }
+ }
+
+ override /*TraversableLike*/ def take(n: Int): Repr = {
+ val b = newBuilder
+
+ if (n <= 0) b.result
+ else {
+ b.sizeHintBounded(n, this)
+ var i = 0
+ val it = iterator
+ while (i < n && it.hasNext) {
+ b += it.next
+ i += 1
+ }
+ b.result
+ }
+ }
+
+ override /*TraversableLike*/ def drop(n: Int): Repr = {
+ val b = newBuilder
+ val lo = math.max(0, n)
+ b.sizeHint(this, -lo)
+ var i = 0
+ val it = iterator
+ while (i < n && it.hasNext) {
+ it.next
+ i += 1
+ }
+ b ++= it result
}
override /*TraversableLike*/ def takeWhile(p: A => Boolean): Repr = {