@@ -14,6 +14,28 @@ object DynamicTuple {
1414 }
1515 }
1616
17+ def dynamicToArray (self : Tuple ): Array [Object ] = (self : Any ) match {
18+ case self : Unit => Array .emptyObjectArray
19+ case self : TupleXXL => self.toArray
20+ case self : Product => productToArray(self)
21+ }
22+
23+ def dynamicToIArray (self : Tuple ): IArray [Object ] = (self : Any ) match {
24+ case self : Unit => Array .emptyObjectArray.asInstanceOf [IArray [Object ]] // TODO use IArray.emptyObjectIArray
25+ case self : TupleXXL => self.elems
26+ case self : Product => productToArray(self).asInstanceOf [IArray [Object ]]
27+ }
28+
29+ def productToArray (self : Product ): Array [Object ] = {
30+ val arr = new Array [Object ](self.productArity)
31+ var i = 0
32+ while (i < arr.length) {
33+ arr(i) = self.productElement(i).asInstanceOf [Object ]
34+ i += 1
35+ }
36+ arr
37+ }
38+
1739 def dynamicFromArray [T <: Tuple ](xs : Array [Object ]): T = xs.length match {
1840 case 0 => ().asInstanceOf [T ]
1941 case 1 => Tuple1 (xs(0 )).asInstanceOf [T ]
@@ -163,45 +185,79 @@ object DynamicTuple {
163185 }
164186 }).asInstanceOf [T ]
165187
166-
167- def dynamicToArray (self : Tuple ): Array [Object ] = (self : Any ) match {
168- case self : Unit => Array .emptyObjectArray
169- case self : TupleXXL => self.toArray
170- case self : Product => productToArray(self)
171- }
172-
173- def dynamicToIArray (self : Tuple ): IArray [Object ] = (self : Any ) match {
174- case self : Unit => Array .emptyObjectArray.asInstanceOf [IArray [Object ]] // TODO use IArray.emptyObjectIArray
175- case self : TupleXXL => self.elems
176- case self : Product => productToArray(self).asInstanceOf [IArray [Object ]]
177- }
178-
179- def productToArray (self : Product ): Array [Object ] = {
180- val arr = new Array [Object ](self.productArity)
181- var i = 0
182- while (i < arr.length) {
183- arr(i) = self.productElement(i).asInstanceOf [Object ]
184- i += 1
188+ def specialCaseCons [H , This <: Tuple ](x : H , self : This ): H *: This = {
189+ type Result = H *: This
190+ val res = (self : Any ) match {
191+ case () =>
192+ Tuple1 (x)
193+ case self : Tuple1 [_] =>
194+ Tuple2 (x, self._1)
195+ case self : Tuple2 [_, _] =>
196+ Tuple3 (x, self._1, self._2)
197+ case self : Tuple3 [_, _, _] =>
198+ Tuple4 (x, self._1, self._2, self._3)
199+ case self : Tuple4 [_, _, _, _] =>
200+ Tuple5 (x, self._1, self._2, self._3, self._4)
201+ case self : Tuple5 [_, _, _, _, _] =>
202+ Tuple6 (x, self._1, self._2, self._3, self._4, self._5)
203+ case self : Tuple6 [_, _, _, _, _, _] =>
204+ Tuple7 (x, self._1, self._2, self._3, self._4, self._5, self._6)
205+ case self : Tuple7 [_, _, _, _, _, _, _] =>
206+ Tuple8 (x, self._1, self._2, self._3, self._4, self._5, self._6, self._7)
207+ case self : Tuple8 [_, _, _, _, _, _, _, _] =>
208+ Tuple9 (x, self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8)
209+ case self : Tuple9 [_, _, _, _, _, _, _, _, _] =>
210+ Tuple10 (x, self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9)
211+ case self : Tuple10 [_, _, _, _, _, _, _, _, _, _] =>
212+ Tuple11 (x, self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10)
213+ case self : Tuple11 [_, _, _, _, _, _, _, _, _, _, _] =>
214+ Tuple12 (x, self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11)
215+ case self : Tuple12 [_, _, _, _, _, _, _, _, _, _, _, _] =>
216+ Tuple13 (x, self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12)
217+ case self : Tuple13 [_, _, _, _, _, _, _, _, _, _, _, _, _] =>
218+ Tuple14 (x, self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13)
219+ case self : Tuple14 [_, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
220+ Tuple15 (x, self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14)
221+ case self : Tuple15 [_, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
222+ Tuple16 (x, self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15)
223+ case self : Tuple16 [_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
224+ Tuple17 (x, self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15, self._16)
225+ case self : Tuple17 [_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
226+ Tuple18 (x, self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15, self._16, self._17)
227+ case self : Tuple18 [_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
228+ Tuple19 (x, self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15, self._16, self._17, self._18)
229+ case self : Tuple19 [_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
230+ Tuple20 (x, self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15, self._16, self._17, self._18, self._19)
231+ case self : Tuple20 [_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
232+ Tuple21 (x, self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15, self._16, self._17, self._18, self._19, self._20)
233+ case self : Tuple21 [_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
234+ Tuple22 (x, self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15, self._16, self._17, self._18, self._19, self._20, self._21)
235+ case self : Tuple22 [_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
236+ val arr : Array [Object ] = Array (
237+ x.asInstanceOf [Object ], self._1.asInstanceOf [Object ], self._2.asInstanceOf [Object ],
238+ self._3.asInstanceOf [Object ], self._4.asInstanceOf [Object ], self._5.asInstanceOf [Object ],
239+ self._6.asInstanceOf [Object ], self._7.asInstanceOf [Object ], self._8.asInstanceOf [Object ],
240+ self._9.asInstanceOf [Object ], self._10.asInstanceOf [Object ], self._11.asInstanceOf [Object ],
241+ self._12.asInstanceOf [Object ], self._13.asInstanceOf [Object ], self._14.asInstanceOf [Object ],
242+ self._15.asInstanceOf [Object ], self._16.asInstanceOf [Object ], self._17.asInstanceOf [Object ],
243+ self._18.asInstanceOf [Object ], self._19.asInstanceOf [Object ], self._20.asInstanceOf [Object ],
244+ self._21.asInstanceOf [Object ], self._22.asInstanceOf [Object ],
245+ )
246+ TupleXXL .fromIArray(arr.asInstanceOf [IArray [Object ]])
185247 }
186- arr
248+ res. asInstanceOf [ Result ]
187249 }
188250
189251 def dynamicCons [H , This <: Tuple ](x : H , self : This ): H *: This = {
190252 type Result = H *: This
191- val res = (self : Any ) match {
253+ (self : Any ) match {
192254 case xxl : TupleXXL =>
193255 val arr = new Array [Object ](xxl.productArity + 1 )
194256 System .arraycopy(xxl.elems, 0 , arr, 1 , xxl.productArity)
195257 arr(0 ) = x.asInstanceOf [Object ]
196- TupleXXL .fromIArray(arr.asInstanceOf [IArray [Object ]])
197- case () =>
198- Tuple1 (x)
199- case _ =>
200- val arr = new Array [Object ](self.size + 1 )
201- itToArray(self.asInstanceOf [Product ].productIterator, self.size, arr, 1 )
202- dynamicFromIArray[Result ](arr.asInstanceOf [IArray [Object ]])
258+ TupleXXL .fromIArray(arr.asInstanceOf [IArray [Object ]]).asInstanceOf [Result ]
259+ case _ => specialCaseCons(x, self)
203260 }
204- res.asInstanceOf [Result ]
205261 }
206262
207263 def dynamicConcat [This <: Tuple , That <: Tuple ](self : This , that : That ): Concat [This , That ] = {
@@ -240,11 +296,60 @@ object DynamicTuple {
240296 case self : Product => self.productArity.asInstanceOf [Size [This ]]
241297 }
242298
243- def dynamicTail [This <: NonEmptyTuple ] (self : This ): Tail [This ] = {
299+ def specialCaseTail [This <: NonEmptyTuple ] (self : This ): Tail [This ] = {
244300 type Result = Tail [This ]
245301 val res = (self : Any ) match {
246302 case self : Tuple1 [_] =>
247303 ()
304+ case self : Tuple2 [_, _] =>
305+ Tuple1 (self._2)
306+ case self : Tuple3 [_, _, _] =>
307+ Tuple2 (self._2, self._3)
308+ case self : Tuple4 [_, _, _, _] =>
309+ Tuple3 (self._2, self._3, self._4)
310+ case self : Tuple5 [_, _, _, _, _] =>
311+ Tuple4 (self._2, self._3, self._4, self._5)
312+ case self : Tuple6 [_, _, _, _, _, _] =>
313+ Tuple5 (self._2, self._3, self._4, self._5, self._6)
314+ case self : Tuple7 [_, _, _, _, _, _, _] =>
315+ Tuple6 (self._2, self._3, self._4, self._5, self._6, self._7)
316+ case self : Tuple8 [_, _, _, _, _, _, _, _] =>
317+ Tuple7 (self._2, self._3, self._4, self._5, self._6, self._7, self._8)
318+ case self : Tuple9 [_, _, _, _, _, _, _, _, _] =>
319+ Tuple8 (self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9)
320+ case self : Tuple10 [_, _, _, _, _, _, _, _, _, _] =>
321+ Tuple9 (self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10)
322+ case self : Tuple11 [_, _, _, _, _, _, _, _, _, _, _] =>
323+ Tuple10 (self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11)
324+ case self : Tuple12 [_, _, _, _, _, _, _, _, _, _, _, _] =>
325+ Tuple11 (self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12)
326+ case self : Tuple13 [_, _, _, _, _, _, _, _, _, _, _, _, _] =>
327+ Tuple12 (self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13)
328+ case self : Tuple14 [_, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
329+ Tuple13 (self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14)
330+ case self : Tuple15 [_, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
331+ Tuple14 (self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15)
332+ case self : Tuple16 [_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
333+ Tuple15 (self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15, self._16)
334+ case self : Tuple17 [_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
335+ Tuple16 (self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15, self._16, self._17)
336+ case self : Tuple18 [_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
337+ Tuple17 (self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15, self._16, self._17, self._18)
338+ case self : Tuple19 [_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
339+ Tuple18 (self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15, self._16, self._17, self._18, self._19)
340+ case self : Tuple20 [_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
341+ Tuple19 (self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15, self._16, self._17, self._18, self._19, self._20)
342+ case self : Tuple21 [_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
343+ Tuple20 (self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15, self._16, self._17, self._18, self._19, self._20, self._21)
344+ case self : Tuple22 [_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
345+ Tuple21 (self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15, self._16, self._17, self._18, self._19, self._20, self._21, self._22)
346+ }
347+ res.asInstanceOf [Result ]
348+ }
349+
350+ def dynamicTail [This <: NonEmptyTuple ] (self : This ): Tail [This ] = {
351+ type Result = Tail [This ]
352+ (self : Any ) match {
248353 case xxl : TupleXXL =>
249354 if (xxl.productArity == 23 ) {
250355 val elems = xxl.elems
@@ -253,20 +358,14 @@ object DynamicTuple {
253358 elems(8 ), elems(9 ), elems(10 ), elems(11 ), elems(12 ), elems(13 ), elems(14 ),
254359 elems(15 ), elems(16 ), elems(17 ), elems(18 ), elems(19 ), elems(20 ),
255360 elems(21 ), elems(22 )
256- )
361+ ). asInstanceOf [ Result ]
257362 } else {
258363 val arr = new Array [Object ](self.size - 1 )
259364 System .arraycopy(xxl.elems, 1 , arr, 0 , self.size - 1 )
260- TupleXXL .fromIArray(arr.asInstanceOf [IArray [Object ]])
365+ TupleXXL .fromIArray(arr.asInstanceOf [IArray [Object ]]). asInstanceOf [ Result ]
261366 }
262- case _ =>
263- val arr = new Array [Object ](self.size - 1 )
264- val it = self.asInstanceOf [Product ].productIterator
265- it.next()
266- itToArray(it, self.size - 1 , arr, 0 )
267- dynamicFromIArray[Result ](arr.asInstanceOf [IArray [Object ]])
367+ case _ => specialCaseTail(self)
268368 }
269- res.asInstanceOf [Result ]
270369 }
271370
272371 def dynamicApply [This <: NonEmptyTuple , N <: Int ] (self : This , n : Int ): Elem [This , N ] = {
0 commit comments