public IndexRangeSet Union(IndexRangeSet unionTo)
{
lock (this) {
var rangeSet = new List<IndexRange>(ranges);
var inputSet = unionTo.ranges;
int inSz = inputSet.Count;
int n = 0;
while (n < inSz) {
var inRange = inputSet[n];
int sz = rangeSet.Count;
var i = rangeSet.GetRange(0, sz);
int j = 0;
while (j < i.Count) {
var range = i[j];
if (IntersectedBy(inRange, range)) {
i.RemoveAt(j);
inRange = ChangeRangeSizeToEncompass(inRange, range);
}
j++;
}
// Insert into sorted position
var startPoint = inRange.StartOffset;
var start = inRange.StartValue;
var endPoint = inRange.EndOffset;
var end = inRange.EndValue;
if (start == IndexRange.FirstInSet) {
rangeSet.Insert(0, inRange);
} else {
var startCell = start;
i = rangeSet.GetRange(0, rangeSet.Count);
j = 0;
while (j < i.Count) {
var range = i[j];
var curStart = range.StartValue;
if (!curStart.Equals(IndexRange.FirstInSet)) {
if (curStart.CompareTo(startCell) > 0) {
i[j] = i[j - 1];
break;
}
}
j++;
}
i.Add(inRange);
}
n++;
}
return new IndexRangeSet(rangeSet);
}
}