Skip to content

Commit

Permalink
Added tests to Copy and added an extension method for copying arrays …
Browse files Browse the repository at this point in the history
…on JVM and Native.

Removed nativeCopy from all platforms and Primitive and String Array copy extension methods.  Now one extension provides copy method for all Arrays on JVM and Native.
  • Loading branch information
c committed Sep 20, 2023
1 parent ba3f648 commit 28c6a39
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 31 deletions.
2 changes: 0 additions & 2 deletions narr/js/src/main/scala/narr/native/package.scala
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,4 @@ package object native {

inline def makeNativeArrayOfSize[A: ClassTag](n:Int):NativeArray[A] = new scala.scalajs.js.Array[A](n)

def nativeCopy[T](nArr:NArray[T]):NArray[T] = nArr.asInstanceOf[NArr[T]].slice(0, nArr.length).asInstanceOf[NArray[T]]

}
40 changes: 14 additions & 26 deletions narr/jvm-native/src/main/scala/narr/native/package.scala
Original file line number Diff line number Diff line change
Expand Up @@ -38,19 +38,6 @@ package object native {

inline def makeNativeArrayOfSize[A:ClassTag](n:Int):NativeArray[A] = new Array[A](n)

def nativeCopy[T](a: NArray[T]): NArray[T] = (a match {
case nArr: Array[Boolean] => util.Arrays.copyOf(nArr, nArr.length)
case nArr: Array[Byte] => util.Arrays.copyOf(nArr, nArr.length)
case nArr: Array[Short] => util.Arrays.copyOf(nArr, nArr.length)
case nArr: Array[Int] => util.Arrays.copyOf(nArr, nArr.length)
case nArr: Array[Long] => util.Arrays.copyOf(nArr, nArr.length)
case nArr: Array[Float] => util.Arrays.copyOf(nArr, nArr.length)
case nArr: Array[Double] => util.Arrays.copyOf(nArr, nArr.length)
case nArr: Array[Char] => util.Arrays.copyOf(nArr, nArr.length)
case nArr: Array[String] => util.Arrays.copyOf(nArr, nArr.length)
case _ => util.Arrays.copyOf[T](a.asInstanceOf[Array[AnyRef & T]], a.length)
}).asInstanceOf[NArr[T] & NArray[T]]

object NArray {
export Array.*
}
Expand All @@ -62,70 +49,71 @@ package object native {
extension (ua: NArray[Unit]) {
inline def sort(): NArray[Unit] = ua
inline def sort(ot: Ordering[Unit]): NArray[Unit] = ua
inline def copy: NArray[Unit] = NArray.fill[Unit](ua.length)(())
}

extension (ba: NArray[Boolean]) {
inline def sort(): NArray[Boolean] = sort(Ordering.Boolean)
inline def sort(ot: Ordering[Boolean]): NArray[Boolean] = {
quickSort[Boolean](ba)(ot); ba
}
inline def copy: NArray[Boolean] = util.Arrays.copyOf(ba, ba.length)
}

extension (ba: ByteArray) {
inline def sort(): ByteArray = { util.Arrays.sort(ba); ba}
inline def sort(ot: Ordering[Byte]): ByteArray = { quickSort[Byte](ba)(ot); ba}
inline def copy:ByteArray = util.Arrays.copyOf(ba, ba.length)
}
extension (sa: ShortArray) {
inline def sort(): ShortArray = { util.Arrays.sort(sa); sa }
inline def sort(ot: Ordering[Short]): ShortArray = { quickSort[Short](sa)(ot); sa}
inline def copy:ShortArray = util.Arrays.copyOf(sa, sa.length)
}

extension (ia: IntArray) {
inline def sort(): IntArray = { util.Arrays.sort(ia); ia }
inline def sort(ot: Ordering[Int]): IntArray = { quickSort[Int](ia)(ot); ia }
inline def copy:IntArray = util.Arrays.copyOf(ia, ia.length)
}

extension (la: NArray[Long]) {
inline def sort(): NArray[Long] = { util.Arrays.sort(la); la }
inline def sort(ot: Ordering[Long]): NArray[Long] = { quickSort[Long](la)(ot); la}
inline def copy:NArray[Long] = util.Arrays.copyOf(la, la.length)
}

extension (fa: FloatArray) {
inline def sort(): FloatArray = { util.Arrays.sort(fa); fa }
inline def sort(ot: Ordering[Float]): FloatArray = { quickSort[Float](fa)(ot); fa }
inline def copy:FloatArray = util.Arrays.copyOf(fa, fa.length)
}

extension (da: DoubleArray) {
inline def sort(): DoubleArray = { util.Arrays.sort(da); da }
inline def sort(ot: Ordering[Double]): DoubleArray = { quickSort[Double](da)(ot); da }
inline def copy:DoubleArray = util.Arrays.copyOf(da, da.length)
}

extension (ca: NArray[Char]) {
inline def sort(): NArray[Char] = { util.Arrays.sort(ca); ca }
inline def sort(ot: Ordering[Char]): NArray[Char] = { quickSort[Char](ca)(ot); ca }
inline def copy:NArray[Char] = util.Arrays.copyOf(ca, ca.length)
}

extension (a: NArray[String]) {
inline def sort(): NArray[String] = { quickSort[String](a)(Ordering.String); a }
inline def sort(ot: Ordering[String]): NArray[String] = { quickSort[String](a)(ot); a }
// inline def copy:NArray[String] = util.Arrays.copyOf(a, a.length)
}

extension[T <: AnyRef] (a:NArray[T]) {
inline def sort(ot:Ordering[T]): NArray[T] = { quickSort[T](a)(ot); a }
}

inline def copy:NArray[T] = {
util.Arrays.copyOf[T](a.asInstanceOf[Array[T]], a.length)
}
extension[T](a:NArray[T]) {
def copy: NArray[T] = (a match {
case nArr: Array[Boolean] => util.Arrays.copyOf(nArr, nArr.length)
case nArr: Array[Byte] => util.Arrays.copyOf(nArr, nArr.length)
case nArr: Array[Short] => util.Arrays.copyOf(nArr, nArr.length)
case nArr: Array[Int] => util.Arrays.copyOf(nArr, nArr.length)
case nArr: Array[Long] => util.Arrays.copyOf(nArr, nArr.length)
case nArr: Array[Float] => util.Arrays.copyOf(nArr, nArr.length)
case nArr: Array[Double] => util.Arrays.copyOf(nArr, nArr.length)
case nArr: Array[Char] => util.Arrays.copyOf(nArr, nArr.length)
case nArr: Array[String] => util.Arrays.copyOf(nArr, nArr.length)
case _ => util.Arrays.copyOf[T](a.asInstanceOf[Array[AnyRef & T]], a.length)
}).asInstanceOf[NArr[T] & NArray[T]]
}
}
}
2 changes: 1 addition & 1 deletion narr/shared/src/main/scala/narr/package.scala
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ package object narr {
case _ => makeNativeArrayOfSize[A](length)
}).asInstanceOf[NArr[A] & NArray[A]]

def copy[T](nArr: NArray[T]): NArray[T] = native.nativeCopy[T](nArr)
def copy[T](nArr: NArray[T]): NArray[T] = nArr.slice(0, nArr.length)

inline def fill[A](length: Int)(t: A)(using ClassTag[A]): NArray[A] = {
val out: NArray[A] = ofSize[A](length)
Expand Down
13 changes: 11 additions & 2 deletions tests/shared/src/test/scala/Copy.scala
Original file line number Diff line number Diff line change
Expand Up @@ -35,48 +35,55 @@ class Copy extends munit.FunSuite:
// Unit
val uaTabulate: NArray[Unit] = NArray.tabulate[Unit](N)(_ => ())
assertNArrayEquality[Unit](uaTabulate, uaTabulate.copy)
assertNArrayEquality[Unit](uaTabulate, copy(uaTabulate))

N += 1
// Boolean
val boolArrTabulate: NArray[Boolean] = NArray.tabulate[Boolean](N)((i: Int) => i % 2 == 0)
assertNArrayEquality[Boolean](boolArrTabulate, boolArrTabulate.copy)
assertNArrayEquality[Boolean](boolArrTabulate, copy(boolArrTabulate))


N += 1
// Byte
val baTabulate:NArray[Byte] = NArray.tabulate[Byte](N)((i:Int) => i.toByte)
assertNArrayEquality[Byte](baTabulate, baTabulate.copy)
assertNArrayEquality[Byte](baTabulate, copy(baTabulate))

N += 1
// Short
val saTabulate: NArray[Short] = NArray.tabulate[Short](N)((i: Int) => i.toShort)
assertNArrayEquality[Short](saTabulate, saTabulate.copy)
assertNArrayEquality[Short](saTabulate, copy(saTabulate))

N += 1
// Int
val iaTabulate: NArray[Int] = NArray.tabulate[Int](N)((i: Int) => i)
assertNArrayEquality[Int](iaTabulate, iaTabulate.copy)
assertNArrayEquality[Int](iaTabulate, copy(iaTabulate))

N += 1
// Long
val laTabulate: NArray[Long] = NArray.tabulate[Long](N)((i: Int) => i.toLong)
assertNArrayEquality[Long](laTabulate, laTabulate.copy)
assertNArrayEquality[Long](laTabulate, copy(laTabulate))


N += 1
// Float
val faTabulate: NArray[Float] = NArray.tabulate[Float](N)((i: Int) => i.toFloat)
assertNArrayEquality[Float](faTabulate, faTabulate.copy)
assertNArrayEquality[Float](faTabulate, copy(faTabulate))

N += 1
// Double
val daTabulate: NArray[Double] = NArray.tabulate[Double](N)((i: Int) => i.toDouble)
assertNArrayEquality[Double](daTabulate, daTabulate.copy)
assertNArrayEquality[Double](daTabulate, copy(daTabulate))

N += 1
// Char
val caTabulate: NArray[Char] = NArray.tabulate[Char](N)((i: Int) => i.toChar)
assertNArrayEquality[Char](caTabulate, caTabulate.copy)
assertNArrayEquality[Char](caTabulate, copy(caTabulate))

////////////////////
// Reference Types:
Expand All @@ -86,11 +93,13 @@ class Copy extends munit.FunSuite:
// String
val strArrTabulate: NArray[String] = NArray.tabulate[String](N)((i: Int) => i.toString)
assertNArrayEquality[String](strArrTabulate, strArrTabulate.copy)
assertNArrayEquality[String](strArrTabulate, copy(strArrTabulate))

N += 1
// AnyRef
val anyRefArrTabulate: NArray[AnyRef] = NArray.tabulate[AnyRef](N)(_ => new AnyRef())
assertNArrayEquality[AnyRef](anyRefArrTabulate, anyRefArrTabulate.copy)
assertNArrayEquality[AnyRef](anyRefArrTabulate, copy(anyRefArrTabulate))

}

Expand Down

0 comments on commit 28c6a39

Please sign in to comment.