/*******************************************************************************
* Copyright (c) 2004, 2008 John Krasnay and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* John Krasnay - initial API and implementation
*******************************************************************************/
package net.sf.vex.core;
/**
* Represents a range of integers. Zero-length ranges (i.e. ranges where
* start == end) are permitted. This class is immutable.
*/
public class IntRange {
/**
* Class constuctor.
* @param start Start of the range.
* @param end End of the range. Must be >= start.
*/
public IntRange(int start, int end) {
if (start > end) {
throw new IllegalArgumentException("start (" + start + ") is greater than end (" + end + ")");
}
this.start = start;
this.end = end;
}
/**
* Returns the start of the range.
*/
public int getStart() {
return this.start;
}
/**
* Returns the end of the range.
*/
public int getEnd() {
return this.end;
}
/**
* Returns the range that represents the intersection of this range
* and the given range. If the ranges do not intersect, returns null.
* May return an empty range.
* @param range Range with which to perform an intersection.
*/
public IntRange intersection(IntRange range) {
if (this.intersects(range)) {
return new IntRange(Math.max(this.start, range.start), Math.min(this.end, range.end));
} else {
return null;
}
}
/**
* Returns true if this range intersects the given range, even if the
* result would be an empty range.
* @param range Range with which to intersect.
*/
public boolean intersects(IntRange range) {
return this.start <= range.end && this.end >= range.start;
}
/**
* Returns true if start and end are equal.
*/
public boolean isEmpty() {
return start == end;
}
/**
* Returns a range that is the union of this range and the given range.
* If the ranges are disjoint, the gap between the ranges is included
* in the result.
* @param range Rnage with which to perform the union
*/
public IntRange union(IntRange range) {
return new IntRange(Math.min(this.start, range.start), Math.min(this.end, range.end));
}
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("IntRange(");
sb.append(start);
sb.append(",");
sb.append(end);
sb.append(")");
return sb.toString();
}
//============================================================= PRIVATE
private int start;
private int end;
}