package org.basex.query.item;
import static java.lang.Float.*;
import org.basex.util.InputInfo;
import org.basex.util.Token;
/**
* Superclass for all numeric items.
* It's useful for removing exceptions and unifying hash values.
*
* @author BaseX Team 2005-12, BSD License
* @author Leo Woerteler
*/
abstract class Num extends Item {
/**
* Constructor.
* @param t type
*/
Num(final Type t) {
super(t);
}
/* Removing "throws QueryException" */
@Override
public abstract byte[] string(final InputInfo ii);
@Override
public abstract double dbl(InputInfo ii);
@Override
public abstract long itr(InputInfo ii);
@Override
public abstract float flt(InputInfo ii);
@Override
public final int hash(final InputInfo ii) {
// makes sure the hashing is good for very small and very big numbers
final long l = itr(ii);
final float f = flt(ii);
// extract fractional part from a finite float
final int frac = f == POSITIVE_INFINITY || f == NEGATIVE_INFINITY ||
isNaN(f) ? 0 : floatToIntBits(f - l);
int h = frac ^ (int) (l ^ l >>> 32);
// this part ensures better distribution of bits (from java.util.HashMap)
h ^= h >>> 20 ^ h >>> 12;
return h ^ h >>> 7 ^ h >>> 4;
}
@Override
public final String toString() {
return Token.string(string(null));
}
}