/// <summary>
/// Computes the in-place bitwise OR of this bitset with another
/// </summary>
/// <param name="otherSet">Other bitset</param>
public void OrWith(IBitset otherSet)
{
if (!(otherSet is RoaringBitset))
{
throw new ArgumentOutOfRangeException("otherSet must be a RoaringBitSet");
}
RoaringBitset x2 = (RoaringBitset)otherSet;
int pos1 = 0, pos2 = 0;
int length1 = containers.Size, length2 = x2.containers.Size;
if (pos1 < length1 && pos2 < length2)
{
ushort s1 = containers.GetKeyAtIndex(pos1);
ushort s2 = x2.containers.GetKeyAtIndex(pos2);
while (true)
{
if (s1 == s2)
{
Container newContainer = containers.GetContainerAtIndex(pos1).IOr(x2.containers.GetContainerAtIndex(pos2));
containers.SetContainerAtIndex(pos1, newContainer);
pos1++;
pos2++;
if (pos1 == length1 || pos2 == length2)
{
break;
}
s1 = containers.GetKeyAtIndex(pos1);
s2 = x2.containers.GetKeyAtIndex(pos2);
}
else if (s1 < s2)
{
pos1++;
if (pos1 == length1)
{
break;
}
s1 = containers.GetKeyAtIndex(pos1);
}
else
{
// s1 > s2
containers.InsertNewKeyValueAt(pos1, s2, x2.containers.GetContainerAtIndex(pos2));
pos1++;
length1++;
pos2++;
if (pos2 == length2)
{
break;
}
s2 = x2.containers.GetKeyAtIndex(pos2);
}
}
}
if (pos1 == length1)
{
containers.AppendCopy(x2.containers, pos2, length2);
}
}