diff options
author | Martin Odersky <odersky@gmail.com> | 2009-08-20 12:59:47 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2009-08-20 12:59:47 +0000 |
commit | 0ae54e25fbdbde5bb71a9c9eb84c37a0dbc42a99 (patch) | |
tree | f9401a9f6e558d753947480fe713f522625967ec | |
parent | fcb6a3772bb6e513d14543177d29061c7eb47b91 (diff) | |
download | scala-0ae54e25fbdbde5bb71a9c9eb84c37a0dbc42a99.tar.gz scala-0ae54e25fbdbde5bb71a9c9eb84c37a0dbc42a99.tar.bz2 scala-0ae54e25fbdbde5bb71a9c9eb84c37a0dbc42a99.zip |
added missing file
-rwxr-xr-x | src/library/scala/collection/mutable/ArrayBuilder.scala | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/src/library/scala/collection/mutable/ArrayBuilder.scala b/src/library/scala/collection/mutable/ArrayBuilder.scala new file mode 100755 index 0000000000..6932fb77ea --- /dev/null +++ b/src/library/scala/collection/mutable/ArrayBuilder.scala @@ -0,0 +1,65 @@ +/* __ *\ +** ________ ___ / / ___ Scala API ** +** / __/ __// _ | / / / _ | (c) 2003-2009, LAMP/EPFL ** +** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ ** +** /____/\___/_/ |_/____/_/ | | ** +** |/ ** +\* */ + +// $Id: ArrayBuffer.scala 18387 2009-07-24 15:28:37Z odersky $ + + +package scala.collection.mutable + +import scala.collection.generic._ +import scala.reflect.Manifest +import scala.runtime.BoxedArray + +/** A builder class for arrays */ +class ArrayBuilder[A](manifest: Manifest[A]) extends Builder[A, BoxedArray[A]] { + + private var elems: BoxedArray[A] = _ + private var capacity: Int = 0 + private var size: Int = 0 + + private def mkArray(size: Int): BoxedArray[A] = { + val newelems = manifest.newArray(size) + if (this.size > 0) Array.copy(elems.value, 0, newelems.value, 0, this.size) + newelems + } + + private def resize(size: Int) { + elems = mkArray(size) + capacity = size + } + + override def sizeHint(size: Int) { + if (capacity < size) resize(size) + } + + private def ensureSize(size: Int) { + if (capacity < size) { + var newsize = if (capacity == 0) 16 else capacity * 2 + while (newsize < size) newsize *= 2 + resize(newsize) + } + } + + def +=(elem: A): this.type = { + ensureSize(size + 1) + elems(size) = elem + size += 1 + this + } + + def clear() { + size = 0 + } + + def result() = { + if (capacity != 0 && capacity == size) elems + else mkArray(size) + } + + // todo: add ++= +} |