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;
}