public override Container Or(ArrayContainer x)
{
ArrayContainer value1 = this;
int totalCardinality = value1.GetCardinality() + x.GetCardinality();
if (totalCardinality > DEFAULT_MAX_SIZE)
{
// it could be a bitmap!
BitsetContainer bc = new BitsetContainer();
for (int k = 0; k < x.Cardinality; ++k)
{
ushort v = x.Content[k];
int i = v >> 6;
bc.Bitmap[i] |= (1L << v);
}
for (int k = 0; k < this.Cardinality; ++k)
{
ushort v = this.Content[k];
int i = v >> 6;
bc.Bitmap[i] |= (1L << v);
}
bc.Cardinality = 0;
foreach (long k in bc.Bitmap)
{
bc.Cardinality += Utility.LongBitCount(k);
}
if (bc.Cardinality <= DEFAULT_MAX_SIZE)
{
return bc.ToArrayContainer();
}
return bc;
}
else
{
// remains an array container
int desiredCapacity = totalCardinality; // Math.min(BitmapContainer.MAX_CAPACITY,
// totalCardinality);
ArrayContainer answer = new ArrayContainer(desiredCapacity);
answer.Cardinality = Utility.UnsignedUnion2by2(value1.Content,
value1.GetCardinality(),
x.Content,
x.GetCardinality(),
answer.Content);
return answer;
}
}