Skip to content

Commit dbfb4df

Browse files
committed
fix transpose for arrays of value classes
1 parent 90e9bd2 commit dbfb4df

File tree

2 files changed

+12
-21
lines changed

2 files changed

+12
-21
lines changed

src/dotty/runtime/vc/VCArrayOps.scala

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -43,22 +43,4 @@ class VCArrayOps[T](xs: Array[T]) extends ArrayOps[T] {
4343
else
4444
super.toArray[U]
4545
}
46-
47-
override def transpose[U](implicit asArray: T => Array[U]): Array[Array[U]] = {
48-
val bb: Builder[Array[U], Array[Array[U]]] = Array.newBuilder(ClassTag[Array[U]](vcElementClass))
49-
if (isEmpty) bb.result()
50-
else {
51-
def mkRowBuilder() = Array.newBuilder(ClassTag[U](arrayElementClass(vcElementClass)))
52-
val bs = asArray(head) map (_ => mkRowBuilder())
53-
for (xs <- this) {
54-
var i = 0
55-
for (x <- asArray(xs)) {
56-
bs(i) += x
57-
i += 1
58-
}
59-
}
60-
for (b <- bs) bb += b.result()
61-
bb.result()
62-
}
63-
}
6446
}

src/scala/collection/mutable/ArrayOps.scala

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ trait ArrayOps[T] extends Any with ArrayLike[T, Array[T]] with CustomParalleliza
8484
b.result()
8585
}
8686

87+
//TODO: rewrite this method
8788
/** Transposes a two dimensional array.
8889
*
8990
* @tparam U Type of row elements.
@@ -94,16 +95,24 @@ trait ArrayOps[T] extends Any with ArrayLike[T, Array[T]] with CustomParalleliza
9495
val bb: Builder[Array[U], Array[Array[U]]] = Array.newBuilder(ClassTag[Array[U]](elementClass))
9596
if (isEmpty) bb.result()
9697
else {
97-
def mkRowBuilder() = Array.newBuilder(ClassTag[U](arrayElementClass(elementClass)))
98-
val bs = asArray(head) map (_ => mkRowBuilder())
98+
val checkHead = asArray(head)
99+
val ct = if (classOf[dotty.runtime.vc.VCArrayPrototype[_]].isAssignableFrom(elementClass)) {
100+
if (checkHead.nonEmpty)
101+
ClassTag(checkHead(0).getClass).asInstanceOf[ClassTag[U]]
102+
//TODO: this ClassTag shouldn't be used in code below (checkHead is empty and mkRowBuilder can't be invoded)
103+
else ClassTag.Object //change to null
104+
} else ClassTag[U](arrayElementClass(elementClass))
105+
//TODO: move ct generation inside mkRowBuilder
106+
def mkRowBuilder() = Array.newBuilder(ct).asInstanceOf[ArrayBuilder[U]]
107+
val bs = checkHead map (_ => mkRowBuilder())
99108
for (xs <- this) {
100109
var i = 0
101110
for (x <- asArray(xs)) {
102111
bs(i) += x
103112
i += 1
104113
}
105114
}
106-
for (b <- bs) bb += b.result()
115+
for (b <- bs) bb += b.result().asInstanceOf[Array[U]]
107116
bb.result()
108117
}
109118
}

0 commit comments

Comments
 (0)