public override Container IAdd(ushort begin, ushort end)
{
// TODO: may need to convert to a RunContainer
if (end == begin)
{
return this;
}
if (begin > end)
{
throw new ArgumentException("Invalid range [" + begin + "," + end + ")");
}
int indexStart = Utility.UnsignedBinarySearch(Content, 0, Cardinality, begin);
if (indexStart < 0)
{
indexStart = -indexStart - 1;
}
int indexEnd = Utility.UnsignedBinarySearch(Content, 0, Cardinality, (ushort)(end - 1));
if (indexEnd < 0)
{
indexEnd = -indexEnd - 1;
}
else
{
indexEnd++;
}
int rangeLength = end - begin;
int newCardinality = indexStart + (Cardinality - indexEnd) + rangeLength;
if (newCardinality > DEFAULT_MAX_SIZE)
{
BitsetContainer a = this.ToBitsetContainer();
return a.IAdd(begin, end);
}
if (newCardinality >= this.Content.Length)
{
IncreaseCapacity(newCardinality);
}
Array.Copy(this.Content, indexEnd, this.Content, indexStart + rangeLength, Cardinality - indexEnd);
for (int k = 0; k < rangeLength; ++k)
{
Content[k + indexStart] = (ushort)(begin + k);
}
Cardinality = newCardinality;
return this;
}