Skip to content

Commit e1a01d2

Browse files
author
Antoine Brunner
committed
Try to optimize dynamicMap
1 parent 18fe0c8 commit e1a01d2

File tree

1 file changed

+62
-6
lines changed

1 file changed

+62
-6
lines changed

library/src/scala/runtime/DynamicTuple.scala

Lines changed: 62 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ object DynamicTuple {
188188
def specialCaseCons[H, This <: Tuple](x: H, self: This): H *: This = {
189189
type Result = H *: This
190190
val res = (self: Any) match {
191-
case () =>
191+
case self: Unit =>
192192
Tuple1(x)
193193
case self: Tuple1[_] =>
194194
Tuple2(x, self._1)
@@ -385,11 +385,67 @@ object DynamicTuple {
385385
).asInstanceOf[Zip[This, T2]]
386386
}
387387

388-
def dynamicMap[This <: Tuple, F[_]](self: This, f: [t] => t => F[t]): Map[This, F] = (self: Any) match {
389-
case self: Unit => ().asInstanceOf[Map[This, F]]
390-
case _ =>
391-
Tuple.fromArray(self.asInstanceOf[Product].productIterator.map(f(_)).toArray) // TODO use toIArray of Object to avoid double/triple array copy
392-
.asInstanceOf[Map[This, F]]
388+
def specialCaseMap[This <: Tuple, F[_]](self: This, f: [t] => t => F[t]): Map[This, F] = {
389+
type Result = Map[This, F]
390+
val res = (self: Any) match {
391+
case sekf: Unit =>
392+
()
393+
case self: Tuple1[_] =>
394+
Tuple1(f(self._1))
395+
case self: Tuple2[_, _] =>
396+
Tuple2(f(self._1), f(self._2))
397+
case self: Tuple3[_, _, _] =>
398+
Tuple3(f(self._1), f(self._2), f(self._3))
399+
case self: Tuple4[_, _, _, _] =>
400+
Tuple4(f(self._1), f(self._2), f(self._3), f(self._4))
401+
case self: Tuple5[_, _, _, _, _] =>
402+
Tuple5(f(self._1), f(self._2), f(self._3), f(self._4), f(self._5))
403+
case self: Tuple6[_, _, _, _, _, _] =>
404+
Tuple6(f(self._1), f(self._2), f(self._3), f(self._4), f(self._5), f(self._6))
405+
case self: Tuple7[_, _, _, _, _, _, _] =>
406+
Tuple7(f(self._1), f(self._2), f(self._3), f(self._4), f(self._5), f(self._6), f(self._7))
407+
case self: Tuple8[_, _, _, _, _, _, _, _] =>
408+
Tuple8(f(self._1), f(self._2), f(self._3), f(self._4), f(self._5), f(self._6), f(self._7), f(self._8))
409+
case self: Tuple9[_, _, _, _, _, _, _, _, _] =>
410+
Tuple9(f(self._1), f(self._2), f(self._3), f(self._4), f(self._5), f(self._6), f(self._7), f(self._8), f(self._9))
411+
case self: Tuple10[_, _, _, _, _, _, _, _, _, _] =>
412+
Tuple10(f(self._1), f(self._2), f(self._3), f(self._4), f(self._5), f(self._6), f(self._7), f(self._8), f(self._9), f(self._10))
413+
case self: Tuple11[_, _, _, _, _, _, _, _, _, _, _] =>
414+
Tuple11(f(self._1), f(self._2), f(self._3), f(self._4), f(self._5), f(self._6), f(self._7), f(self._8), f(self._9), f(self._10), f(self._11))
415+
case self: Tuple12[_, _, _, _, _, _, _, _, _, _, _, _] =>
416+
Tuple12(f(self._1), f(self._2), f(self._3), f(self._4), f(self._5), f(self._6), f(self._7), f(self._8), f(self._9), f(self._10), f(self._11), f(self._12))
417+
case self: Tuple13[_, _, _, _, _, _, _, _, _, _, _, _, _] =>
418+
Tuple13(f(self._1), f(self._2), f(self._3), f(self._4), f(self._5), f(self._6), f(self._7), f(self._8), f(self._9), f(self._10), f(self._11), f(self._12), f(self._13))
419+
case self: Tuple14[_, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
420+
Tuple14(f(self._1), f(self._2), f(self._3), f(self._4), f(self._5), f(self._6), f(self._7), f(self._8), f(self._9), f(self._10), f(self._11), f(self._12), f(self._13), f(self._14))
421+
case self: Tuple15[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
422+
Tuple15(f(self._1), f(self._2), f(self._3), f(self._4), f(self._5), f(self._6), f(self._7), f(self._8), f(self._9), f(self._10), f(self._11), f(self._12), f(self._13), f(self._14), f(self._15))
423+
case self: Tuple16[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
424+
Tuple16(f(self._1), f(self._2), f(self._3), f(self._4), f(self._5), f(self._6), f(self._7), f(self._8), f(self._9), f(self._10), f(self._11), f(self._12), f(self._13), f(self._14), f(self._15), f(self._16))
425+
case self: Tuple17[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
426+
Tuple17(f(self._1), f(self._2), f(self._3), f(self._4), f(self._5), f(self._6), f(self._7), f(self._8), f(self._9), f(self._10), f(self._11), f(self._12), f(self._13), f(self._14), f(self._15), f(self._16), f(self._17))
427+
case self: Tuple18[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
428+
Tuple18(f(self._1), f(self._2), f(self._3), f(self._4), f(self._5), f(self._6), f(self._7), f(self._8), f(self._9), f(self._10), f(self._11), f(self._12), f(self._13), f(self._14), f(self._15), f(self._16), f(self._17), f(self._18))
429+
case self: Tuple19[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
430+
Tuple19(f(self._1), f(self._2), f(self._3), f(self._4), f(self._5), f(self._6), f(self._7), f(self._8), f(self._9), f(self._10), f(self._11), f(self._12), f(self._13), f(self._14), f(self._15), f(self._16), f(self._17), f(self._18), f(self._19))
431+
case self: Tuple20[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
432+
Tuple20(f(self._1), f(self._2), f(self._3), f(self._4), f(self._5), f(self._6), f(self._7), f(self._8), f(self._9), f(self._10), f(self._11), f(self._12), f(self._13), f(self._14), f(self._15), f(self._16), f(self._17), f(self._18), f(self._19), f(self._20))
433+
case self: Tuple21[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
434+
Tuple21(f(self._1), f(self._2), f(self._3), f(self._4), f(self._5), f(self._6), f(self._7), f(self._8), f(self._9), f(self._10), f(self._11), f(self._12), f(self._13), f(self._14), f(self._15), f(self._16), f(self._17), f(self._18), f(self._19), f(self._20), f(self._21))
435+
case self: Tuple22[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
436+
Tuple22(f(self._1), f(self._2), f(self._3), f(self._4), f(self._5), f(self._6), f(self._7), f(self._8), f(self._9), f(self._10), f(self._11), f(self._12), f(self._13), f(self._14), f(self._15), f(self._16), f(self._17), f(self._18), f(self._19), f(self._20), f(self._21), f(self._22))
437+
}
438+
res.asInstanceOf[Result]
439+
}
440+
441+
def dynamicMap[This <: Tuple, F[_]](self: This, f: [t] => t => F[t]): Map[This, F] = {
442+
type Result = Map[This, F]
443+
(self: Any) match {
444+
case xxl: TupleXXL =>
445+
TupleXXL.fromIArray(xxl.elems.asInstanceOf[Array[Object]].map(f[Object]).asInstanceOf[IArray[Object]]).asInstanceOf[Result]
446+
case _ =>
447+
specialCaseMap(self, f)
448+
}
393449
}
394450

395451
def consIterator(head: Any, tail: Tuple): Iterator[Any] =

0 commit comments

Comments
 (0)