public void IAndNot(RoaringBitset otherSet)
{
int pos1 = 0, pos2 = 0, intersectionSize = 0;
int thisSize = containers.Size;
int otherSetSize = otherSet.containers.Size;
while (pos1 < thisSize && pos2 < otherSetSize)
{
ushort s1 = containers.GetKeyAtIndex(pos1);
ushort s2 = otherSet.containers.GetKeyAtIndex(pos2);
if (s1 == s2)
{
Container c1 = containers.GetContainerAtIndex(pos1);
Container c2 = otherSet.containers.GetContainerAtIndex(pos2);
Container c = c1.IAndNot(c2);
if (c.GetCardinality() > 0)
{
containers.ReplaceKeyAndContainerAtIndex(intersectionSize++, s1, c);
}
++pos1;
++pos2;
}
else if (Utility.CompareUnsigned(s1, s2) < 0)
{ // s1 < s2
if (pos1 != intersectionSize)
{
Container c1 = containers.GetContainerAtIndex(pos1);
containers.ReplaceKeyAndContainerAtIndex(intersectionSize, s1, c1);
}
++intersectionSize;
++pos1;
}
else
{ // s1 > s2
pos2 = otherSet.containers.AdvanceUntil(s1, pos2);
}
}
if (pos1 < thisSize)
{
containers.CopyRange(pos1, thisSize, intersectionSize);
intersectionSize += thisSize - pos1;
}
containers.Resize(intersectionSize);
}