/// <summary>
/// Computes the bitwise OR of this container with another (union). This
/// container as well as the provided container are left unaffected.
/// </summary>
/// <param name="x">Other container</param>
/// <returns>Aggregated container</returns>
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 < Cardinality; ++k)
{
ushort v = 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);
}
// 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);
}