116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giropackage org.bouncycastle.util; 216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.math.BigInteger; 4bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giroimport java.util.NoSuchElementException; 516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro/** 716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro * General array utilities. 816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro */ 916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giropublic final class Arrays 1016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro{ 1116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro private Arrays() 1216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 1316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro // static class, hide constructor 1416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 1580261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro 1616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static boolean areEqual( 1716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro boolean[] a, 1816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro boolean[] b) 1916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 2016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (a == b) 2116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 2216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return true; 2316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 2416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 2516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (a == null || b == null) 2616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 2716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return false; 2816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 2916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 3016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (a.length != b.length) 3116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 3216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return false; 3316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 3416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 3516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro for (int i = 0; i != a.length; i++) 3616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 3716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (a[i] != b[i]) 3816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 3916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return false; 4016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 4116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 4216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 4316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return true; 4416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 4516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 4616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static boolean areEqual( 4716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro char[] a, 4816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro char[] b) 4916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 5016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (a == b) 5116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 5216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return true; 5316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 5416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 5516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (a == null || b == null) 5616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 5716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return false; 5816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 5916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 6016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (a.length != b.length) 6116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 6216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return false; 6316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 6416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 6516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro for (int i = 0; i != a.length; i++) 6616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 6716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (a[i] != b[i]) 6816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 6916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return false; 7016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 7116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 7216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 7316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return true; 7416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 7516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 7616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static boolean areEqual( 7716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro byte[] a, 7816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro byte[] b) 7916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 8016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (a == b) 8116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 8216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return true; 8316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 8416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 8516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (a == null || b == null) 8616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 8716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return false; 8816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 8916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 9016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (a.length != b.length) 9116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 9216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return false; 9316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 9416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 9516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro for (int i = 0; i != a.length; i++) 9616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 9716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (a[i] != b[i]) 9816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 9916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return false; 10016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 10116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 10216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 10316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return true; 10416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 10516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 1064caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro public static boolean areEqual( 1074caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro short[] a, 1084caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro short[] b) 1094caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro { 1104caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro if (a == b) 1114caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro { 1124caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro return true; 1134caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro } 1144caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro 1154caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro if (a == null || b == null) 1164caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro { 1174caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro return false; 1184caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro } 1194caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro 1204caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro if (a.length != b.length) 1214caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro { 1224caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro return false; 1234caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro } 1244caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro 1254caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro for (int i = 0; i != a.length; i++) 1264caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro { 1274caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro if (a[i] != b[i]) 1284caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro { 1294caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro return false; 1304caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro } 1314caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro } 1324caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro 1334caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro return true; 1344caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro } 1354caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro 13616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro /** 13716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro * A constant time equals comparison - does not terminate early if 13816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro * test will fail. 13916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro * 14016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro * @param a first array 14116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro * @param b second array 14216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro * @return true if arrays equal, false otherwise. 14316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro */ 14416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static boolean constantTimeAreEqual( 14516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro byte[] a, 14616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro byte[] b) 14716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 14816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (a == b) 14916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 15016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return true; 15116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 15216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 15316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (a == null || b == null) 15416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 15516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return false; 15616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 15716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 15816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (a.length != b.length) 15916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 16016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return false; 16116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 16216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 16316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro int nonEqual = 0; 16416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 16516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro for (int i = 0; i != a.length; i++) 16616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 16716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro nonEqual |= (a[i] ^ b[i]); 16816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 16916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 17016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return nonEqual == 0; 17116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 17216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 17316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static boolean areEqual( 17416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro int[] a, 17516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro int[] b) 17616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 17716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (a == b) 17816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 17916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return true; 18016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 18116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 18216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (a == null || b == null) 18316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 18416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return false; 18516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 18616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 18716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (a.length != b.length) 18816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 18916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return false; 19016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 19116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 19216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro for (int i = 0; i != a.length; i++) 19316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 19416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (a[i] != b[i]) 19516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 19616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return false; 19716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 19816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 19916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 20016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return true; 20116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 20216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 20316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static boolean areEqual( 20416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro long[] a, 20516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro long[] b) 20616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 20716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (a == b) 20816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 20916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return true; 21016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 21116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 21216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (a == null || b == null) 21316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 21416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return false; 21516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 21616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 21716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (a.length != b.length) 21816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 21916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return false; 22016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 22116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 22216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro for (int i = 0; i != a.length; i++) 22316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 22416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (a[i] != b[i]) 22516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 22616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return false; 22716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 22816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 22916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 23016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return true; 23116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 23216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 23380261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro public static boolean areEqual(Object[] a, Object[] b) 23416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 23516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (a == b) 23616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 23716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return true; 23816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 23916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (a == null || b == null) 24016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 24116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return false; 24216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 24316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (a.length != b.length) 24416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 24516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return false; 24616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 24716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro for (int i = 0; i != a.length; i++) 24816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 24980261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro Object objA = a[i], objB = b[i]; 25080261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro if (objA == null) 25180261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro { 25280261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro if (objB != null) 25380261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro { 25480261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro return false; 25580261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro } 25680261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro } 25780261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro else if (!objA.equals(objB)) 25816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 25916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return false; 26016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 26116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 26216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return true; 26316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 26416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 2654caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro public static int compareUnsigned(byte[] a, byte[] b) 2664caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro { 2674caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro if (a == b) 2684caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro { 2694caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro return 0; 2704caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro } 2714caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro if (a == null) 2724caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro { 2734caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro return -1; 2744caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro } 2754caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro if (b == null) 2764caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro { 2774caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro return 1; 2784caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro } 2794caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro int minLen = Math.min(a.length, b.length); 2804caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro for (int i = 0; i < minLen; ++i) 2814caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro { 2824caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro int aVal = a[i] & 0xFF, bVal = b[i] & 0xFF; 2834caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro if (aVal < bVal) 2844caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro { 2854caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro return -1; 2864caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro } 2874caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro if (aVal > bVal) 2884caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro { 2894caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro return 1; 2904caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro } 2914caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro } 2924caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro if (a.length < b.length) 2934caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro { 2944caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro return -1; 2954caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro } 2964caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro if (a.length > b.length) 2974caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro { 2984caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro return 1; 2994caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro } 3004caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro return 0; 3014caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro } 3024caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro 30380261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro public static boolean contains(short[] a, short n) 30480261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro { 30580261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro for (int i = 0; i < a.length; ++i) 30680261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro { 30780261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro if (a[i] == n) 30880261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro { 30980261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro return true; 31080261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro } 31180261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro } 31280261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro return false; 31380261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro } 31480261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro 31580261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro public static boolean contains(int[] a, int n) 31680261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro { 31780261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro for (int i = 0; i < a.length; ++i) 31880261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro { 31980261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro if (a[i] == n) 32080261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro { 32180261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro return true; 32280261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro } 32380261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro } 32480261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro return false; 32580261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro } 32680261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro 32716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static void fill( 32816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro byte[] array, 32916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro byte value) 33016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 33116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro for (int i = 0; i < array.length; i++) 33216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 33316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro array[i] = value; 33416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 33516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 33616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 33716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static void fill( 33816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro char[] array, 33916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro char value) 34016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 34116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro for (int i = 0; i < array.length; i++) 34216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 34316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro array[i] = value; 34416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 34516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 34616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 34716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static void fill( 34816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro long[] array, 34916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro long value) 35016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 35116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro for (int i = 0; i < array.length; i++) 35216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 35316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro array[i] = value; 35416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 35516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 35616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 35716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static void fill( 35816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro short[] array, 35916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro short value) 36016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 36116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro for (int i = 0; i < array.length; i++) 36216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 36316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro array[i] = value; 36416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 36516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 36616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 36716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static void fill( 36816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro int[] array, 36916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro int value) 37016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 37116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro for (int i = 0; i < array.length; i++) 37216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 37316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro array[i] = value; 37416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 37516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 37616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 37716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static int hashCode(byte[] data) 37816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 37916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (data == null) 38016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 38116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return 0; 38216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 38316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 38416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro int i = data.length; 38516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro int hc = i + 1; 38616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 38716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro while (--i >= 0) 38816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 38916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro hc *= 257; 39016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro hc ^= data[i]; 39116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 39216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 39316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return hc; 39416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 395bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro 39653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro public static int hashCode(byte[] data, int off, int len) 39753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro { 39853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro if (data == null) 39953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro { 40053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro return 0; 40153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro } 40253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro 40353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro int i = len; 40453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro int hc = i + 1; 40553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro 40653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro while (--i >= 0) 40753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro { 40853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro hc *= 257; 40953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro hc ^= data[off + i]; 41053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro } 41153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro 41253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro return hc; 41353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro } 41416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 41516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static int hashCode(char[] data) 41616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 41716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (data == null) 41816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 41916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return 0; 42016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 42116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 42216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro int i = data.length; 42316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro int hc = i + 1; 42416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 42516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro while (--i >= 0) 42616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 42716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro hc *= 257; 42816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro hc ^= data[i]; 42916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 43016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 43116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return hc; 43216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 43316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 43416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static int hashCode(int[][] ints) 43516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 43616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro int hc = 0; 43716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 43816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro for (int i = 0; i != ints.length; i++) 43916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 44016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro hc = hc * 257 + hashCode(ints[i]); 44116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 44216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 44316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return hc; 44416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 44516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 44616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static int hashCode(int[] data) 44716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 44816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (data == null) 44916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 45016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return 0; 45116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 45216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 45316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro int i = data.length; 45416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro int hc = i + 1; 45516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 45616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro while (--i >= 0) 45716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 45816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro hc *= 257; 45916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro hc ^= data[i]; 46016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 46116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 46216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return hc; 46316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 46416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 46553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro public static int hashCode(int[] data, int off, int len) 46653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro { 46753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro if (data == null) 46853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro { 46953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro return 0; 47053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro } 47153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro 47253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro int i = len; 47353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro int hc = i + 1; 47453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro 47553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro while (--i >= 0) 47653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro { 47753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro hc *= 257; 47853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro hc ^= data[off + i]; 47953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro } 48053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro 48153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro return hc; 48253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro } 48353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro 484bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro public static int hashCode(long[] data) 485bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro { 486bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro if (data == null) 487bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro { 488bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro return 0; 489bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro } 490bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro 491bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro int i = data.length; 492bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro int hc = i + 1; 493bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro 494bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro while (--i >= 0) 495bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro { 496bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro long di = data[i]; 497bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro hc *= 257; 498bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro hc ^= (int)di; 499bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro hc *= 257; 500bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro hc ^= (int)(di >>> 32); 501bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro } 502bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro 503bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro return hc; 504bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro } 505bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro 506bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro public static int hashCode(long[] data, int off, int len) 507bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro { 508bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro if (data == null) 509bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro { 510bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro return 0; 511bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro } 512bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro 513bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro int i = len; 514bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro int hc = i + 1; 515bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro 516bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro while (--i >= 0) 517bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro { 518bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro long di = data[off + i]; 519bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro hc *= 257; 520bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro hc ^= (int)di; 521bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro hc *= 257; 522bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro hc ^= (int)(di >>> 32); 523bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro } 524bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro 525bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro return hc; 526bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro } 527bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro 52816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static int hashCode(short[][][] shorts) 52916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 53016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro int hc = 0; 53116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 53216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro for (int i = 0; i != shorts.length; i++) 53316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 53416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro hc = hc * 257 + hashCode(shorts[i]); 53516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 53616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 53716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return hc; 53816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 53916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 54016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static int hashCode(short[][] shorts) 54116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 54216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro int hc = 0; 54316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 54416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro for (int i = 0; i != shorts.length; i++) 54516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 54616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro hc = hc * 257 + hashCode(shorts[i]); 54716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 54816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 54916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return hc; 55016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 55116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 55216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static int hashCode(short[] data) 55316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 55416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (data == null) 55516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 55616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return 0; 55716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 55816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 55916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro int i = data.length; 56016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro int hc = i + 1; 56116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 56216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro while (--i >= 0) 56316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 56416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro hc *= 257; 56516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro hc ^= (data[i] & 0xff); 56616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 56716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 56816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return hc; 56916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 57016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 57180261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro public static int hashCode(Object[] data) 57216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 57316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (data == null) 57416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 57516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return 0; 57616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 57716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 57816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro int i = data.length; 57916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro int hc = i + 1; 58016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 58116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro while (--i >= 0) 58216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 58316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro hc *= 257; 58416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro hc ^= data[i].hashCode(); 58516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 58616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 58716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return hc; 58816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 58916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 59016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static byte[] clone(byte[] data) 59116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 59216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (data == null) 59316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 59416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return null; 59516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 59616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro byte[] copy = new byte[data.length]; 59716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 59816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro System.arraycopy(data, 0, copy, 0, data.length); 59916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 60016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return copy; 60116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 60216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 603bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro public static char[] clone(char[] data) 604bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro { 605bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro if (data == null) 606bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro { 607bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro return null; 608bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro } 609bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro char[] copy = new char[data.length]; 610bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro 611bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro System.arraycopy(data, 0, copy, 0, data.length); 612bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro 613bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro return copy; 614bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro } 615bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro 61680261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro public static byte[] clone(byte[] data, byte[] existing) 61780261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro { 61880261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro if (data == null) 61980261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro { 62080261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro return null; 62180261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro } 62280261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro if ((existing == null) || (existing.length != data.length)) 62380261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro { 62480261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro return clone(data); 62580261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro } 62680261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro System.arraycopy(data, 0, existing, 0, existing.length); 62780261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro return existing; 62880261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro } 62980261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro 63016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static byte[][] clone(byte[][] data) 63116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 63216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (data == null) 63316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 63416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return null; 63516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 63616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 63716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro byte[][] copy = new byte[data.length][]; 63816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 63916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro for (int i = 0; i != copy.length; i++) 64016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 64116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro copy[i] = clone(data[i]); 64216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 64316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 64416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return copy; 64516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 64616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 64716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static byte[][][] clone(byte[][][] data) 64816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 64916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (data == null) 65016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 65116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return null; 65216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 65316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 65416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro byte[][][] copy = new byte[data.length][][]; 65516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 65616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro for (int i = 0; i != copy.length; i++) 65716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 65816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro copy[i] = clone(data[i]); 65916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 66016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 66116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return copy; 66216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 66316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 66416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static int[] clone(int[] data) 66516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 66616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (data == null) 66716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 66816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return null; 66916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 67016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro int[] copy = new int[data.length]; 67116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 67216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro System.arraycopy(data, 0, copy, 0, data.length); 67316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 67416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return copy; 67516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 67616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 67780261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro public static long[] clone(long[] data) 67880261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro { 67980261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro if (data == null) 68080261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro { 68180261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro return null; 68280261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro } 68380261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro long[] copy = new long[data.length]; 68480261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro 68580261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro System.arraycopy(data, 0, copy, 0, data.length); 68680261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro 68780261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro return copy; 68880261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro } 68980261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro 69080261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro public static long[] clone(long[] data, long[] existing) 69180261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro { 69280261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro if (data == null) 69380261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro { 69480261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro return null; 69580261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro } 69680261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro if ((existing == null) || (existing.length != data.length)) 69780261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro { 69880261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro return clone(data); 69980261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro } 70080261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro System.arraycopy(data, 0, existing, 0, existing.length); 70180261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro return existing; 70280261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro } 70380261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro 70416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static short[] clone(short[] data) 70516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 70616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (data == null) 70716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 70816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return null; 70916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 71016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro short[] copy = new short[data.length]; 71116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 71216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro System.arraycopy(data, 0, copy, 0, data.length); 71316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 71416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return copy; 71516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 71616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 71716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static BigInteger[] clone(BigInteger[] data) 71816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 71916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (data == null) 72016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 72116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return null; 72216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 72316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro BigInteger[] copy = new BigInteger[data.length]; 72416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 72516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro System.arraycopy(data, 0, copy, 0, data.length); 72616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 72716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return copy; 72816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 72916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 73016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static byte[] copyOf(byte[] data, int newLength) 73116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 73216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro byte[] tmp = new byte[newLength]; 73316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 73416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (newLength < data.length) 73516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 73616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro System.arraycopy(data, 0, tmp, 0, newLength); 73716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 73816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro else 73916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 74016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro System.arraycopy(data, 0, tmp, 0, data.length); 74116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 74216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 74316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return tmp; 74416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 74516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 74616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static char[] copyOf(char[] data, int newLength) 74716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 74816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro char[] tmp = new char[newLength]; 74916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 75016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (newLength < data.length) 75116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 75216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro System.arraycopy(data, 0, tmp, 0, newLength); 75316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 75416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro else 75516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 75616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro System.arraycopy(data, 0, tmp, 0, data.length); 75716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 75816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 75916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return tmp; 76016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 76116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 76216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static int[] copyOf(int[] data, int newLength) 76316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 76416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro int[] tmp = new int[newLength]; 76516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 76616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (newLength < data.length) 76716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 76816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro System.arraycopy(data, 0, tmp, 0, newLength); 76916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 77016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro else 77116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 77216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro System.arraycopy(data, 0, tmp, 0, data.length); 77316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 77416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 77516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return tmp; 77616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 77716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 77816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static long[] copyOf(long[] data, int newLength) 77916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 78016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro long[] tmp = new long[newLength]; 78116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 78216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (newLength < data.length) 78316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 78416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro System.arraycopy(data, 0, tmp, 0, newLength); 78516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 78616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro else 78716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 78816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro System.arraycopy(data, 0, tmp, 0, data.length); 78916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 79016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 79116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return tmp; 79216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 79316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 79416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static BigInteger[] copyOf(BigInteger[] data, int newLength) 79516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 79616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro BigInteger[] tmp = new BigInteger[newLength]; 79716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 79816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (newLength < data.length) 79916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 80016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro System.arraycopy(data, 0, tmp, 0, newLength); 80116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 80216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro else 80316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 80416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro System.arraycopy(data, 0, tmp, 0, data.length); 80516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 80616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 80716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return tmp; 80816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 80916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 81080261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro /** 81180261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro * Make a copy of a range of bytes from the passed in data array. The range can 81280261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro * extend beyond the end of the input array, in which case the return array will 81380261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro * be padded with zeroes. 81480261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro * 81580261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro * @param data the array from which the data is to be copied. 81680261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro * @param from the start index at which the copying should take place. 81780261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro * @param to the final index of the range (exclusive). 81880261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro * 81980261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro * @return a new byte array containing the range given. 82080261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro */ 82116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static byte[] copyOfRange(byte[] data, int from, int to) 82216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 82316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro int newLength = getLength(from, to); 82416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 82516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro byte[] tmp = new byte[newLength]; 82616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 82716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (data.length - from < newLength) 82816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 82916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro System.arraycopy(data, from, tmp, 0, data.length - from); 83016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 83116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro else 83216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 83316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro System.arraycopy(data, from, tmp, 0, newLength); 83416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 83516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 83616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return tmp; 83716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 83816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 83916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static int[] copyOfRange(int[] data, int from, int to) 84016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 84116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro int newLength = getLength(from, to); 84216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 84316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro int[] tmp = new int[newLength]; 84416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 84516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (data.length - from < newLength) 84616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 84716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro System.arraycopy(data, from, tmp, 0, data.length - from); 84816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 84916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro else 85016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 85116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro System.arraycopy(data, from, tmp, 0, newLength); 85216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 85316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 85416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return tmp; 85516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 85616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 85716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static long[] copyOfRange(long[] data, int from, int to) 85816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 85916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro int newLength = getLength(from, to); 86016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 86116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro long[] tmp = new long[newLength]; 86216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 86316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (data.length - from < newLength) 86416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 86516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro System.arraycopy(data, from, tmp, 0, data.length - from); 86616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 86716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro else 86816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 86916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro System.arraycopy(data, from, tmp, 0, newLength); 87016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 87116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 87216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return tmp; 87316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 87416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 87516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static BigInteger[] copyOfRange(BigInteger[] data, int from, int to) 87616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 87716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro int newLength = getLength(from, to); 87816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 87916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro BigInteger[] tmp = new BigInteger[newLength]; 88016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 88116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (data.length - from < newLength) 88216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 88316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro System.arraycopy(data, from, tmp, 0, data.length - from); 88416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 88516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro else 88616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 88716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro System.arraycopy(data, from, tmp, 0, newLength); 88816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 88916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 89016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return tmp; 89116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 89216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 89316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro private static int getLength(int from, int to) 89416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 89516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro int newLength = to - from; 89616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (newLength < 0) 89716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 89816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro StringBuffer sb = new StringBuffer(from); 89916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro sb.append(" > ").append(to); 90016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro throw new IllegalArgumentException(sb.toString()); 90116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 90216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return newLength; 90316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 90416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 90580261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro public static byte[] append(byte[] a, byte b) 90680261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro { 90780261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro if (a == null) 90880261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro { 90980261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro return new byte[]{ b }; 91080261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro } 91180261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro 91280261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro int length = a.length; 91380261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro byte[] result = new byte[length + 1]; 91480261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro System.arraycopy(a, 0, result, 0, length); 91580261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro result[length] = b; 91680261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro return result; 91780261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro } 91880261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro 91953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro public static short[] append(short[] a, short b) 92053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro { 92153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro if (a == null) 92253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro { 92353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro return new short[]{ b }; 92453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro } 92553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro 92653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro int length = a.length; 92753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro short[] result = new short[length + 1]; 92853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro System.arraycopy(a, 0, result, 0, length); 92953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro result[length] = b; 93053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro return result; 93153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro } 93253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro 93380261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro public static int[] append(int[] a, int b) 93480261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro { 93580261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro if (a == null) 93680261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro { 93780261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro return new int[]{ b }; 93880261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro } 93980261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro 94080261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro int length = a.length; 94180261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro int[] result = new int[length + 1]; 94280261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro System.arraycopy(a, 0, result, 0, length); 94380261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro result[length] = b; 94480261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro return result; 94580261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro } 94680261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro 94716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static byte[] concatenate(byte[] a, byte[] b) 94816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 94916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (a != null && b != null) 95016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 95116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro byte[] rv = new byte[a.length + b.length]; 95216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 95316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro System.arraycopy(a, 0, rv, 0, a.length); 95416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro System.arraycopy(b, 0, rv, a.length, b.length); 95516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 95616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return rv; 95716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 95816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro else if (b != null) 95916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 96016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return clone(b); 96116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 96216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro else 96316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 96416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return clone(a); 96516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 96616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 96716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 96816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static byte[] concatenate(byte[] a, byte[] b, byte[] c) 96916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 97016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (a != null && b != null && c != null) 97116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 97216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro byte[] rv = new byte[a.length + b.length + c.length]; 97316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 97416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro System.arraycopy(a, 0, rv, 0, a.length); 97516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro System.arraycopy(b, 0, rv, a.length, b.length); 97616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro System.arraycopy(c, 0, rv, a.length + b.length, c.length); 97716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 97816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return rv; 97916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 980bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro else if (a == null) 981bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro { 982bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro return concatenate(b, c); 983bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro } 98416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro else if (b == null) 98516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 98616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return concatenate(a, c); 98716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 98816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro else 98916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 99016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return concatenate(a, b); 99116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 99216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 99316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 99416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static byte[] concatenate(byte[] a, byte[] b, byte[] c, byte[] d) 99516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 99616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (a != null && b != null && c != null && d != null) 99716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 99816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro byte[] rv = new byte[a.length + b.length + c.length + d.length]; 99916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 100016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro System.arraycopy(a, 0, rv, 0, a.length); 100116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro System.arraycopy(b, 0, rv, a.length, b.length); 100216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro System.arraycopy(c, 0, rv, a.length + b.length, c.length); 100316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro System.arraycopy(d, 0, rv, a.length + b.length + c.length, d.length); 100416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 100516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return rv; 100616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 100716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro else if (d == null) 100816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 100916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return concatenate(a, b, c); 101016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 101116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro else if (c == null) 101216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 101316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return concatenate(a, b, d); 101416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 101516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro else if (b == null) 101616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 101716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return concatenate(a, c, d); 101816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 101916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro else 102016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 102116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return concatenate(b, c, d); 102216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 102316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 102480261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro 10254caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro public static byte[] concatenate(byte[][] arrays) 10264caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro { 10274caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro int size = 0; 10284caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro for (int i = 0; i != arrays.length; i++) 10294caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro { 10304caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro size += arrays[i].length; 10314caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro } 10324caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro 10334caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro byte[] rv = new byte[size]; 10344caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro 10354caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro int offSet = 0; 10364caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro for (int i = 0; i != arrays.length; i++) 10374caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro { 10384caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro System.arraycopy(arrays[i], 0, rv, offSet, arrays[i].length); 10394caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro offSet += arrays[i].length; 10404caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro } 10414caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro 10424caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro return rv; 10434caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro } 10444caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro 104553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro public static int[] concatenate(int[] a, int[] b) 104653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro { 104753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro if (a == null) 104853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro { 104953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro return clone(b); 105053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro } 105153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro if (b == null) 105253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro { 105353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro return clone(a); 105453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro } 105553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro 105653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro int[] c = new int[a.length + b.length]; 105753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro System.arraycopy(a, 0, c, 0, a.length); 105853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro System.arraycopy(b, 0, c, a.length, b.length); 105953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro return c; 106053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro } 106153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro 106280261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro public static byte[] prepend(byte[] a, byte b) 106380261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro { 106480261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro if (a == null) 106580261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro { 106680261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro return new byte[]{ b }; 106780261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro } 106880261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro 106980261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro int length = a.length; 107080261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro byte[] result = new byte[length + 1]; 107180261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro System.arraycopy(a, 0, result, 1, length); 107280261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro result[0] = b; 107380261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro return result; 107480261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro } 107553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro 107653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro public static short[] prepend(short[] a, short b) 107753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro { 107853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro if (a == null) 107953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro { 108053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro return new short[]{ b }; 108153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro } 108253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro 108353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro int length = a.length; 108453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro short[] result = new short[length + 1]; 108553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro System.arraycopy(a, 0, result, 1, length); 108653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro result[0] = b; 108753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro return result; 108853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro } 108953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro 109053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro public static int[] prepend(int[] a, int b) 109153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro { 109253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro if (a == null) 109353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro { 109453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro return new int[]{ b }; 109553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro } 109653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro 109753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro int length = a.length; 109853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro int[] result = new int[length + 1]; 109953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro System.arraycopy(a, 0, result, 1, length); 110053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro result[0] = b; 110153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro return result; 110253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro } 110353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro 110453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro public static byte[] reverse(byte[] a) 110553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro { 110653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro if (a == null) 110753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro { 110853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro return null; 110953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro } 111053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro 111153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro int p1 = 0, p2 = a.length; 111253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro byte[] result = new byte[p2]; 111353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro 111453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro while (--p2 >= 0) 111553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro { 111653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro result[p2] = a[p1++]; 111753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro } 111853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro 111953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro return result; 112053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro } 112153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro 1122bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro public static int[] reverse(int[] a) 1123bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro { 1124bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro if (a == null) 1125bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro { 1126bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro return null; 1127bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro } 1128bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro 1129bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro int p1 = 0, p2 = a.length; 1130bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro int[] result = new int[p2]; 1131bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro 1132bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro while (--p2 >= 0) 1133bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro { 1134bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro result[p2] = a[p1++]; 1135bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro } 1136bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro 1137bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro return result; 1138bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro } 1139bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro 114053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro /** 114153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro * Iterator backed by a specific array. 114253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro */ 114353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro public static class Iterator<T> 114453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro implements java.util.Iterator<T> 114553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro { 114653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro private final T[] dataArray; 114753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro 114853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro private int position = 0; 114953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro 115053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro /** 115153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro * Base constructor. 115253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro * <p> 115353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro * Note: the array is not cloned, changes to it will affect the values returned by next(). 115453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro * </p> 115553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro * 115653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro * @param dataArray array backing the iterator. 115753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro */ 115853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro public Iterator(T[] dataArray) 115953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro { 116053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro this.dataArray = dataArray; 116153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro } 116253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro 116353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro public boolean hasNext() 116453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro { 116553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro return position < dataArray.length; 116653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro } 116753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro 116853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro public T next() 116953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro { 1170bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro if (position == dataArray.length) 1171bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro { 1172bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro throw new NoSuchElementException("Out of elements: " + position); 1173bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro } 1174bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro 117553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro return dataArray[position++]; 117653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro } 117753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro 117853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro public void remove() 117953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro { 118053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro throw new UnsupportedOperationException("Cannot remove element from an Array."); 118153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro } 118253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro } 118316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro} 1184