package org.limewire.collection;
import java.io.Serializable;
import org.limewire.util.ByteUtils;
/**
* Represents a closed interval [low, high] inclusive on both ends.
<pre>
System.out.println("Interval is " + new Interval(1,4));
Output:
Interval is 1-4
</pre>
*/
class Interval extends Range implements Serializable {
/** Ensure backwards compatibility. */
static final long serialVersionUID = -2562093104400487554L;
/** INVARIANT: low<=high */
private final int low;
private final int high;
/** @requires low<=high.
* @requires low and high can be represented as ints.
*/
protected Interval(long low, long high) {
if(high < low)
throw new IllegalArgumentException("low: " + low +
", high: " + high);
// Since high >= low, low >= Integer.MIN_VALUE implies
// high >= Integer.MIN_VALUE. Only one check is necessary.
if(low < 0)
throw new IllegalArgumentException("low < min int:"+low);
// high <= Integer.MAX_VALUE implies
// low <= Integer.MAX_VALUE. Only one check is necessary.
if(high > Integer.MAX_VALUE)
throw new IllegalArgumentException("high > max int:"+high);
this.low=(int)low;
this.high=(int)high;
}
/**
* @requires singleton can be represented as an int.
*/
protected Interval(long singleton) {
if(singleton < Integer.MIN_VALUE)
throw new IllegalArgumentException("singleton < min:"+singleton);
if(singleton > Integer.MAX_VALUE)
throw new IllegalArgumentException("singleton > max int:"+singleton);
this.low=(int)singleton;
this.high=(int)singleton;
}
/* (non-Javadoc)
* @see org.limewire.collection.Range#toBytes()
*/
@Override
public byte [] toBytes() {
byte [] res = new byte[8];
toBytes(res,0);
return res;
}
/* (non-Javadoc)
* @see org.limewire.collection.Range#toBytes(byte[], int)
*/
@Override
public void toBytes(byte [] dest, int offset) {
ByteUtils.int2beb(low,dest,offset);
ByteUtils.int2beb(high,dest,offset+4);
}
/* (non-Javadoc)
* @see org.limewire.collection.Range#getLow()
*/
@Override
public final long getLow() {
return low;
}
/* (non-Javadoc)
* @see org.limewire.collection.Range#getHigh()
*/
@Override
public final long getHigh() {
return high;
}
@Override
public final boolean isLong() {
return false;
}
}