1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 package nom.tam.util.array;
33
34 import java.util.Collections;
35 import java.util.HashMap;
36 import java.util.Map;
37
38
39
40
41
42
43
44
45 @Deprecated
46 public class MultiArrayCopyFactory<Source, Destination> {
47
48 private MultiArrayCopyFactory() {
49 }
50
51 private static final class ByteToChar extends MultiArrayCopyFactory<byte[], char[]> {
52
53 @Override
54 public void arraycopy(byte[] src, int srcPos, char[] dest, int destPos, int length) {
55 for (int index = 0; index < length; index++) {
56 dest[index + destPos] = (char) src[index + srcPos];
57 }
58 }
59 }
60
61 private static final class ByteToDouble extends MultiArrayCopyFactory<byte[], double[]> {
62
63 @Override
64 public void arraycopy(byte[] src, int srcPos, double[] dest, int destPos, int length) {
65 for (int index = 0; index < length; index++) {
66 dest[index + destPos] = src[index + srcPos];
67 }
68 }
69 }
70
71 private static final class ByteToFloat extends MultiArrayCopyFactory<byte[], float[]> {
72
73 @Override
74 public void arraycopy(byte[] src, int srcPos, float[] dest, int destPos, int length) {
75 for (int index = 0; index < length; index++) {
76 dest[index + destPos] = src[index + srcPos];
77 }
78 }
79 }
80
81 private static final class ByteToInt extends MultiArrayCopyFactory<byte[], int[]> {
82
83 @Override
84 public void arraycopy(byte[] src, int srcPos, int[] dest, int destPos, int length) {
85 for (int index = 0; index < length; index++) {
86 dest[index + destPos] = src[index + srcPos];
87 }
88 }
89 }
90
91 private static final class ByteToLong extends MultiArrayCopyFactory<byte[], long[]> {
92
93 @Override
94 public void arraycopy(byte[] src, int srcPos, long[] dest, int destPos, int length) {
95 for (int index = 0; index < length; index++) {
96 dest[index + destPos] = src[index + srcPos];
97 }
98 }
99 }
100
101 private static final class ByteToShort extends MultiArrayCopyFactory<byte[], short[]> {
102
103 @Override
104 public void arraycopy(byte[] src, int srcPos, short[] dest, int destPos, int length) {
105 for (int index = 0; index < length; index++) {
106 dest[index + destPos] = src[index + srcPos];
107 }
108 }
109 }
110
111 private static final class CharToByte extends MultiArrayCopyFactory<char[], byte[]> {
112
113 @Override
114 public void arraycopy(char[] src, int srcPos, byte[] dest, int destPos, int length) {
115 for (int index = 0; index < length; index++) {
116 dest[index + destPos] = (byte) src[index + srcPos];
117 }
118 }
119 }
120
121 private static final class CharToDouble extends MultiArrayCopyFactory<char[], double[]> {
122
123 @Override
124 public void arraycopy(char[] src, int srcPos, double[] dest, int destPos, int length) {
125 for (int index = 0; index < length; index++) {
126 dest[index + destPos] = src[index + srcPos];
127 }
128 }
129 }
130
131 private static final class CharToFloat extends MultiArrayCopyFactory<char[], float[]> {
132
133 @Override
134 public void arraycopy(char[] src, int srcPos, float[] dest, int destPos, int length) {
135 for (int index = 0; index < length; index++) {
136 dest[index + destPos] = src[index + srcPos];
137 }
138 }
139 }
140
141 private static final class CharToInt extends MultiArrayCopyFactory<char[], int[]> {
142
143 @Override
144 public void arraycopy(char[] src, int srcPos, int[] dest, int destPos, int length) {
145 for (int index = 0; index < length; index++) {
146 dest[index + destPos] = src[index + srcPos];
147 }
148 }
149 }
150
151 private static final class CharToLong extends MultiArrayCopyFactory<char[], long[]> {
152
153 @Override
154 public void arraycopy(char[] src, int srcPos, long[] dest, int destPos, int length) {
155 for (int index = 0; index < length; index++) {
156 dest[index + destPos] = src[index + srcPos];
157 }
158 }
159 }
160
161 private static final class CharToShort extends MultiArrayCopyFactory<char[], short[]> {
162
163 @Override
164 public void arraycopy(char[] src, int srcPos, short[] dest, int destPos, int length) {
165 for (int index = 0; index < length; index++) {
166 dest[index + destPos] = (short) src[index + srcPos];
167 }
168 }
169 }
170
171 private static final class DoubleToByte extends MultiArrayCopyFactory<double[], byte[]> {
172
173 @Override
174 public void arraycopy(double[] src, int srcPos, byte[] dest, int destPos, int length) {
175 for (int index = 0; index < length; index++) {
176 dest[index + destPos] = (byte) Math.round(src[index + srcPos]);
177 }
178 }
179 }
180
181 private static final class DoubleToChar extends MultiArrayCopyFactory<double[], char[]> {
182
183 @Override
184 public void arraycopy(double[] src, int srcPos, char[] dest, int destPos, int length) {
185 for (int index = 0; index < length; index++) {
186 dest[index + destPos] = (char) Math.round(src[index + srcPos]);
187 }
188 }
189 }
190
191 private static final class DoubleToFloat extends MultiArrayCopyFactory<double[], float[]> {
192
193 @Override
194 public void arraycopy(double[] src, int srcPos, float[] dest, int destPos, int length) {
195 for (int index = 0; index < length; index++) {
196 dest[index + destPos] = (float) src[index + srcPos];
197 }
198 }
199 }
200
201 private static final class DoubleToInt extends MultiArrayCopyFactory<double[], int[]> {
202
203 @Override
204 public void arraycopy(double[] src, int srcPos, int[] dest, int destPos, int length) {
205 for (int index = 0; index < length; index++) {
206 dest[index + destPos] = (int) Math.round(src[index + srcPos]);
207 }
208 }
209 }
210
211 private static final class DoubleToLong extends MultiArrayCopyFactory<double[], long[]> {
212
213 @Override
214 public void arraycopy(double[] src, int srcPos, long[] dest, int destPos, int length) {
215 for (int index = 0; index < length; index++) {
216 dest[index + destPos] = Math.round(src[index + srcPos]);
217 }
218 }
219 }
220
221 private static final class DoubleToShort extends MultiArrayCopyFactory<double[], short[]> {
222
223 @Override
224 public void arraycopy(double[] src, int srcPos, short[] dest, int destPos, int length) {
225 for (int index = 0; index < length; index++) {
226 dest[index + destPos] = (short) Math.round(src[index + srcPos]);
227 }
228 }
229 }
230
231 private static final class FloatToByte extends MultiArrayCopyFactory<float[], byte[]> {
232
233 @Override
234 public void arraycopy(float[] src, int srcPos, byte[] dest, int destPos, int length) {
235 for (int index = 0; index < length; index++) {
236 dest[index + destPos] = (byte) Math.round(src[index + srcPos]);
237 }
238 }
239 }
240
241 private static final class FloatToChar extends MultiArrayCopyFactory<float[], char[]> {
242
243 @Override
244 public void arraycopy(float[] src, int srcPos, char[] dest, int destPos, int length) {
245 for (int index = 0; index < length; index++) {
246 dest[index + destPos] = (char) Math.round(src[index + srcPos]);
247 }
248 }
249 }
250
251 private static final class FloatToDouble extends MultiArrayCopyFactory<float[], double[]> {
252
253 @Override
254 public void arraycopy(float[] src, int srcPos, double[] dest, int destPos, int length) {
255 for (int index = 0; index < length; index++) {
256 dest[index + destPos] = src[index + srcPos];
257 }
258 }
259 }
260
261 private static final class FloatToInt extends MultiArrayCopyFactory<float[], int[]> {
262
263 @Override
264 public void arraycopy(float[] src, int srcPos, int[] dest, int destPos, int length) {
265 for (int index = 0; index < length; index++) {
266 dest[index + destPos] = Math.round(src[index + srcPos]);
267 }
268 }
269 }
270
271 private static final class FloatToLong extends MultiArrayCopyFactory<float[], long[]> {
272
273 @Override
274 public void arraycopy(float[] src, int srcPos, long[] dest, int destPos, int length) {
275 for (int index = 0; index < length; index++) {
276 dest[index + destPos] = Math.round(src[index + srcPos]);
277 }
278 }
279 }
280
281 private static final class FloatToShort extends MultiArrayCopyFactory<float[], short[]> {
282
283 @Override
284 public void arraycopy(float[] src, int srcPos, short[] dest, int destPos, int length) {
285 for (int index = 0; index < length; index++) {
286 dest[index + destPos] = (short) Math.round(src[index + srcPos]);
287 }
288 }
289 }
290
291 private static final class Generic extends MultiArrayCopyFactory<Object, Object> {
292
293 @Override
294 public void arraycopy(Object srcO, int srcPos, Object destO, int destPos, int length) {
295 System.arraycopy(srcO, srcPos, destO, destPos, length);
296 }
297 }
298
299 private static final class IntToByte extends MultiArrayCopyFactory<int[], byte[]> {
300
301 @Override
302 public void arraycopy(int[] src, int srcPos, byte[] dest, int destPos, int length) {
303 for (int index = 0; index < length; index++) {
304 dest[index + destPos] = (byte) src[index + srcPos];
305 }
306 }
307 }
308
309 private static final class IntToChar extends MultiArrayCopyFactory<int[], char[]> {
310
311 @Override
312 public void arraycopy(int[] src, int srcPos, char[] dest, int destPos, int length) {
313 for (int index = 0; index < length; index++) {
314 dest[index + destPos] = (char) src[index + srcPos];
315 }
316 }
317 }
318
319 private static final class IntToDouble extends MultiArrayCopyFactory<int[], double[]> {
320
321 @Override
322 public void arraycopy(int[] src, int srcPos, double[] dest, int destPos, int length) {
323 for (int index = 0; index < length; index++) {
324 dest[index + destPos] = src[index + srcPos];
325 }
326 }
327 }
328
329 private static final class IntToFloat extends MultiArrayCopyFactory<int[], float[]> {
330
331 @Override
332 public void arraycopy(int[] src, int srcPos, float[] dest, int destPos, int length) {
333 for (int index = 0; index < length; index++) {
334 dest[index + destPos] = src[index + srcPos];
335 }
336 }
337 }
338
339 private static final class IntToLong extends MultiArrayCopyFactory<int[], long[]> {
340
341 @Override
342 public void arraycopy(int[] src, int srcPos, long[] dest, int destPos, int length) {
343 for (int index = 0; index < length; index++) {
344 dest[index + destPos] = src[index + srcPos];
345 }
346 }
347 }
348
349 private static final class IntToShort extends MultiArrayCopyFactory<int[], short[]> {
350
351 @Override
352 public void arraycopy(int[] src, int srcPos, short[] dest, int destPos, int length) {
353 for (int index = 0; index < length; index++) {
354 dest[index + destPos] = (short) src[index + srcPos];
355 }
356 }
357 }
358
359 private static final class LongToByte extends MultiArrayCopyFactory<long[], byte[]> {
360
361 @Override
362 public void arraycopy(long[] src, int srcPos, byte[] dest, int destPos, int length) {
363 for (int index = 0; index < length; index++) {
364 dest[index + destPos] = (byte) src[index + srcPos];
365 }
366 }
367 }
368
369 private static final class LongToChar extends MultiArrayCopyFactory<long[], char[]> {
370
371 @Override
372 public void arraycopy(long[] src, int srcPos, char[] dest, int destPos, int length) {
373 for (int index = 0; index < length; index++) {
374 dest[index + destPos] = (char) src[index + srcPos];
375 }
376 }
377 }
378
379 private static final class LongToDouble extends MultiArrayCopyFactory<long[], double[]> {
380
381 @Override
382 public void arraycopy(long[] src, int srcPos, double[] dest, int destPos, int length) {
383 for (int index = 0; index < length; index++) {
384 dest[index + destPos] = src[index + srcPos];
385 }
386 }
387 }
388
389 private static final class LongToFloat extends MultiArrayCopyFactory<long[], float[]> {
390
391 @Override
392 public void arraycopy(long[] src, int srcPos, float[] dest, int destPos, int length) {
393 for (int index = 0; index < length; index++) {
394 dest[index + destPos] = src[index + srcPos];
395 }
396 }
397 }
398
399 private static final class LongToInt extends MultiArrayCopyFactory<long[], int[]> {
400
401 @Override
402 public void arraycopy(long[] src, int srcPos, int[] dest, int destPos, int length) {
403 for (int index = 0; index < length; index++) {
404 dest[index + destPos] = (int) src[index + srcPos];
405 }
406 }
407 }
408
409 private static final class LongToShort extends MultiArrayCopyFactory<long[], short[]> {
410
411 @Override
412 public void arraycopy(long[] src, int srcPos, short[] dest, int destPos, int length) {
413 for (int index = 0; index < length; index++) {
414 dest[index + destPos] = (short) src[index + srcPos];
415 }
416 }
417 }
418
419 private static final class ShortToByte extends MultiArrayCopyFactory<short[], byte[]> {
420
421 @Override
422 public void arraycopy(short[] src, int srcPos, byte[] dest, int destPos, int length) {
423 for (int index = 0; index < length; index++) {
424 dest[index + destPos] = (byte) src[index + srcPos];
425 }
426 }
427 }
428
429 private static final class ShortToChar extends MultiArrayCopyFactory<short[], char[]> {
430
431 @Override
432 public void arraycopy(short[] src, int srcPos, char[] dest, int destPos, int length) {
433 for (int index = 0; index < length; index++) {
434 dest[index + destPos] = (char) src[index + srcPos];
435 }
436 }
437 }
438
439 private static final class ShortToDouble extends MultiArrayCopyFactory<short[], double[]> {
440
441 @Override
442 public void arraycopy(short[] src, int srcPos, double[] dest, int destPos, int length) {
443 for (int index = 0; index < length; index++) {
444 dest[index + destPos] = src[index + srcPos];
445 }
446 }
447 }
448
449 private static final class ShortToFloat extends MultiArrayCopyFactory<short[], float[]> {
450
451 @Override
452 public void arraycopy(short[] src, int srcPos, float[] dest, int destPos, int length) {
453 for (int index = 0; index < length; index++) {
454 dest[index + destPos] = src[index + srcPos];
455 }
456 }
457 }
458
459 private static final class ShortToInt extends MultiArrayCopyFactory<short[], int[]> {
460
461 @Override
462 public void arraycopy(short[] src, int srcPos, int[] dest, int destPos, int length) {
463 for (int index = 0; index < length; index++) {
464 dest[index + destPos] = src[index + srcPos];
465 }
466 }
467 }
468
469 private static final class ShortToLong extends MultiArrayCopyFactory<short[], long[]> {
470
471 @Override
472 public void arraycopy(short[] src, int srcPos, long[] dest, int destPos, int length) {
473 for (int index = 0; index < length; index++) {
474 dest[index + destPos] = src[index + srcPos];
475 }
476 }
477 }
478
479 private static final Map<Class<?>, Map<Class<?>, MultiArrayCopyFactory<?, ?>>> FACTORIES;
480
481 private static final MultiArrayCopyFactory<Object, Object> GENERIC = new Generic();
482
483 static {
484 Map<Class<?>, Map<Class<?>, MultiArrayCopyFactory<?, ?>>> factories = new HashMap<>();
485
486 Map<Class<?>, MultiArrayCopyFactory<byte[], ?>> byteMap = new HashMap<>();
487 byteMap.put(byte.class, new MultiArrayCopyFactory<>());
488 byteMap.put(char.class, new ByteToChar());
489 byteMap.put(short.class, new ByteToShort());
490 byteMap.put(int.class, new ByteToInt());
491 byteMap.put(long.class, new ByteToLong());
492 byteMap.put(float.class, new ByteToFloat());
493 byteMap.put(double.class, new ByteToDouble());
494 factories.put(byte.class, Collections.unmodifiableMap(byteMap));
495
496 Map<Class<?>, MultiArrayCopyFactory<char[], ?>> charMap = new HashMap<>();
497 charMap.put(byte.class, new CharToByte());
498 charMap.put(char.class, new MultiArrayCopyFactory<>());
499 charMap.put(short.class, new CharToShort());
500 charMap.put(int.class, new CharToInt());
501 charMap.put(long.class, new CharToLong());
502 charMap.put(float.class, new CharToFloat());
503 charMap.put(double.class, new CharToDouble());
504 factories.put(char.class, Collections.unmodifiableMap(charMap));
505
506 Map<Class<?>, MultiArrayCopyFactory<short[], ?>> shortMap = new HashMap<>();
507 shortMap.put(byte.class, new ShortToByte());
508 shortMap.put(char.class, new ShortToChar());
509 shortMap.put(short.class, new MultiArrayCopyFactory<>());
510 shortMap.put(int.class, new ShortToInt());
511 shortMap.put(long.class, new ShortToLong());
512 shortMap.put(float.class, new ShortToFloat());
513 shortMap.put(double.class, new ShortToDouble());
514 factories.put(short.class, Collections.unmodifiableMap(shortMap));
515
516 Map<Class<?>, MultiArrayCopyFactory<int[], ?>> intMap = new HashMap<>();
517 intMap.put(byte.class, new IntToByte());
518 intMap.put(char.class, new IntToChar());
519 intMap.put(short.class, new IntToShort());
520 intMap.put(int.class, new MultiArrayCopyFactory<>());
521 intMap.put(long.class, new IntToLong());
522 intMap.put(float.class, new IntToFloat());
523 intMap.put(double.class, new IntToDouble());
524 factories.put(int.class, Collections.unmodifiableMap(intMap));
525
526 Map<Class<?>, MultiArrayCopyFactory<long[], ?>> longMap = new HashMap<>();
527 longMap.put(byte.class, new LongToByte());
528 longMap.put(char.class, new LongToChar());
529 longMap.put(short.class, new LongToShort());
530 longMap.put(int.class, new LongToInt());
531 longMap.put(long.class, new MultiArrayCopyFactory<>());
532 longMap.put(float.class, new LongToFloat());
533 longMap.put(double.class, new LongToDouble());
534 factories.put(long.class, Collections.unmodifiableMap(longMap));
535
536 Map<Class<?>, MultiArrayCopyFactory<float[], ?>> floatMap = new HashMap<>();
537 floatMap.put(byte.class, new FloatToByte());
538 floatMap.put(char.class, new FloatToChar());
539 floatMap.put(short.class, new FloatToShort());
540 floatMap.put(int.class, new FloatToInt());
541 floatMap.put(long.class, new FloatToLong());
542 floatMap.put(float.class, new MultiArrayCopyFactory<>());
543 floatMap.put(double.class, new FloatToDouble());
544 factories.put(float.class, Collections.unmodifiableMap(floatMap));
545
546 Map<Class<?>, MultiArrayCopyFactory<double[], ?>> doubleMap = new HashMap<>();
547 doubleMap.put(byte.class, new DoubleToByte());
548 doubleMap.put(char.class, new DoubleToChar());
549 doubleMap.put(short.class, new DoubleToShort());
550 doubleMap.put(int.class, new DoubleToInt());
551 doubleMap.put(long.class, new DoubleToLong());
552 doubleMap.put(float.class, new DoubleToFloat());
553 doubleMap.put(double.class, new MultiArrayCopyFactory<>());
554 factories.put(double.class, Collections.unmodifiableMap(doubleMap));
555
556 FACTORIES = Collections.unmodifiableMap(factories);
557 }
558
559
560
561
562
563
564
565
566
567 public static synchronized MultiArrayCopyFactory<?, ?> select(Class<?> primitiveType, Class<?> primitiveType2) {
568 Map<Class<?>, MultiArrayCopyFactory<?, ?>> from = MultiArrayCopyFactory.FACTORIES.get(primitiveType);
569 if (from != null) {
570 MultiArrayCopyFactory<?, ?> to = from.get(primitiveType2);
571 if (to != null) {
572 return to;
573 }
574 }
575 return MultiArrayCopyFactory.GENERIC;
576 }
577
578
579
580
581
582
583
584
585
586
587 public void arraycopy(Source src, int srcPos, Destination dest, int destPos, int length) {
588 System.arraycopy(src, srcPos, dest, destPos, length);
589 }
590
591 }