summaryrefslogtreecommitdiff
path: root/src/library/scala/collection/mutable/WrappedArray.scala
diff options
context:
space:
mode:
authorMike Skells <mike.skells@talk21.com>2017-01-25 22:36:08 +0000
committerAdriaan Moors <adriaan@lightbend.com>2017-01-28 14:00:34 -0800
commitd540bf01fe4d9e5c56a68b0d3bada9d97af77e3f (patch)
tree8176ccf542af74edd5ef15f01a51f31095a7d54a /src/library/scala/collection/mutable/WrappedArray.scala
parent4f9faff9370fb7b5ceb767204bca309075a1a62d (diff)
downloadscala-d540bf01fe4d9e5c56a68b0d3bada9d97af77e3f.tar.gz
scala-d540bf01fe4d9e5c56a68b0d3bada9d97af77e3f.tar.bz2
scala-d540bf01fe4d9e5c56a68b0d3bada9d97af77e3f.zip
Optimize slice and take in ArrayOps, WrappedArray
use Array block copy operations rather than builder/iterator
Diffstat (limited to 'src/library/scala/collection/mutable/WrappedArray.scala')
-rw-r--r--src/library/scala/collection/mutable/WrappedArray.scala49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/library/scala/collection/mutable/WrappedArray.scala b/src/library/scala/collection/mutable/WrappedArray.scala
index 8740bda835..81e0e64fb2 100644
--- a/src/library/scala/collection/mutable/WrappedArray.scala
+++ b/src/library/scala/collection/mutable/WrappedArray.scala
@@ -72,6 +72,17 @@ extends AbstractSeq[T]
else
super.toArray[U]
}
+ override def slice(from: Int, until: Int): WrappedArray[T] = {
+ val start = if (from < 0) 0 else from
+ if (until <= start || start >= repr.length)
+ return emptyImpl
+ val end = if (until > length) length else until
+ sliceImpl(start, end)
+ }
+ //retain existing functionallity for existing implementations outside this file
+ protected def emptyImpl: WrappedArray[T] = newBuilder.result()
+ //retain existing functionallity for existing implementations outside this file
+ protected def sliceImpl(from: Int, until: Int): WrappedArray[T] = super.slice(from, until)
override def stringPrefix = "WrappedArray"
@@ -88,6 +99,7 @@ extends AbstractSeq[T]
/** A companion object used to create instances of `WrappedArray`.
*/
object WrappedArray {
+ import java.util
// This is reused for all calls to empty.
private val EmptyWrappedArray = new ofRef[AnyRef](new Array[AnyRef](0))
def empty[T <: AnyRef]: WrappedArray[T] = EmptyWrappedArray.asInstanceOf[WrappedArray[T]]
@@ -121,11 +133,23 @@ object WrappedArray {
def newBuilder[A]: Builder[A, IndexedSeq[A]] = new ArrayBuffer
+ private val emptyWrappedByte = new ofByte(new Array[Byte](0))
+ private val emptyWrappedShort = new ofShort(new Array[Short](0))
+ private val emptyWrappedInt = new ofInt(new Array[Int](0))
+ private val emptyWrappedLong = new ofLong(new Array[Long](0))
+ private val emptyWrappedFloat = new ofFloat(new Array[Float](0))
+ private val emptyWrappedDouble = new ofDouble(new Array[Double](0))
+ private val emptyWrappedUnit = new ofUnit(new Array[Unit](0))
+ private val emptyWrappedChar = new ofChar(new Array[Char](0))
+ private val emptyWrappedBoolean = new ofBoolean(new Array[Boolean](0))
+
final class ofRef[T <: AnyRef](val array: Array[T]) extends WrappedArray[T] with Serializable {
lazy val elemTag = ClassTag[T](arrayElementClass(array.getClass))
def length: Int = array.length
def apply(index: Int): T = array(index).asInstanceOf[T]
def update(index: Int, elem: T) { array(index) = elem }
+ protected override def emptyImpl = new ofRef(util.Arrays.copyOf[T](array,0))
+ protected override def sliceImpl(from: Int, until: Int) = new ofRef[T](util.Arrays.copyOfRange[T](array, from, until))
}
final class ofByte(val array: Array[Byte]) extends WrappedArray[Byte] with Serializable {
@@ -133,6 +157,8 @@ object WrappedArray {
def length: Int = array.length
def apply(index: Int): Byte = array(index)
def update(index: Int, elem: Byte) { array(index) = elem }
+ protected override def emptyImpl = emptyWrappedByte
+ protected override def sliceImpl(from: Int, until: Int) = new ofByte(util.Arrays.copyOfRange(array, from, until))
}
final class ofShort(val array: Array[Short]) extends WrappedArray[Short] with Serializable {
@@ -140,6 +166,8 @@ object WrappedArray {
def length: Int = array.length
def apply(index: Int): Short = array(index)
def update(index: Int, elem: Short) { array(index) = elem }
+ protected override def emptyImpl = emptyWrappedShort
+ protected override def sliceImpl(from: Int, until: Int) = new ofShort(util.Arrays.copyOfRange(array, from, until))
}
final class ofChar(val array: Array[Char]) extends WrappedArray[Char] with Serializable {
@@ -147,6 +175,8 @@ object WrappedArray {
def length: Int = array.length
def apply(index: Int): Char = array(index)
def update(index: Int, elem: Char) { array(index) = elem }
+ protected override def emptyImpl = emptyWrappedChar
+ protected override def sliceImpl(from: Int, until: Int) = new ofChar(util.Arrays.copyOfRange(array, from, until))
}
final class ofInt(val array: Array[Int]) extends WrappedArray[Int] with Serializable {
@@ -154,6 +184,8 @@ object WrappedArray {
def length: Int = array.length
def apply(index: Int): Int = array(index)
def update(index: Int, elem: Int) { array(index) = elem }
+ protected override def emptyImpl = emptyWrappedInt
+ protected override def sliceImpl(from: Int, until: Int) = new ofInt(util.Arrays.copyOfRange(array, from, until))
}
final class ofLong(val array: Array[Long]) extends WrappedArray[Long] with Serializable {
@@ -161,6 +193,8 @@ object WrappedArray {
def length: Int = array.length
def apply(index: Int): Long = array(index)
def update(index: Int, elem: Long) { array(index) = elem }
+ protected override def emptyImpl = emptyWrappedLong
+ protected override def sliceImpl(from: Int, until: Int) = new ofLong(util.Arrays.copyOfRange(array, from, until))
}
final class ofFloat(val array: Array[Float]) extends WrappedArray[Float] with Serializable {
@@ -168,6 +202,8 @@ object WrappedArray {
def length: Int = array.length
def apply(index: Int): Float = array(index)
def update(index: Int, elem: Float) { array(index) = elem }
+ protected override def emptyImpl = emptyWrappedFloat
+ protected override def sliceImpl(from: Int, until: Int) = new ofFloat(util.Arrays.copyOfRange(array, from, until))
}
final class ofDouble(val array: Array[Double]) extends WrappedArray[Double] with Serializable {
@@ -175,6 +211,8 @@ object WrappedArray {
def length: Int = array.length
def apply(index: Int): Double = array(index)
def update(index: Int, elem: Double) { array(index) = elem }
+ protected override def emptyImpl = emptyWrappedDouble
+ protected override def sliceImpl(from: Int, until: Int) = new ofDouble(util.Arrays.copyOfRange(array, from, until))
}
final class ofBoolean(val array: Array[Boolean]) extends WrappedArray[Boolean] with Serializable {
@@ -182,6 +220,8 @@ object WrappedArray {
def length: Int = array.length
def apply(index: Int): Boolean = array(index)
def update(index: Int, elem: Boolean) { array(index) = elem }
+ protected override def emptyImpl = emptyWrappedBoolean
+ protected override def sliceImpl(from: Int, until: Int) = new ofBoolean(util.Arrays.copyOfRange(array, from, until))
}
final class ofUnit(val array: Array[Unit]) extends WrappedArray[Unit] with Serializable {
@@ -189,5 +229,14 @@ object WrappedArray {
def length: Int = array.length
def apply(index: Int): Unit = array(index)
def update(index: Int, elem: Unit) { array(index) = elem }
+ protected override def emptyImpl = emptyWrappedUnit
+ protected override def sliceImpl(from: Int, until: Int) = {
+ // cant use
+ // new ofUnit(util.Arrays.copyOfRange[Unit](array, from, until)) - Unit is special and doesnt compile
+ // cant use util.Arrays.copyOfRange[Unit](repr, from, until) - Unit is special and doesnt compile
+ val res = new Array[Unit](until-from)
+ System.arraycopy(repr, from, res, 0, until-from)
+ new ofUnit(res)
+ }
}
}