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)+"]";
}
}