package timeflow.data.time; import java.util.*; public class Interval { public long start; public long end; public Interval(long start, long end) { this.start=start; this.end=end; } public Interval copy() { return new Interval(start, end); } public boolean contains(long x) { return x>=start && x<=end; } public boolean intersects(Interval x) { return intersects(x.start, x.end); } public boolean intersects(long start1, long end1) { return start1<=end && end1>=start; } public Interval subinterval(double startFraction, double endFraction) { return new Interval((long)(start+startFraction*length()), (long)(start+endFraction*length())); } public void setTo(long start, long end) { this.start=start; this.end=end; } public void setTo(Interval t) { start=t.start; end=t.end; } public void include(long time) { start=Math.min(start, time); end=Math.max(end, time); } public void include(Interval t) { include(t.start); include(t.end); } public void expand(long amount) { start-=amount; end+=amount; } public void add(long amount) { start+=amount; end+=amount; } public long length() { return end-start; } public void translateTo(long newStart) { add(newStart-start); } public Interval intersection(Interval i) { start=Math.max(i.start, start); end=Math.min(i.end, end); return this; } public void clampInside(Interval container) { if (length()>container.length()) throw new IllegalArgumentException("Containing interval too small: "+container+" < "+this); if (start>=container.start && end<=container.end) return; add(Math.max(0, container.start-start)); add(Math.min(0, container.end-end)); } public String toString() { return "[Interval: From "+new Date(start)+" to "+new Date(end)+"]"; } }