Class to represent unsigned 64-bit numbers.
/*
* D-Bus Java Implementation Copyright (c) 2005-2006 Matthew Johnson This
* program is free software; you can redistribute it and/or modify it under the
* terms of either the GNU Lesser General Public License Version 2 or the
* Academic Free Licence Version 2.1. Full licence texts are included in the
* COPYING file with this program.
*/
//package org.freedesktop.dbus;
//import static org.freedesktop.dbus.Gettext._;
import java.math.BigInteger;
import java.text.MessageFormat;
/**
* Class to represent unsigned 64-bit numbers. Warning: Any functions which take
* or return a <tt>long</tt> are restricted to the range of a signed 64bit
* number. Use the BigInteger methods if you wish access to the full range.
*/
@SuppressWarnings("serial")
public class UInt64 extends Number implements Comparable<UInt64> {
/** Maximum allowed value (when accessed as a BigInteger) */
public static final BigInteger MAX_BIG_VALUE = new BigInteger("18446744073709551615");
/** Maximum allowed value (when accessed as a long) */
public static final long MAX_LONG_VALUE = Long.MAX_VALUE;
/** Minimum allowed value */
public static final long MIN_VALUE = 0;
private long bottom;
private long top;
private BigInteger value;
/**
* Create a UInt64 from a BigInteger
*
* @param value
* Must be a valid BigInteger between MIN_VALUE–MAX_BIG_VALUE
* @throws NumberFormatException
* if value is not an integer between MIN_VALUE and MAX_BIG_VALUE
*/
public UInt64(BigInteger value) {
/* if (null == value) { throw new NumberFormatException(MessageFormat.format(_("{0} is not between {1} and {2}."), new Object[] {
value, MIN_VALUE, MAX_BIG_VALUE })); }
if (0 > value.compareTo(BigInteger.ZERO)) { throw new NumberFormatException(MessageFormat.format(
_("{0} is not between {1} and {2}."), new Object[] { value, MIN_VALUE, MAX_BIG_VALUE })); }
if (0 < value.compareTo(MAX_BIG_VALUE)) { throw new NumberFormatException(MessageFormat.format(
_("{0} is not between {1} and {2}."), new Object[] { value, MIN_VALUE, MAX_BIG_VALUE })); }
*/ this.value = value;
top = this.value.shiftRight(32).and(new BigInteger("4294967295")).longValue();
bottom = this.value.and(new BigInteger("4294967295")).longValue();
}
/**
* Create a UInt64 from a long.
*
* @param value
* Must be a valid integer within MIN_VALUE–MAX_VALUE
* @throws NumberFormatException
* if value is not between MIN_VALUE and MAX_VALUE
*/
public UInt64(long value) {
//if ((value < MIN_VALUE) || (value > MAX_LONG_VALUE)) { throw new NumberFormatException(MessageFormat.format(
// _("{0} is not between {1} and {2}."), new Object[] { value, MIN_VALUE, MAX_LONG_VALUE })); }
this.value = new BigInteger("" + value);
top = this.value.shiftRight(32).and(new BigInteger("4294967295")).longValue();
bottom = this.value.and(new BigInteger("4294967295")).longValue();
}
/**
* Create a UInt64 from two longs.
*
* @param top
* Most significant 4 bytes.
* @param bottom
* Least significant 4 bytes.
*/
public UInt64(long top, long bottom) {
BigInteger a = new BigInteger("" + top);
a = a.shiftLeft(32);
a = a.add(new BigInteger("" + bottom));
// if (0 > a.compareTo(BigInteger.ZERO)) { throw new NumberFormatException(MessageFormat.format(
// _("{0} is not between {1} and {2}."), new Object[] { a, MIN_VALUE, MAX_BIG_VALUE })); }
//if (0 < a.compareTo(MAX_BIG_VALUE)) { throw new NumberFormatException(MessageFormat.format(
// _("{0} is not between {1} and {2}."), new Object[] { a, MIN_VALUE, MAX_BIG_VALUE })); }
value = a;
this.top = top;
this.bottom = bottom;
}
/**
* Create a UInt64 from a String.
*
* @param value
* Must parse to a valid integer within MIN_VALUE–MAX_BIG_VALUE
* @throws NumberFormatException
* if value is not an integer between MIN_VALUE and MAX_BIG_VALUE
*/
public UInt64(String value) {
//if (null == value) { throw new NumberFormatException(MessageFormat.format(_("{0} is not between {1} and {2}."), new Object[] {
// value, MIN_VALUE, MAX_BIG_VALUE })); }
BigInteger a = new BigInteger(value);
this.value = a;
top = this.value.shiftRight(32).and(new BigInteger("4294967295")).longValue();
bottom = this.value.and(new BigInteger("4294967295")).longValue();
}
/**
* Least significant 4 bytes.
*/
public long bottom() {
return bottom;
}
/** The value of this as a byte. */
@Override
public byte byteValue() {
return value.byteValue();
}
/**
* Compare two UInt32s.
*
* @return 0 if equal, -ve or +ve if they are different.
*/
public int compareTo(UInt64 other) {
return value.compareTo(other.value);
}
/** The value of this as a double. */
@Override
public double doubleValue() {
return value.doubleValue();
}
/** Test two UInt64s for equality. */
@Override
public boolean equals(Object o) {
return (o instanceof UInt64) && value.equals(((UInt64) o).value);
}
/** The value of this as a float. */
@Override
public float floatValue() {
return value.floatValue();
}
@Override
public int hashCode() {
return value.hashCode();
}
/** The value of this as a int. */
@Override
public int intValue() {
return value.intValue();
}
/** The value of this as a long. */
@Override
public long longValue() {
return value.longValue();
}
/** The value of this as a short. */
@Override
public short shortValue() {
return value.shortValue();
}
/**
* Most significant 4 bytes.
*/
public long top() {
return top;
}
/** The value of this as a string. */
@Override
public String toString() {
return value.toString();
}
/** The value of this as a BigInteger. */
public BigInteger value() {
return value;
}
}
Related examples in the same category