summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2009-08-19 15:44:26 +0000
committerMartin Odersky <odersky@gmail.com>2009-08-19 15:44:26 +0000
commit1cea0ea34a3d3ebecb9fcf3fd1379f463a083c56 (patch)
tree29eab14d17879d5630cdb7b6b20544101592bbc0 /src
parent169a6a323f4c17dea9619cd43ba3d84d36001797 (diff)
downloadscala-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.scala15
-rw-r--r--src/library/scala/runtime/BoxedArray.scala58
-rw-r--r--src/library/scala/runtime/BoxedBooleanArray.scala3
-rw-r--r--src/library/scala/runtime/BoxedByteArray.scala3
-rw-r--r--src/library/scala/runtime/BoxedCharArray.scala3
-rw-r--r--src/library/scala/runtime/BoxedDoubleArray.scala3
-rw-r--r--src/library/scala/runtime/BoxedFloatArray.scala3
-rw-r--r--src/library/scala/runtime/BoxedIntArray.scala3
-rw-r--r--src/library/scala/runtime/BoxedLongArray.scala3
-rw-r--r--src/library/scala/runtime/BoxedObjectArray.scala5
-rw-r--r--src/library/scala/runtime/BoxedShortArray.scala3
-rw-r--r--src/library/scala/runtime/BoxedUnitArray.scala3
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)