summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan@lightbend.com>2016-07-28 08:45:36 -0700
committerGitHub <noreply@github.com>2016-07-28 08:45:36 -0700
commit80ee988bceccf947c4c94891a90ea5eae3227766 (patch)
treef8bda3927ddb8b188d5383e1d57a475b76245e13
parent16fd63b8db61fa08d7da1e125fbd1dff3384ff67 (diff)
parenta84c7b9e8894f54d05e5f5f5f6e470f8db784090 (diff)
downloadscala-80ee988bceccf947c4c94891a90ea5eae3227766.tar.gz
scala-80ee988bceccf947c4c94891a90ea5eae3227766.tar.bz2
scala-80ee988bceccf947c4c94891a90ea5eae3227766.zip
Merge pull request #5250 from dimatkach/fast-array-slice-3
Override `.slice` in ArrayOps to use arraycopy.
-rw-r--r--src/library/scala/collection/mutable/ArrayOps.scala11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/library/scala/collection/mutable/ArrayOps.scala b/src/library/scala/collection/mutable/ArrayOps.scala
index 507585b9cf..3329e35042 100644
--- a/src/library/scala/collection/mutable/ArrayOps.scala
+++ b/src/library/scala/collection/mutable/ArrayOps.scala
@@ -41,6 +41,17 @@ sealed trait ArrayOps[T] extends Any with ArrayLike[T, Array[T]] with CustomPara
if (l > 0) Array.copy(repr, 0, xs, start, l)
}
+ override def slice(from: Int, until: Int): Array[T] = {
+ val lo = math.max(from, 0)
+ val hi = math.min(math.max(until, 0), repr.length)
+ val size = math.max(hi - lo, 0)
+ val result = java.lang.reflect.Array.newInstance(elementClass, size)
+ if (size > 0) {
+ Array.copy(repr, lo, result, 0, size)
+ }
+ result.asInstanceOf[Array[T]]
+ }
+
override def toArray[U >: T : ClassTag]: Array[U] = {
val thatElementClass = implicitly[ClassTag[U]].runtimeClass
if (elementClass eq thatElementClass)