/// <summary>
/// Performs an in-place intersection of two Roaring Bitsets.
/// </summary>
/// <param name="other">the second Roaring Bitset to intersect</param>
private void AndWith(RoaringBitset other)
{
int thisLength = containers.Size;
int otherLength = other.containers.Size;
int pos1 = 0, pos2 = 0, intersectionSize = 0;
while (pos1 < thisLength && pos2 < otherLength)
{
ushort s1 = containers.GetKeyAtIndex(pos1);
ushort s2 = other.containers.GetKeyAtIndex(pos2);
if (s1 == s2)
{
Container c1 = containers.GetContainerAtIndex(pos1);
Container c2 = other.containers.GetContainerAtIndex(pos2);
Container c = c1.IAnd(c2);
if (c.GetCardinality() > 0)
{
containers.ReplaceKeyAndContainerAtIndex(intersectionSize++, s1, c);
}
++pos1;
++pos2;
}
else if (s1 < s2)
{
// s1 < s2
pos1 = containers.AdvanceUntil(s2, pos1);
}
else
{
// s1 > s2
pos2 = other.containers.AdvanceUntil(s1, pos2);
}
}
containers.Resize(intersectionSize);
}