summaryrefslogtreecommitdiff
path: root/src/library/scala/collection/mutable/WrappedArrayBuilder.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/library/scala/collection/mutable/WrappedArrayBuilder.scala')
-rwxr-xr-xsrc/library/scala/collection/mutable/WrappedArrayBuilder.scala64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/library/scala/collection/mutable/WrappedArrayBuilder.scala b/src/library/scala/collection/mutable/WrappedArrayBuilder.scala
new file mode 100755
index 0000000000..bf363cc097
--- /dev/null
+++ b/src/library/scala/collection/mutable/WrappedArrayBuilder.scala
@@ -0,0 +1,64 @@
+/* __ *\
+** ________ ___ / / ___ 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.ClassManifest
+
+/** A builder class for arrays */
+class WrappedArrayBuilder[A](manifest: ClassManifest[A]) extends Builder[A, WrappedArray[A]] {
+
+ private var elems: WrappedArray[A] = _
+ private var capacity: Int = 0
+ private var size: Int = 0
+
+ private def mkArray(size: Int): WrappedArray[A] = {
+ val newelems = manifest.newWrappedArray(size)
+ if (this.size > 0) Array.copy(elems.array, 0, newelems.array, 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 ++=
+}