diff options
author | Paul Phillips <paulp@improving.org> | 2011-04-20 16:28:01 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2011-04-20 16:28:01 +0000 |
commit | 9be2e5463396e4a5022745c9d61a8431d53e2f99 (patch) | |
tree | 3bef6e95628872ef4502b3313ffff24071920627 | |
parent | b477d7389bba6d53f18f9ea3defd445013f24df3 (diff) | |
download | scala-9be2e5463396e4a5022745c9d61a8431d53e2f99.tar.gz scala-9be2e5463396e4a5022745c9d61a8431d53e2f99.tar.bz2 scala-9be2e5463396e4a5022745c9d61a8431d53e2f99.zip |
Some tweaks to slice to make it run faster, no ...
Some tweaks to slice to make it run faster, no review.
-rw-r--r-- | src/library/scala/collection/TraversableLike.scala | 8 | ||||
-rw-r--r-- | src/library/scala/collection/immutable/List.scala | 6 |
2 files changed, 12 insertions, 2 deletions
diff --git a/src/library/scala/collection/TraversableLike.scala b/src/library/scala/collection/TraversableLike.scala index 2d3a4c229c..fe1d5d7d77 100644 --- a/src/library/scala/collection/TraversableLike.scala +++ b/src/library/scala/collection/TraversableLike.scala @@ -434,10 +434,14 @@ trait TraversableLike[+A, +Repr] extends HasNewBuilder[A, Repr] def take(n: Int): Repr = slice(0, n) def drop(n: Int): Repr = - if (n <= 0) newBuilder ++= thisCollection result + if (n <= 0) { + val b = newBuilder + b.sizeHint(this) + b ++= thisCollection result + } else sliceWithKnownDelta(n, Int.MaxValue, -n) - def slice(from: Int, until: Int): Repr = sliceWithKnownBound(from max 0, until) + def slice(from: Int, until: Int): Repr = sliceWithKnownBound(math.max(from, 0), until) // Precondition: from >= 0, until > 0, builder already configured for building. private[this] def sliceInternal(from: Int, until: Int, b: Builder[A, Repr]): Repr = { diff --git a/src/library/scala/collection/immutable/List.scala b/src/library/scala/collection/immutable/List.scala index c14e24ab47..d8c8268a2e 100644 --- a/src/library/scala/collection/immutable/List.scala +++ b/src/library/scala/collection/immutable/List.scala @@ -171,6 +171,12 @@ sealed abstract class List[+A] extends LinearSeq[A] these } + override def slice(from: Int, until: Int): List[A] = { + val lo = math.max(from, 0) + if (until <= lo || isEmpty) Nil + else this drop lo take (until - lo) + } + override def takeRight(n: Int): List[A] = { @tailrec def loop(lead: List[A], lag: List[A]): List[A] = lead match { |