/// <summary> /// Creates an empty filter with the given parameters. /// The <see cref="Parameters.NumberOfBits"/> specifies the final size of the filter. /// </summary> public BloomFilter(Parameters parameters) { Contract.Requires(parameters != null); m_bits = new ConcurrentBitArray(parameters.NumberOfBits); m_parameters = parameters; }
/// <summary> /// Modifies the current bit array to be the bit-wise intersect with the given bit array /// </summary> /// <param name="other">the bit array to intersect with</param> /// <returns>the current modified bit array</returns> public ConcurrentBitArray And(ConcurrentBitArray other) { Contract.Requires(other != null && other.Length == Length); var array = m_array; for (int i = 0; i < array.Length; i++) { bool updated = false; int otherValue = Volatile.Read(ref other.m_array[i]); while (!updated) { var oldValue = Volatile.Read(ref array[i]); var newValue = oldValue & otherValue; updated = Interlocked.CompareExchange(ref array[i], newValue, oldValue) == oldValue; } } return(this); }