private CopyRange ( int begin, int end, int newBegin ) : void | ||
begin | int | Original starting index |
end | int | Original ending index |
newBegin | int | New starting index |
return | void |
/// <summary> /// Finds members of this bitset that are not in the other set (ANDNOT). /// Modifies current bitset in place. /// </summary> /// <param name="otherSet">The set to compare against</param> 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); }