@@ -14,6 +14,28 @@ object DynamicTuple {
14
14
}
15
15
}
16
16
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
+
17
39
def dynamicFromArray [T <: Tuple ](xs : Array [Object ]): T = xs.length match {
18
40
case 0 => ().asInstanceOf [T ]
19
41
case 1 => Tuple1 (xs(0 )).asInstanceOf [T ]
@@ -163,45 +185,79 @@ object DynamicTuple {
163
185
}
164
186
}).asInstanceOf [T ]
165
187
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 ]])
185
247
}
186
- arr
248
+ res. asInstanceOf [ Result ]
187
249
}
188
250
189
251
def dynamicCons [H , This <: Tuple ](x : H , self : This ): H *: This = {
190
252
type Result = H *: This
191
- val res = (self : Any ) match {
253
+ (self : Any ) match {
192
254
case xxl : TupleXXL =>
193
255
val arr = new Array [Object ](xxl.productArity + 1 )
194
256
System .arraycopy(xxl.elems, 0 , arr, 1 , xxl.productArity)
195
257
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)
203
260
}
204
- res.asInstanceOf [Result ]
205
261
}
206
262
207
263
def dynamicConcat [This <: Tuple , That <: Tuple ](self : This , that : That ): Concat [This , That ] = {
@@ -240,11 +296,60 @@ object DynamicTuple {
240
296
case self : Product => self.productArity.asInstanceOf [Size [This ]]
241
297
}
242
298
243
- def dynamicTail [This <: NonEmptyTuple ] (self : This ): Tail [This ] = {
299
+ def specialCaseTail [This <: NonEmptyTuple ] (self : This ): Tail [This ] = {
244
300
type Result = Tail [This ]
245
301
val res = (self : Any ) match {
246
302
case self : Tuple1 [_] =>
247
303
()
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 {
248
353
case xxl : TupleXXL =>
249
354
if (xxl.productArity == 23 ) {
250
355
val elems = xxl.elems
@@ -253,20 +358,14 @@ object DynamicTuple {
253
358
elems(8 ), elems(9 ), elems(10 ), elems(11 ), elems(12 ), elems(13 ), elems(14 ),
254
359
elems(15 ), elems(16 ), elems(17 ), elems(18 ), elems(19 ), elems(20 ),
255
360
elems(21 ), elems(22 )
256
- )
361
+ ). asInstanceOf [ Result ]
257
362
} else {
258
363
val arr = new Array [Object ](self.size - 1 )
259
364
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 ]
261
366
}
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)
268
368
}
269
- res.asInstanceOf [Result ]
270
369
}
271
370
272
371
def dynamicApply [This <: NonEmptyTuple , N <: Int ] (self : This , n : Int ): Elem [This , N ] = {
0 commit comments