diff options
author | Martin Odersky <odersky@gmail.com> | 2009-08-19 15:44:26 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2009-08-19 15:44:26 +0000 |
commit | 1cea0ea34a3d3ebecb9fcf3fd1379f463a083c56 (patch) | |
tree | 29eab14d17879d5630cdb7b6b20544101592bbc0 /src | |
parent | 169a6a323f4c17dea9619cd43ba3d84d36001797 (diff) | |
download | scala-1cea0ea34a3d3ebecb9fcf3fd1379f463a083c56.tar.gz scala-1cea0ea34a3d3ebecb9fcf3fd1379f463a083c56.tar.bz2 scala-1cea0ea34a3d3ebecb9fcf3fd1379f463a083c56.zip |
intermeidate step towards manifests for arrays
Diffstat (limited to 'src')
-rw-r--r-- | src/library/scala/runtime/BoxedAnyArray.scala | 15 | ||||
-rw-r--r-- | src/library/scala/runtime/BoxedArray.scala | 58 | ||||
-rw-r--r-- | src/library/scala/runtime/BoxedBooleanArray.scala | 3 | ||||
-rw-r--r-- | src/library/scala/runtime/BoxedByteArray.scala | 3 | ||||
-rw-r--r-- | src/library/scala/runtime/BoxedCharArray.scala | 3 | ||||
-rw-r--r-- | src/library/scala/runtime/BoxedDoubleArray.scala | 3 | ||||
-rw-r--r-- | src/library/scala/runtime/BoxedFloatArray.scala | 3 | ||||
-rw-r--r-- | src/library/scala/runtime/BoxedIntArray.scala | 3 | ||||
-rw-r--r-- | src/library/scala/runtime/BoxedLongArray.scala | 3 | ||||
-rw-r--r-- | src/library/scala/runtime/BoxedObjectArray.scala | 5 | ||||
-rw-r--r-- | src/library/scala/runtime/BoxedShortArray.scala | 3 | ||||
-rw-r--r-- | src/library/scala/runtime/BoxedUnitArray.scala | 3 |
12 files changed, 73 insertions, 32 deletions
diff --git a/src/library/scala/runtime/BoxedAnyArray.scala b/src/library/scala/runtime/BoxedAnyArray.scala index 42fd4c53bb..78221e128c 100644 --- a/src/library/scala/runtime/BoxedAnyArray.scala +++ b/src/library/scala/runtime/BoxedAnyArray.scala @@ -10,7 +10,7 @@ package scala.runtime - +import scala.reflect.Manifest import compat.Platform /** @@ -22,6 +22,8 @@ import compat.Platform @serializable final class BoxedAnyArray[A](val length: Int) extends BoxedArray[A] { + def elemManifest: Manifest[A] = null + private var boxed = new Array[AnyRef](length) // private val hash = boxed.hashCode() private var unboxed: AnyRef = null @@ -227,15 +229,4 @@ final class BoxedAnyArray[A](val length: Int) extends BoxedArray[A] { var dest1 = adapt(dest) Array.copy(if (unboxed ne null) unboxed else boxed, from, dest1, to, len) } - - final override def filter(p: A => Boolean): BoxedArray[A] = { - val (len, include) = countAndMemo(p) - val result = new BoxedAnyArray[A](len) - var i, j = 0 - while (j < len) { - if (include(i)) { result(j) = this(i); j += 1 } - i += 1 - } - result - } } diff --git a/src/library/scala/runtime/BoxedArray.scala b/src/library/scala/runtime/BoxedArray.scala index d13c08ba38..5e1bf47c9c 100644 --- a/src/library/scala/runtime/BoxedArray.scala +++ b/src/library/scala/runtime/BoxedArray.scala @@ -12,8 +12,10 @@ package scala.runtime import Predef._ -import collection.mutable.{Vector, ArrayBuffer} +import scala.reflect.Manifest +import collection.mutable.{Vector, ArrayBuilder, ArrayBuffer} import collection.generic._ +import collection.Sequence /** * <p>A class representing <code>Array[T]</code></p> @@ -21,7 +23,10 @@ import collection.generic._ * @author Martin Odersky, Stephane Micheloud * @version 1.0 */ -abstract class BoxedArray[A] extends Vector[A] with VectorTemplate[A, BoxedArray[A]] with Boxed { +abstract class BoxedArray[A] extends Vector[A] with VectorTemplate[A, BoxedArray[A]] with Boxed { self => + + /** The manifest of the element type */ + def elemManifest: Manifest[A] /** The length of the array */ def length: Int @@ -33,13 +38,39 @@ abstract class BoxedArray[A] extends Vector[A] with VectorTemplate[A, BoxedArray def update(index: Int, elem: A): Unit /** Creates new builder for this collection ==> move to subclasses + */ + override protected[this] def newBuilder: Builder[A, BoxedArray[A]] = + if (elemManifest != null) new ArrayBuilder[A](elemManifest) + else genericBuilder[A] + + // !!! todo: remove + override def genericBuilder[B]: Builder[B, BoxedArray[B]] = new ArrayBuffer[B].mapResult { + _.toArray.asInstanceOf[BoxedArray[B]] + } + + /** Creates a possible nested vector which consists of all the elements + * of this array. If the elements are arrays themselves, the `deep' transformation + * is applied recursively to them. The stringPrefix of the vector is + * "Array", hence the vector prints like an array with all its + * elements shown, and the same recursively for any subarrays. * - * */ - override protected[this] def newBuilder = genericBuilder[A] + * Example: Array(Array(1, 2), Array(3, 4)).deep.toString + * prints: Array(Array(1, 2), Array(3, 4)) + */ + def deep: Vector[Any] = new Vector[Any] { + def length = self.length + def apply(idx: Int): Any = self.apply(idx) match { + case elem: AnyRef if ScalaRunTime.isArray(elem) => ScalaRunTime.boxArray(elem).deep + case elem => elem + } + override def stringPrefix = "Array" + } + /* override def genericBuilder[B]: Builder[B, BoxedArray[B]] = new ArrayBuffer[B].mapResult { _.toArray.asInstanceOf[BoxedArray[B]] } + */ /** Convert to Java array. * @param elemTag Either one of the tags ".N" where N is the name of a primitive type @@ -75,8 +106,10 @@ abstract class BoxedArray[A] extends Vector[A] with VectorTemplate[A, BoxedArray override def copyToArray[B](xs: Array[B], start: Int, len: Int): Unit = copyTo(0, xs, start, len) + @deprecated("use deep.toString instead") final def deepToString() = deepMkString(stringPrefix + "(", ", ", ")") + @deprecated("use deep.mkString instead") final def deepMkString(start: String, sep: String, end: String): String = { def _deepToString(x: Any) = x match { case a: AnyRef if ScalaRunTime.isArray(a) => @@ -95,8 +128,10 @@ abstract class BoxedArray[A] extends Vector[A] with VectorTemplate[A, BoxedArray buf.toString } + @deprecated("use deep.mkString instead") final def deepMkString(sep: String): String = this.deepMkString("", sep, "") + @deprecated("use array1.deep.equals(array2.deep) instead") final def deepEquals(that: Any): Boolean = { def _deepEquals(x1: Any, x2: Any) = (x1, x2) match { case (a1: BoxedArray[_], a2: BoxedArray[_]) => @@ -126,19 +161,4 @@ abstract class BoxedArray[A] extends Vector[A] with VectorTemplate[A, BoxedArray } override final def stringPrefix: String = "Array" - - protected def countAndMemo(p: A => Boolean): (Int, Array[Boolean]) = { - val len = length - val memo = new Array[Boolean](len) - var count = 0 - var i = 0 - while (i < len) { - if (p(this(i))) { memo(i) = true; count += 1 } - i += 1 - } - (count, memo) - } - - @deprecated("use slice instead") - def subArray(from: Int, end: Int): BoxedArray[A] = slice(from, end) } diff --git a/src/library/scala/runtime/BoxedBooleanArray.scala b/src/library/scala/runtime/BoxedBooleanArray.scala index 6253e12ada..876357f410 100644 --- a/src/library/scala/runtime/BoxedBooleanArray.scala +++ b/src/library/scala/runtime/BoxedBooleanArray.scala @@ -10,10 +10,13 @@ package scala.runtime +import scala.reflect.Manifest @serializable final class BoxedBooleanArray(val value: Array[Boolean]) extends BoxedArray[Boolean] { + def elemManifest = Manifest.Boolean + def length: Int = value.length def apply(index: Int): Boolean = value(index) diff --git a/src/library/scala/runtime/BoxedByteArray.scala b/src/library/scala/runtime/BoxedByteArray.scala index ce3ad42c9e..49b318bfdd 100644 --- a/src/library/scala/runtime/BoxedByteArray.scala +++ b/src/library/scala/runtime/BoxedByteArray.scala @@ -10,10 +10,13 @@ package scala.runtime +import scala.reflect.Manifest @serializable final class BoxedByteArray(val value: Array[Byte]) extends BoxedArray[Byte] { + def elemManifest = Manifest.Byte + def length: Int = value.length def apply(index: Int): Byte = value(index) diff --git a/src/library/scala/runtime/BoxedCharArray.scala b/src/library/scala/runtime/BoxedCharArray.scala index 519c0fda79..df62d4c129 100644 --- a/src/library/scala/runtime/BoxedCharArray.scala +++ b/src/library/scala/runtime/BoxedCharArray.scala @@ -10,10 +10,13 @@ package scala.runtime +import scala.reflect.Manifest @serializable final class BoxedCharArray(val value: Array[Char]) extends BoxedArray[Char] { + def elemManifest = Manifest.Char + def length: Int = value.length def apply(index: Int): Char = value(index) diff --git a/src/library/scala/runtime/BoxedDoubleArray.scala b/src/library/scala/runtime/BoxedDoubleArray.scala index ff6c205f31..91d37778b4 100644 --- a/src/library/scala/runtime/BoxedDoubleArray.scala +++ b/src/library/scala/runtime/BoxedDoubleArray.scala @@ -10,10 +10,13 @@ package scala.runtime +import scala.reflect.Manifest @serializable final class BoxedDoubleArray(val value: Array[Double]) extends BoxedArray[Double] { + def elemManifest = Manifest.Double + def length: Int = value.length def apply(index: Int): Double = value(index) diff --git a/src/library/scala/runtime/BoxedFloatArray.scala b/src/library/scala/runtime/BoxedFloatArray.scala index 0d6ec12795..74891cd217 100644 --- a/src/library/scala/runtime/BoxedFloatArray.scala +++ b/src/library/scala/runtime/BoxedFloatArray.scala @@ -10,10 +10,13 @@ package scala.runtime +import scala.reflect.Manifest @serializable final class BoxedFloatArray(val value: Array[Float]) extends BoxedArray[Float] { + def elemManifest = Manifest.Float + def length: Int = value.length def apply(index: Int): Float = value(index) diff --git a/src/library/scala/runtime/BoxedIntArray.scala b/src/library/scala/runtime/BoxedIntArray.scala index 2b10dd98b1..2eff82f6b5 100644 --- a/src/library/scala/runtime/BoxedIntArray.scala +++ b/src/library/scala/runtime/BoxedIntArray.scala @@ -10,10 +10,13 @@ package scala.runtime +import scala.reflect.Manifest @serializable final class BoxedIntArray(val value: Array[Int]) extends BoxedArray[Int] { + def elemManifest = Manifest.Int + def length: Int = value.length def apply(index: Int): Int = value(index) diff --git a/src/library/scala/runtime/BoxedLongArray.scala b/src/library/scala/runtime/BoxedLongArray.scala index 57bcf19cd2..5aaab0b654 100644 --- a/src/library/scala/runtime/BoxedLongArray.scala +++ b/src/library/scala/runtime/BoxedLongArray.scala @@ -10,10 +10,13 @@ package scala.runtime +import scala.reflect.Manifest @serializable final class BoxedLongArray(val value: Array[Long]) extends BoxedArray[Long] { + def elemManifest = Manifest.Long + def length: Int = value.length def apply(index: Int): Long = value(index) diff --git a/src/library/scala/runtime/BoxedObjectArray.scala b/src/library/scala/runtime/BoxedObjectArray.scala index e19388e1b7..6c1c1abe9c 100644 --- a/src/library/scala/runtime/BoxedObjectArray.scala +++ b/src/library/scala/runtime/BoxedObjectArray.scala @@ -10,11 +10,14 @@ package scala.runtime +import scala.reflect.Manifest import Predef._ @serializable -final class BoxedObjectArray[A <: AnyRef](val value: Array[AnyRef]) extends BoxedArray[A] { +final class BoxedObjectArray[A <: AnyRef](val value: Array[AnyRef], val elemManifest: Manifest[A]) extends BoxedArray[A] { + + def this(value: Array[AnyRef]) = this(value, null) // !!! todo: remove def length: Int = value.length diff --git a/src/library/scala/runtime/BoxedShortArray.scala b/src/library/scala/runtime/BoxedShortArray.scala index b99cc80610..ec1fe36664 100644 --- a/src/library/scala/runtime/BoxedShortArray.scala +++ b/src/library/scala/runtime/BoxedShortArray.scala @@ -10,10 +10,13 @@ package scala.runtime +import scala.reflect.Manifest @serializable final class BoxedShortArray(val value: Array[Short]) extends BoxedArray[Short] { + def elemManifest = Manifest.Short + def length: Int = value.length def apply(index: Int): Short = value(index) diff --git a/src/library/scala/runtime/BoxedUnitArray.scala b/src/library/scala/runtime/BoxedUnitArray.scala index 244ae5c03c..75109b612b 100644 --- a/src/library/scala/runtime/BoxedUnitArray.scala +++ b/src/library/scala/runtime/BoxedUnitArray.scala @@ -10,10 +10,13 @@ package scala.runtime +import scala.reflect.Manifest @serializable final class BoxedUnitArray(val value: Array[Unit]) extends BoxedArray[Unit] { + def elemManifest = Manifest.Unit + def length: Int = value.length def apply(index: Int): Unit = value(index) |