From af4338c2b2c443fbca53ee937faaef2dfc0748c8 Mon Sep 17 00:00:00 2001 From: Paul Phillips Date: Tue, 27 Apr 2010 19:27:04 +0000 Subject: Added size hints to builders where possible wit... Added size hints to builders where possible without introducing new methods. Closes #3331, review by community. --- src/library/scala/collection/Iterator.scala | 3 +-- src/library/scala/collection/generic/TraversableFactory.scala | 8 ++++++++ 2 files changed, 9 insertions(+), 2 deletions(-) (limited to 'src/library') diff --git a/src/library/scala/collection/Iterator.scala b/src/library/scala/collection/Iterator.scala index 24c447b24b..cbbaf0058c 100644 --- a/src/library/scala/collection/Iterator.scala +++ b/src/library/scala/collection/Iterator.scala @@ -11,8 +11,7 @@ package scala.collection -import mutable.{Buffer, ArrayBuffer, ListBuffer, StringBuilder} -import immutable.{List, Stream} +import mutable.ArrayBuffer import annotation.{ tailrec, migration } /** The `Iterator` object provides various functions for diff --git a/src/library/scala/collection/generic/TraversableFactory.scala b/src/library/scala/collection/generic/TraversableFactory.scala index b7fda70922..ffc4f16466 100644 --- a/src/library/scala/collection/generic/TraversableFactory.scala +++ b/src/library/scala/collection/generic/TraversableFactory.scala @@ -62,6 +62,10 @@ abstract class TraversableFactory[CC[X] <: Traversable[X] with GenericTraversabl */ def concat[A](xss: Traversable[A]*): CC[A] = { val b = newBuilder[A] + // At present we're using IndexedSeq as a proxy for "has a cheap size method". + if (xss forall (_.isInstanceOf[IndexedSeq[_]])) + b.sizeHint(xss map (_.size) sum) + for (xs <- xss) b ++= xs b.result } @@ -73,6 +77,7 @@ abstract class TraversableFactory[CC[X] <: Traversable[X] with GenericTraversabl */ def fill[A](n: Int)(elem: => A): CC[A] = { val b = newBuilder[A] + b.sizeHint(n) var i = 0 while (i < n) { b += elem @@ -130,6 +135,7 @@ abstract class TraversableFactory[CC[X] <: Traversable[X] with GenericTraversabl */ def tabulate[A](n: Int)(f: Int => A): CC[A] = { val b = newBuilder[A] + b.sizeHint(n) var i = 0 while (i < n) { b += f(i) @@ -201,6 +207,7 @@ abstract class TraversableFactory[CC[X] <: Traversable[X] with GenericTraversabl def range(start: Int, end: Int, step: Int): CC[Int] = { if (step == 0) throw new IllegalArgumentException("zero step") val b = newBuilder[Int] + b.sizeHint(Range.count(start, end, step, false)) var i = start while (if (step < 0) end < i else i < end) { b += i @@ -218,6 +225,7 @@ abstract class TraversableFactory[CC[X] <: Traversable[X] with GenericTraversabl */ def iterate[A](start: A, len: Int)(f: A => A): CC[A] = { val b = newBuilder[A] + b.sizeHint(len) var acc = start var i = 0 while (i < len) { -- cgit v1.2.3