package de.blau.android.util.collections;
/**
* Common methods
*/
class Tools {
/** Taken from FastUtil implementation */
/**
* Return the least power of two greater than or equal to the specified
* value.
*
* <p>
* Note that this function will return 1 when the argument is 0.
*
* @param x
* a long integer smaller than or equal to 2<sup>62</sup>.
* @return the least power of two greater than or equal to the specified
* value.
*/
private static long nextPowerOfTwo(long x) {
if (x == 0)
return 1;
x--;
x |= x >> 1;
x |= x >> 2;
x |= x >> 4;
x |= x >> 8;
x |= x >> 16;
return (x | x >> 32) + 1;
}
/**
* Returns the least power of two smaller than or equal to 2<sup>30</sup>
* and larger than or equal to <code>Math.ceil( expected / f )</code>.
*
* @param expected
* the expected number of elements in a hash table.
* @param f
* the load factor.
* @return the minimum possible size for a backing array.
* @throws IllegalArgumentException
* if the necessary size is larger than 2<sup>30</sup>.
*/
public static int arraySize(final int expected, final float f) {
final long s = Math.max(2,
nextPowerOfTwo((long) Math.ceil(expected / f)));
if (s > (1 << 30))
throw new IllegalArgumentException("Too large (" + expected
+ " expected elements with load factor " + f + ")");
return (int) s;
}
// taken from FastUtil
private static final int INT_PHI = 0x9E3779B9;
private static final long LONG_PHI = 0x9E3779B97F4A7C15L;
public static int phiMix(final int x) {
final int h = x * INT_PHI;
return h ^ (h >> 16);
}
public static long phiMix(final long x) {
long h = x * LONG_PHI;
h ^= h >>> 32;
return h ^ (h >>> 16);
}
}