• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package org.bouncycastle.util;
2 
3 import java.math.BigInteger;
4 import java.util.NoSuchElementException;
5 
6 /**
7  * General array utilities.
8  */
9 public final class Arrays
10 {
Arrays()11     private Arrays()
12     {
13         // static class, hide constructor
14     }
15 
areEqual( boolean[] a, boolean[] b)16     public static boolean areEqual(
17         boolean[]  a,
18         boolean[]  b)
19     {
20         if (a == b)
21         {
22             return true;
23         }
24 
25         if (a == null || b == null)
26         {
27             return false;
28         }
29 
30         if (a.length != b.length)
31         {
32             return false;
33         }
34 
35         for (int i = 0; i != a.length; i++)
36         {
37             if (a[i] != b[i])
38             {
39                 return false;
40             }
41         }
42 
43         return true;
44     }
45 
areEqual( char[] a, char[] b)46     public static boolean areEqual(
47         char[]  a,
48         char[]  b)
49     {
50         if (a == b)
51         {
52             return true;
53         }
54 
55         if (a == null || b == null)
56         {
57             return false;
58         }
59 
60         if (a.length != b.length)
61         {
62             return false;
63         }
64 
65         for (int i = 0; i != a.length; i++)
66         {
67             if (a[i] != b[i])
68             {
69                 return false;
70             }
71         }
72 
73         return true;
74     }
75 
areEqual( byte[] a, byte[] b)76     public static boolean areEqual(
77         byte[]  a,
78         byte[]  b)
79     {
80         if (a == b)
81         {
82             return true;
83         }
84 
85         if (a == null || b == null)
86         {
87             return false;
88         }
89 
90         if (a.length != b.length)
91         {
92             return false;
93         }
94 
95         for (int i = 0; i != a.length; i++)
96         {
97             if (a[i] != b[i])
98             {
99                 return false;
100             }
101         }
102 
103         return true;
104     }
105 
areEqual( short[] a, short[] b)106     public static boolean areEqual(
107         short[]  a,
108         short[]  b)
109     {
110         if (a == b)
111         {
112             return true;
113         }
114 
115         if (a == null || b == null)
116         {
117             return false;
118         }
119 
120         if (a.length != b.length)
121         {
122             return false;
123         }
124 
125         for (int i = 0; i != a.length; i++)
126         {
127             if (a[i] != b[i])
128             {
129                 return false;
130             }
131         }
132 
133         return true;
134     }
135 
136     /**
137      * A constant time equals comparison - does not terminate early if
138      * test will fail.
139      *
140      * @param a first array
141      * @param b second array
142      * @return true if arrays equal, false otherwise.
143      */
constantTimeAreEqual( byte[] a, byte[] b)144     public static boolean constantTimeAreEqual(
145         byte[]  a,
146         byte[]  b)
147     {
148         if (a == b)
149         {
150             return true;
151         }
152 
153         if (a == null || b == null)
154         {
155             return false;
156         }
157 
158         if (a.length != b.length)
159         {
160             return false;
161         }
162 
163         int nonEqual = 0;
164 
165         for (int i = 0; i != a.length; i++)
166         {
167             nonEqual |= (a[i] ^ b[i]);
168         }
169 
170         return nonEqual == 0;
171     }
172 
areEqual( int[] a, int[] b)173     public static boolean areEqual(
174         int[]  a,
175         int[]  b)
176     {
177         if (a == b)
178         {
179             return true;
180         }
181 
182         if (a == null || b == null)
183         {
184             return false;
185         }
186 
187         if (a.length != b.length)
188         {
189             return false;
190         }
191 
192         for (int i = 0; i != a.length; i++)
193         {
194             if (a[i] != b[i])
195             {
196                 return false;
197             }
198         }
199 
200         return true;
201     }
202 
areEqual( long[] a, long[] b)203     public static boolean areEqual(
204         long[]  a,
205         long[]  b)
206     {
207         if (a == b)
208         {
209             return true;
210         }
211 
212         if (a == null || b == null)
213         {
214             return false;
215         }
216 
217         if (a.length != b.length)
218         {
219             return false;
220         }
221 
222         for (int i = 0; i != a.length; i++)
223         {
224             if (a[i] != b[i])
225             {
226                 return false;
227             }
228         }
229 
230         return true;
231     }
232 
areEqual(Object[] a, Object[] b)233     public static boolean areEqual(Object[] a, Object[] b)
234     {
235         if (a == b)
236         {
237             return true;
238         }
239         if (a == null || b == null)
240         {
241             return false;
242         }
243         if (a.length != b.length)
244         {
245             return false;
246         }
247         for (int i = 0; i != a.length; i++)
248         {
249             Object objA = a[i], objB = b[i];
250             if (objA == null)
251             {
252                 if (objB != null)
253                 {
254                     return false;
255                 }
256             }
257             else if (!objA.equals(objB))
258             {
259                 return false;
260             }
261         }
262         return true;
263     }
264 
compareUnsigned(byte[] a, byte[] b)265     public static int compareUnsigned(byte[] a, byte[] b)
266     {
267         if (a == b)
268         {
269             return 0;
270         }
271         if (a == null)
272         {
273             return -1;
274         }
275         if (b == null)
276         {
277             return 1;
278         }
279         int minLen = Math.min(a.length, b.length);
280         for (int i = 0; i < minLen; ++i)
281         {
282             int aVal = a[i] & 0xFF, bVal = b[i] & 0xFF;
283             if (aVal < bVal)
284             {
285                 return -1;
286             }
287             if (aVal > bVal)
288             {
289                 return 1;
290             }
291         }
292         if (a.length < b.length)
293         {
294             return -1;
295         }
296         if (a.length > b.length)
297         {
298             return 1;
299         }
300         return 0;
301     }
302 
contains(short[] a, short n)303     public static boolean contains(short[] a, short n)
304     {
305         for (int i = 0; i < a.length; ++i)
306         {
307             if (a[i] == n)
308             {
309                 return true;
310             }
311         }
312         return false;
313     }
314 
contains(int[] a, int n)315     public static boolean contains(int[] a, int n)
316     {
317         for (int i = 0; i < a.length; ++i)
318         {
319             if (a[i] == n)
320             {
321                 return true;
322             }
323         }
324         return false;
325     }
326 
fill( byte[] array, byte value)327     public static void fill(
328         byte[] array,
329         byte value)
330     {
331         for (int i = 0; i < array.length; i++)
332         {
333             array[i] = value;
334         }
335     }
336 
fill( char[] array, char value)337     public static void fill(
338         char[] array,
339         char value)
340     {
341         for (int i = 0; i < array.length; i++)
342         {
343             array[i] = value;
344         }
345     }
346 
fill( long[] array, long value)347     public static void fill(
348         long[] array,
349         long value)
350     {
351         for (int i = 0; i < array.length; i++)
352         {
353             array[i] = value;
354         }
355     }
356 
fill( short[] array, short value)357     public static void fill(
358         short[] array,
359         short value)
360     {
361         for (int i = 0; i < array.length; i++)
362         {
363             array[i] = value;
364         }
365     }
366 
fill( int[] array, int value)367     public static void fill(
368         int[] array,
369         int value)
370     {
371         for (int i = 0; i < array.length; i++)
372         {
373             array[i] = value;
374         }
375     }
376 
hashCode(byte[] data)377     public static int hashCode(byte[] data)
378     {
379         if (data == null)
380         {
381             return 0;
382         }
383 
384         int i = data.length;
385         int hc = i + 1;
386 
387         while (--i >= 0)
388         {
389             hc *= 257;
390             hc ^= data[i];
391         }
392 
393         return hc;
394     }
395 
hashCode(byte[] data, int off, int len)396     public static int hashCode(byte[] data, int off, int len)
397     {
398         if (data == null)
399         {
400             return 0;
401         }
402 
403         int i = len;
404         int hc = i + 1;
405 
406         while (--i >= 0)
407         {
408             hc *= 257;
409             hc ^= data[off + i];
410         }
411 
412         return hc;
413     }
414 
hashCode(char[] data)415     public static int hashCode(char[] data)
416     {
417         if (data == null)
418         {
419             return 0;
420         }
421 
422         int i = data.length;
423         int hc = i + 1;
424 
425         while (--i >= 0)
426         {
427             hc *= 257;
428             hc ^= data[i];
429         }
430 
431         return hc;
432     }
433 
hashCode(int[][] ints)434     public static int hashCode(int[][] ints)
435     {
436         int hc = 0;
437 
438         for (int i = 0; i != ints.length; i++)
439         {
440             hc = hc * 257 + hashCode(ints[i]);
441         }
442 
443         return hc;
444     }
445 
hashCode(int[] data)446     public static int hashCode(int[] data)
447     {
448         if (data == null)
449         {
450             return 0;
451         }
452 
453         int i = data.length;
454         int hc = i + 1;
455 
456         while (--i >= 0)
457         {
458             hc *= 257;
459             hc ^= data[i];
460         }
461 
462         return hc;
463     }
464 
hashCode(int[] data, int off, int len)465     public static int hashCode(int[] data, int off, int len)
466     {
467         if (data == null)
468         {
469             return 0;
470         }
471 
472         int i = len;
473         int hc = i + 1;
474 
475         while (--i >= 0)
476         {
477             hc *= 257;
478             hc ^= data[off + i];
479         }
480 
481         return hc;
482     }
483 
hashCode(long[] data)484     public static int hashCode(long[] data)
485     {
486         if (data == null)
487         {
488             return 0;
489         }
490 
491         int i = data.length;
492         int hc = i + 1;
493 
494         while (--i >= 0)
495         {
496             long di = data[i];
497             hc *= 257;
498             hc ^= (int)di;
499             hc *= 257;
500             hc ^= (int)(di >>> 32);
501         }
502 
503         return hc;
504     }
505 
hashCode(long[] data, int off, int len)506     public static int hashCode(long[] data, int off, int len)
507     {
508         if (data == null)
509         {
510             return 0;
511         }
512 
513         int i = len;
514         int hc = i + 1;
515 
516         while (--i >= 0)
517         {
518             long di = data[off + i];
519             hc *= 257;
520             hc ^= (int)di;
521             hc *= 257;
522             hc ^= (int)(di >>> 32);
523         }
524 
525         return hc;
526     }
527 
hashCode(short[][][] shorts)528     public static int hashCode(short[][][] shorts)
529     {
530         int hc = 0;
531 
532         for (int i = 0; i != shorts.length; i++)
533         {
534             hc = hc * 257 + hashCode(shorts[i]);
535         }
536 
537         return hc;
538     }
539 
hashCode(short[][] shorts)540     public static int hashCode(short[][] shorts)
541     {
542         int hc = 0;
543 
544         for (int i = 0; i != shorts.length; i++)
545         {
546             hc = hc * 257 + hashCode(shorts[i]);
547         }
548 
549         return hc;
550     }
551 
hashCode(short[] data)552     public static int hashCode(short[] data)
553     {
554         if (data == null)
555         {
556             return 0;
557         }
558 
559         int i = data.length;
560         int hc = i + 1;
561 
562         while (--i >= 0)
563         {
564             hc *= 257;
565             hc ^= (data[i] & 0xff);
566         }
567 
568         return hc;
569     }
570 
hashCode(Object[] data)571     public static int hashCode(Object[] data)
572     {
573         if (data == null)
574         {
575             return 0;
576         }
577 
578         int i = data.length;
579         int hc = i + 1;
580 
581         while (--i >= 0)
582         {
583             hc *= 257;
584             hc ^= data[i].hashCode();
585         }
586 
587         return hc;
588     }
589 
clone(byte[] data)590     public static byte[] clone(byte[] data)
591     {
592         if (data == null)
593         {
594             return null;
595         }
596         byte[] copy = new byte[data.length];
597 
598         System.arraycopy(data, 0, copy, 0, data.length);
599 
600         return copy;
601     }
602 
clone(char[] data)603     public static char[] clone(char[] data)
604     {
605         if (data == null)
606         {
607             return null;
608         }
609         char[] copy = new char[data.length];
610 
611         System.arraycopy(data, 0, copy, 0, data.length);
612 
613         return copy;
614     }
615 
clone(byte[] data, byte[] existing)616     public static byte[] clone(byte[] data, byte[] existing)
617     {
618         if (data == null)
619         {
620             return null;
621         }
622         if ((existing == null) || (existing.length != data.length))
623         {
624             return clone(data);
625         }
626         System.arraycopy(data, 0, existing, 0, existing.length);
627         return existing;
628     }
629 
clone(byte[][] data)630     public static byte[][] clone(byte[][] data)
631     {
632         if (data == null)
633         {
634             return null;
635         }
636 
637         byte[][] copy = new byte[data.length][];
638 
639         for (int i = 0; i != copy.length; i++)
640         {
641             copy[i] = clone(data[i]);
642         }
643 
644         return copy;
645     }
646 
clone(byte[][][] data)647     public static byte[][][] clone(byte[][][] data)
648     {
649         if (data == null)
650         {
651             return null;
652         }
653 
654         byte[][][] copy = new byte[data.length][][];
655 
656         for (int i = 0; i != copy.length; i++)
657         {
658             copy[i] = clone(data[i]);
659         }
660 
661         return copy;
662     }
663 
clone(int[] data)664     public static int[] clone(int[] data)
665     {
666         if (data == null)
667         {
668             return null;
669         }
670         int[] copy = new int[data.length];
671 
672         System.arraycopy(data, 0, copy, 0, data.length);
673 
674         return copy;
675     }
676 
clone(long[] data)677     public static long[] clone(long[] data)
678     {
679         if (data == null)
680         {
681             return null;
682         }
683         long[] copy = new long[data.length];
684 
685         System.arraycopy(data, 0, copy, 0, data.length);
686 
687         return copy;
688     }
689 
clone(long[] data, long[] existing)690     public static long[] clone(long[] data, long[] existing)
691     {
692         if (data == null)
693         {
694             return null;
695         }
696         if ((existing == null) || (existing.length != data.length))
697         {
698             return clone(data);
699         }
700         System.arraycopy(data, 0, existing, 0, existing.length);
701         return existing;
702     }
703 
clone(short[] data)704     public static short[] clone(short[] data)
705     {
706         if (data == null)
707         {
708             return null;
709         }
710         short[] copy = new short[data.length];
711 
712         System.arraycopy(data, 0, copy, 0, data.length);
713 
714         return copy;
715     }
716 
clone(BigInteger[] data)717     public static BigInteger[] clone(BigInteger[] data)
718     {
719         if (data == null)
720         {
721             return null;
722         }
723         BigInteger[] copy = new BigInteger[data.length];
724 
725         System.arraycopy(data, 0, copy, 0, data.length);
726 
727         return copy;
728     }
729 
copyOf(byte[] data, int newLength)730     public static byte[] copyOf(byte[] data, int newLength)
731     {
732         byte[] tmp = new byte[newLength];
733 
734         if (newLength < data.length)
735         {
736             System.arraycopy(data, 0, tmp, 0, newLength);
737         }
738         else
739         {
740             System.arraycopy(data, 0, tmp, 0, data.length);
741         }
742 
743         return tmp;
744     }
745 
copyOf(char[] data, int newLength)746     public static char[] copyOf(char[] data, int newLength)
747     {
748         char[] tmp = new char[newLength];
749 
750         if (newLength < data.length)
751         {
752             System.arraycopy(data, 0, tmp, 0, newLength);
753         }
754         else
755         {
756             System.arraycopy(data, 0, tmp, 0, data.length);
757         }
758 
759         return tmp;
760     }
761 
copyOf(int[] data, int newLength)762     public static int[] copyOf(int[] data, int newLength)
763     {
764         int[] tmp = new int[newLength];
765 
766         if (newLength < data.length)
767         {
768             System.arraycopy(data, 0, tmp, 0, newLength);
769         }
770         else
771         {
772             System.arraycopy(data, 0, tmp, 0, data.length);
773         }
774 
775         return tmp;
776     }
777 
copyOf(long[] data, int newLength)778     public static long[] copyOf(long[] data, int newLength)
779     {
780         long[] tmp = new long[newLength];
781 
782         if (newLength < data.length)
783         {
784             System.arraycopy(data, 0, tmp, 0, newLength);
785         }
786         else
787         {
788             System.arraycopy(data, 0, tmp, 0, data.length);
789         }
790 
791         return tmp;
792     }
793 
copyOf(BigInteger[] data, int newLength)794     public static BigInteger[] copyOf(BigInteger[] data, int newLength)
795     {
796         BigInteger[] tmp = new BigInteger[newLength];
797 
798         if (newLength < data.length)
799         {
800             System.arraycopy(data, 0, tmp, 0, newLength);
801         }
802         else
803         {
804             System.arraycopy(data, 0, tmp, 0, data.length);
805         }
806 
807         return tmp;
808     }
809 
810     /**
811      * Make a copy of a range of bytes from the passed in data array. The range can
812      * extend beyond the end of the input array, in which case the return array will
813      * be padded with zeroes.
814      *
815      * @param data the array from which the data is to be copied.
816      * @param from the start index at which the copying should take place.
817      * @param to the final index of the range (exclusive).
818      *
819      * @return a new byte array containing the range given.
820      */
copyOfRange(byte[] data, int from, int to)821     public static byte[] copyOfRange(byte[] data, int from, int to)
822     {
823         int newLength = getLength(from, to);
824 
825         byte[] tmp = new byte[newLength];
826 
827         if (data.length - from < newLength)
828         {
829             System.arraycopy(data, from, tmp, 0, data.length - from);
830         }
831         else
832         {
833             System.arraycopy(data, from, tmp, 0, newLength);
834         }
835 
836         return tmp;
837     }
838 
copyOfRange(int[] data, int from, int to)839     public static int[] copyOfRange(int[] data, int from, int to)
840     {
841         int newLength = getLength(from, to);
842 
843         int[] tmp = new int[newLength];
844 
845         if (data.length - from < newLength)
846         {
847             System.arraycopy(data, from, tmp, 0, data.length - from);
848         }
849         else
850         {
851             System.arraycopy(data, from, tmp, 0, newLength);
852         }
853 
854         return tmp;
855     }
856 
copyOfRange(long[] data, int from, int to)857     public static long[] copyOfRange(long[] data, int from, int to)
858     {
859         int newLength = getLength(from, to);
860 
861         long[] tmp = new long[newLength];
862 
863         if (data.length - from < newLength)
864         {
865             System.arraycopy(data, from, tmp, 0, data.length - from);
866         }
867         else
868         {
869             System.arraycopy(data, from, tmp, 0, newLength);
870         }
871 
872         return tmp;
873     }
874 
copyOfRange(BigInteger[] data, int from, int to)875     public static BigInteger[] copyOfRange(BigInteger[] data, int from, int to)
876     {
877         int newLength = getLength(from, to);
878 
879         BigInteger[] tmp = new BigInteger[newLength];
880 
881         if (data.length - from < newLength)
882         {
883             System.arraycopy(data, from, tmp, 0, data.length - from);
884         }
885         else
886         {
887             System.arraycopy(data, from, tmp, 0, newLength);
888         }
889 
890         return tmp;
891     }
892 
getLength(int from, int to)893     private static int getLength(int from, int to)
894     {
895         int newLength = to - from;
896         if (newLength < 0)
897         {
898             StringBuffer sb = new StringBuffer(from);
899             sb.append(" > ").append(to);
900             throw new IllegalArgumentException(sb.toString());
901         }
902         return newLength;
903     }
904 
append(byte[] a, byte b)905     public static byte[] append(byte[] a, byte b)
906     {
907         if (a == null)
908         {
909             return new byte[]{ b };
910         }
911 
912         int length = a.length;
913         byte[] result = new byte[length + 1];
914         System.arraycopy(a, 0, result, 0, length);
915         result[length] = b;
916         return result;
917     }
918 
append(short[] a, short b)919     public static short[] append(short[] a, short b)
920     {
921         if (a == null)
922         {
923             return new short[]{ b };
924         }
925 
926         int length = a.length;
927         short[] result = new short[length + 1];
928         System.arraycopy(a, 0, result, 0, length);
929         result[length] = b;
930         return result;
931     }
932 
append(int[] a, int b)933     public static int[] append(int[] a, int b)
934     {
935         if (a == null)
936         {
937             return new int[]{ b };
938         }
939 
940         int length = a.length;
941         int[] result = new int[length + 1];
942         System.arraycopy(a, 0, result, 0, length);
943         result[length] = b;
944         return result;
945     }
946 
append(String[] a, String b)947     public static String[] append(String[] a, String b)
948     {
949         if (a == null)
950         {
951             return new String[]{ b };
952         }
953 
954         int length = a.length;
955         String[] result = new String[length + 1];
956         System.arraycopy(a, 0, result, 0, length);
957         result[length] = b;
958         return result;
959     }
960 
961 
962 
concatenate(byte[] a, byte[] b)963     public static byte[] concatenate(byte[] a, byte[] b)
964     {
965         if (a != null && b != null)
966         {
967             byte[] rv = new byte[a.length + b.length];
968 
969             System.arraycopy(a, 0, rv, 0, a.length);
970             System.arraycopy(b, 0, rv, a.length, b.length);
971 
972             return rv;
973         }
974         else if (b != null)
975         {
976             return clone(b);
977         }
978         else
979         {
980             return clone(a);
981         }
982     }
983 
concatenate(byte[] a, byte[] b, byte[] c)984     public static byte[] concatenate(byte[] a, byte[] b, byte[] c)
985     {
986         if (a != null && b != null && c != null)
987         {
988             byte[] rv = new byte[a.length + b.length + c.length];
989 
990             System.arraycopy(a, 0, rv, 0, a.length);
991             System.arraycopy(b, 0, rv, a.length, b.length);
992             System.arraycopy(c, 0, rv, a.length + b.length, c.length);
993 
994             return rv;
995         }
996         else if (a == null)
997         {
998             return concatenate(b, c);
999         }
1000         else if (b == null)
1001         {
1002             return concatenate(a, c);
1003         }
1004         else
1005         {
1006             return concatenate(a, b);
1007         }
1008     }
1009 
concatenate(byte[] a, byte[] b, byte[] c, byte[] d)1010     public static byte[] concatenate(byte[] a, byte[] b, byte[] c, byte[] d)
1011     {
1012         if (a != null && b != null && c != null && d != null)
1013         {
1014             byte[] rv = new byte[a.length + b.length + c.length + d.length];
1015 
1016             System.arraycopy(a, 0, rv, 0, a.length);
1017             System.arraycopy(b, 0, rv, a.length, b.length);
1018             System.arraycopy(c, 0, rv, a.length + b.length, c.length);
1019             System.arraycopy(d, 0, rv, a.length + b.length + c.length, d.length);
1020 
1021             return rv;
1022         }
1023         else if (d == null)
1024         {
1025             return concatenate(a, b, c);
1026         }
1027         else if (c == null)
1028         {
1029             return concatenate(a, b, d);
1030         }
1031         else if (b == null)
1032         {
1033             return concatenate(a, c, d);
1034         }
1035         else
1036         {
1037             return concatenate(b, c, d);
1038         }
1039     }
1040 
concatenate(byte[][] arrays)1041     public static byte[] concatenate(byte[][] arrays)
1042     {
1043         int size = 0;
1044         for (int i = 0; i != arrays.length; i++)
1045         {
1046             size += arrays[i].length;
1047         }
1048 
1049         byte[] rv = new byte[size];
1050 
1051         int offSet = 0;
1052         for (int i = 0; i != arrays.length; i++)
1053         {
1054             System.arraycopy(arrays[i], 0, rv, offSet, arrays[i].length);
1055             offSet += arrays[i].length;
1056         }
1057 
1058         return rv;
1059     }
1060 
concatenate(int[] a, int[] b)1061     public static int[] concatenate(int[] a, int[] b)
1062     {
1063         if (a == null)
1064         {
1065             return clone(b);
1066         }
1067         if (b == null)
1068         {
1069             return clone(a);
1070         }
1071 
1072         int[] c = new int[a.length + b.length];
1073         System.arraycopy(a, 0, c, 0, a.length);
1074         System.arraycopy(b, 0, c, a.length, b.length);
1075         return c;
1076     }
1077 
prepend(byte[] a, byte b)1078     public static byte[] prepend(byte[] a, byte b)
1079     {
1080         if (a == null)
1081         {
1082             return new byte[]{ b };
1083         }
1084 
1085         int length = a.length;
1086         byte[] result = new byte[length + 1];
1087         System.arraycopy(a, 0, result, 1, length);
1088         result[0] = b;
1089         return result;
1090     }
1091 
prepend(short[] a, short b)1092     public static short[] prepend(short[] a, short b)
1093     {
1094         if (a == null)
1095         {
1096             return new short[]{ b };
1097         }
1098 
1099         int length = a.length;
1100         short[] result = new short[length + 1];
1101         System.arraycopy(a, 0, result, 1, length);
1102         result[0] = b;
1103         return result;
1104     }
1105 
prepend(int[] a, int b)1106     public static int[] prepend(int[] a, int b)
1107     {
1108         if (a == null)
1109         {
1110             return new int[]{ b };
1111         }
1112 
1113         int length = a.length;
1114         int[] result = new int[length + 1];
1115         System.arraycopy(a, 0, result, 1, length);
1116         result[0] = b;
1117         return result;
1118     }
1119 
reverse(byte[] a)1120     public static byte[] reverse(byte[] a)
1121     {
1122         if (a == null)
1123         {
1124             return null;
1125         }
1126 
1127         int p1 = 0, p2 = a.length;
1128         byte[] result = new byte[p2];
1129 
1130         while (--p2 >= 0)
1131         {
1132             result[p2] = a[p1++];
1133         }
1134 
1135         return result;
1136     }
1137 
reverse(int[] a)1138     public static int[] reverse(int[] a)
1139     {
1140         if (a == null)
1141         {
1142             return null;
1143         }
1144 
1145         int p1 = 0, p2 = a.length;
1146         int[] result = new int[p2];
1147 
1148         while (--p2 >= 0)
1149         {
1150             result[p2] = a[p1++];
1151         }
1152 
1153         return result;
1154     }
1155 
1156     /**
1157      * Iterator backed by a specific array.
1158      */
1159     public static class Iterator<T>
1160         implements java.util.Iterator<T>
1161     {
1162         private final T[] dataArray;
1163 
1164         private int position = 0;
1165 
1166         /**
1167          * Base constructor.
1168          * <p>
1169          * Note: the array is not cloned, changes to it will affect the values returned by next().
1170          * </p>
1171          *
1172          * @param dataArray array backing the iterator.
1173          */
Iterator(T[] dataArray)1174         public Iterator(T[] dataArray)
1175         {
1176             this.dataArray = dataArray;
1177         }
1178 
hasNext()1179         public boolean hasNext()
1180         {
1181             return position < dataArray.length;
1182         }
1183 
next()1184         public T next()
1185         {
1186             if (position == dataArray.length)
1187             {
1188                 throw new NoSuchElementException("Out of elements: " + position);
1189             }
1190 
1191             return dataArray[position++];
1192         }
1193 
remove()1194         public void remove()
1195         {
1196             throw new UnsupportedOperationException("Cannot remove element from an Array.");
1197         }
1198     }
1199 }
1200