/// <summary>
/// Caps the specified d.
/// </summary>
/// <param name="d">The d.</param>
/// <returns></returns>
public override Domain Cap(Domain d)
{
if (!(d is AllenDomain))
{
return(EMPTY);
}
var newD = new AllenDomain();
AllenDomain d0 = this;
var d1 = (AllenDomain)d;
try {
int i0 = 0;
int i1 = 0;
while (i0 < d0.intervals.Count && i1 < d1.intervals.Count)
{
var interval = (int[])d0.intervals[i0];
int min0 = interval[0];
int max0 = interval[1];
interval = (int[])d1.intervals[i1];
int min1 = interval[0];
int max1 = interval[1];
if (max0 < min1)
{
i0++;
continue;
}
if (max1 < min0)
{
i1++;
continue;
}
interval = new int[2];
interval[0] = Math.Max(min0, min1);
interval[1] = Math.Min(max0, max1);
newD.intervals.Add(interval);
if (max0 <= max1)
{
i0++;
}
if (max1 <= max0)
{
i1++;
}
}
} catch (IndexOutOfRangeException) {
}
newD.UpdateSize();
newD.UpdateMinMax();
if (newD.Empty)
{
return(EMPTY);
}
return(newD);
}