diff options
author | Adriaan Moors <adriaan@lightbend.com> | 2016-07-28 08:45:36 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-07-28 08:45:36 -0700 |
commit | 80ee988bceccf947c4c94891a90ea5eae3227766 (patch) | |
tree | f8bda3927ddb8b188d5383e1d57a475b76245e13 | |
parent | 16fd63b8db61fa08d7da1e125fbd1dff3384ff67 (diff) | |
parent | a84c7b9e8894f54d05e5f5f5f6e470f8db784090 (diff) | |
download | scala-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.scala | 11 |
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) |