summaryrefslogtreecommitdiff
path: root/src/library/scala/collection/TraversableLike.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2010-05-10 15:52:25 +0000
committerMartin Odersky <odersky@gmail.com>2010-05-10 15:52:25 +0000
commitbfb49242b5ca6ffdd086364b33fa3f785254784d (patch)
tree8504ce3c0b60e1b8be5f29c8940f97e5ca24162e /src/library/scala/collection/TraversableLike.scala
parentdb50a62b625d9685394557fad3a1a101c843df07 (diff)
downloadscala-bfb49242b5ca6ffdd086364b33fa3f785254784d.tar.gz
scala-bfb49242b5ca6ffdd086364b33fa3f785254784d.tar.bz2
scala-bfb49242b5ca6ffdd086364b33fa3f785254784d.zip
Added sizeHints to operations where it made sense.
Diffstat (limited to 'src/library/scala/collection/TraversableLike.scala')
-rw-r--r--src/library/scala/collection/TraversableLike.scala10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/library/scala/collection/TraversableLike.scala b/src/library/scala/collection/TraversableLike.scala
index 4c8d34622e..02777a5daa 100644
--- a/src/library/scala/collection/TraversableLike.scala
+++ b/src/library/scala/collection/TraversableLike.scala
@@ -179,6 +179,7 @@ trait TraversableLike[+A, +Repr] extends HasNewBuilder[A, Repr] with Traversable
*/
def ++[B >: A, That](that: TraversableOnce[B])(implicit bf: CanBuildFrom[Repr, B, That]): That = {
val b = bf(repr)
+ if (that.isInstanceOf[IndexedSeqLike[_, _]]) b.sizeHint(this, that.size)
b ++= thisCollection
b ++= that
b.result
@@ -200,6 +201,7 @@ trait TraversableLike[+A, +Repr] extends HasNewBuilder[A, Repr] with Traversable
*/
def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That = {
val b = bf(repr)
+ b.sizeHint(this)
for (x <- this) b += f(x)
b.result
}
@@ -428,6 +430,7 @@ trait TraversableLike[+A, +Repr] extends HasNewBuilder[A, Repr] with Traversable
*/
def scanLeft[B, That](z: B)(op: (B, A) => B)(implicit bf: CanBuildFrom[Repr, B, That]): That = {
val b = bf(repr)
+ b.sizeHint(this)
var acc = z
b += acc
for (x <- this) { acc = op(acc, x); b += acc }
@@ -448,6 +451,7 @@ trait TraversableLike[+A, +Repr] extends HasNewBuilder[A, Repr] with Traversable
*/
def scanRight[B, That](z: B)(op: (A, B) => B)(implicit bf: CanBuildFrom[Repr, B, That]): That = {
val b = bf(repr)
+ b.sizeHint(this)
var acc = z
b += acc
for (x <- reversed) { acc = op(x, acc); b += acc }
@@ -516,6 +520,7 @@ trait TraversableLike[+A, +Repr] extends HasNewBuilder[A, Repr] with Traversable
var lst = head
var follow = false
val b = newBuilder
+ b.sizeHint(this, -1)
for (x <- this) {
if (follow) b += lst
else follow = true
@@ -532,6 +537,7 @@ trait TraversableLike[+A, +Repr] extends HasNewBuilder[A, Repr] with Traversable
*/
def take(n: Int): Repr = {
val b = newBuilder
+ b.sizeHintBounded(n, this)
var i = 0
breakable {
for (x <- this) {
@@ -551,6 +557,7 @@ trait TraversableLike[+A, +Repr] extends HasNewBuilder[A, Repr] with Traversable
*/
def drop(n: Int): Repr = {
val b = newBuilder
+ if (n >= 0) b.sizeHint(this, -n)
var i = 0
for (x <- this) {
if (i >= n) b += x
@@ -572,6 +579,7 @@ trait TraversableLike[+A, +Repr] extends HasNewBuilder[A, Repr] with Traversable
*/
def slice(from: Int, until: Int): Repr = {
val b = newBuilder
+ b.sizeHintBounded(until - from, this)
var i = 0
breakable {
for (x <- this) {
@@ -648,6 +656,8 @@ trait TraversableLike[+A, +Repr] extends HasNewBuilder[A, Repr] with Traversable
*/
def splitAt(n: Int): (Repr, Repr) = {
val l, r = newBuilder
+ l.sizeHintBounded(n, this)
+ if (n >= 0) r.sizeHint(this, -n)
var i = 0
for (x <- this) {
(if (i < n) l else r) += x