package com.kaching.platform.common;
import java.util.Iterator;
/**
* An immutable range.
*/
public class Range implements Iterable<Integer> {
public static Range range(int start, int end) {
return new Range(start, end);
}
public final int start;
public final int end;
/**
* A range between {@code start} (inclusive) and {@code end} (exclusive).
*/
public Range(int start, int end) {
this.start = start;
this.end = end;
}
public int getStart() {
return start;
}
public int getEnd() {
return end;
}
public boolean isEmpty() {
return end <= start;
}
public boolean contains(int index) {
return start <= index && end > index;
}
public boolean contains(Range that) {
return start <= that.start && end >= that.end;
}
public boolean overlaps(Range that) {
return this.contains(that)
|| that.contains(this)
|| (start <= that.start && that.start < end)
|| (start < that.end && that.end <= end);
}
@Override
public String toString() {
return "[" + start + "," + end + ")";
}
@Override
public int hashCode() {
final int prime = 96643;
int result = 1;
result = prime * result + end;
result = prime * result + start;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
Range other = (Range) obj;
return end == other.end && start == other.start;
}
@Override
public Iterator<Integer> iterator() {
return new Iterator<Integer>() {
private int i = start;
@Override
public void remove() {
throw new UnsupportedOperationException();
}
@Override
public Integer next() {
return ((start < end) ? i++ : i--);
}
@Override
public boolean hasNext() {
return ((start < end) ? (i < end) : (i > end));
}
};
}
}