diff --git a/library/src/scala/IArray.scala b/library/src/scala/IArray.scala index f66bad0b6b20..21a36e00b565 100644 --- a/library/src/scala/IArray.scala +++ b/library/src/scala/IArray.scala @@ -52,6 +52,18 @@ object opaques: // but we can use `exists` instead, which is how `ArrayOps#contains` itself is implemented: genericArrayOps(arr).exists(_ == elem) + /** Copy elements of this array to another array. */ + extension [T, U >: T](arr: IArray[T]) def copyToArray(xs: Array[U]): Int = + genericArrayOps(arr).copyToArray(xs) + + /** Copy elements of this array to another array. */ + extension [T, U >: T](arr: IArray[T]) def copyToArray(xs: Array[U], start: Int): Int = + genericArrayOps(arr).copyToArray(xs, start) + + /** Copy elements of this array to another array. */ + extension [T, U >: T](arr: IArray[T]) def copyToArray(xs: Array[U], start: Int, len: Int): Int = + genericArrayOps(arr).copyToArray(xs, start, len) + /** Counts the number of elements in this array which satisfy a predicate */ extension [T](arr: IArray[T]) def count(p: T => Boolean): Int = genericArrayOps(arr).count(p) @@ -247,6 +259,10 @@ object opaques: extension [T](arr: IArray[T]) def takeWhile(p: T => Boolean): IArray[T] = genericArrayOps(arr).takeWhile(p) + /** Returns a mutable copy of this immutable array. */ + extension [T](arr: IArray[T]) def toArray: Array[T] = + arr.clone.asInstanceOf[Array[T]] + /** Converts an array of pairs into an array of first elements and an array of second elements. */ extension [U: ClassTag, V: ClassTag](arr: IArray[(U, V)]) def unzip: (IArray[U], IArray[V]) = genericArrayOps(arr).unzip diff --git a/tests/run/iarrays.scala b/tests/run/iarrays.scala index 26a189c08eaa..2892b53e6b08 100644 --- a/tests/run/iarrays.scala +++ b/tests/run/iarrays.scala @@ -70,4 +70,17 @@ object Test extends App { val cs: Array[Double] = bs.asInstanceOf[Array[Double]] cs(1) = 3.0 assert(bs(1) == 3.0) -} \ No newline at end of file + + // Check copyToArray + val ds: IArray[Int] = IArray(1, 2, 3) + val es: Array[Int] = new Array[Int](10) + ds.copyToArray(es, 5, 2) + assert(es.toList == List(0, 0, 0, 0, 0, 1, 2, 0, 0, 0)) + val fs: Array[Any] = new Array[Any](10) + ds.copyToArray(fs, 5, 2) + assert(fs.toList == List(null, null, null, null, null, 1, 2, null, null, null)) + + // Check toArray + ds.toArray(0) = 0 + assert(ds(0) == 1) +}