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