Sha256: a2768931c5e8d4735d91f0f98c8d73de53f81507a042118a365be9e2517d433d
Contents?: true
Size: 1.34 KB
Versions: 1
Compression:
Stored size: 1.34 KB
Contents
# Adapted from # https://github.com/peterc/bitarray class JsonBloomfilter class BitArray attr_reader :size attr_reader :field include Enumerable ELEMENT_WIDTH = 32 def initialize(size, field = nil) @size = size @field = field || Array.new(((size - 1) / ELEMENT_WIDTH) + 1, 0) end def add position self[position] = 1 end def remove position self[position] = 0 end # Set a bit (1/0) def []=(position, value) raise ArgumentError.new("Position out of bound (#{position} for max #{@size})") if position >= @size if value == 1 @field[position / ELEMENT_WIDTH] |= 1 << (position % ELEMENT_WIDTH) elsif (@field[position / ELEMENT_WIDTH]) & (1 << (position % ELEMENT_WIDTH)) != 0 @field[position / ELEMENT_WIDTH] ^= 1 << (position % ELEMENT_WIDTH) end end # Read a bit (1/0) def get position raise ArgumentError.new("Position out of bound (#{position} for max #{@size})") if position >= @size @field[position / ELEMENT_WIDTH] & 1 << (position % ELEMENT_WIDTH) > 0 ? 1 : 0 end # Iterate over each bit def each(&block) @size.times { |position| yield self.get(position) } end # Returns the field as a string like "0101010100111100," etc. def to_s inject("") { |a, b| a + b.to_s } end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
json-bloomfilter-0.0.3 | lib/json/bloomfilter/bitarray.rb |