View Javadoc
1   /*
2    * #%L
3    * nom.tam FITS library
4    * %%
5    * Copyright (C) 1996 - 2024 nom-tam-fits
6    * %%
7    * This is free and unencumbered software released into the public domain.
8    *
9    * Anyone is free to copy, modify, publish, use, compile, sell, or
10   * distribute this software, either in source code form or as a compiled
11   * binary, for any purpose, commercial or non-commercial, and by any
12   * means.
13   *
14   * In jurisdictions that recognize copyright laws, the author or authors
15   * of this software dedicate any and all copyright interest in the
16   * software to the public domain. We make this dedication for the benefit
17   * of the public at large and to the detriment of our heirs and
18   * successors. We intend this dedication to be an overt act of
19   * relinquishment in perpetuity of all present and future rights to this
20   * software under copyright law.
21   *
22   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23   * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24   * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
25   * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
26   * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
27   * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
28   * OTHER DEALINGS IN THE SOFTWARE.
29   * #L%
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   * @deprecated               (<i>for internal use</i>) use {@link MultiArrayCopier} instead. Make copies of
40   *                               multi-dimensional arrays.
41   * 
42   * @param      <Source>      The generic type of array from which we want to copy elements
43   * @param      <Destination> The generic type of array to which we want to copy elements.
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      * @deprecated                for internal use only. This ought to be private.
561      * 
562      * @param      primitiveType  the primitive class of the elements in the source array
563      * @param      primitiveType2 the primitive class of the elements in the destination array
564      * 
565      * @return                    A suitable copier instance.
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      * See {@link System#arraycopy(Object, int, Object, int, int)}.
580      * 
581      * @param src     the source array
582      * @param srcPos  starting position in the source array
583      * @param dest    the destination array
584      * @param destPos starting position in the destonation array
585      * @param length  the number of elements to copy
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 }