class Barray::BitArray

Attributes

byte_size[RW]
data[RW]
size[RW]

Public Class Methods

new(size) click to toggle source
# File lib/barray.rb, line 10
def initialize(size)
  @size = size
  @byte_size = (size / 8.0).ceil
  @data = init_data
end

Public Instance Methods

dump() click to toggle source
# File lib/barray.rb, line 16
def dump
  data.dup
end
each_bit() { |get(bit_position)| ... } click to toggle source
# File lib/barray.rb, line 55
def each_bit
  return enum_for(:each_bit) unless block_given?

  size.times do |bit_position|
    yield get(bit_position)
  end
end
get(position) click to toggle source
# File lib/barray.rb, line 41
def get(position)
  ensure_position!(position)
  data.getbyte(position / 8) & (1 << (position % 8)) != 0 ? 1 : 0
end
load(data_in) click to toggle source
# File lib/barray.rb, line 20
def load(data_in)
  raise LossyOperationError, 'Data size exceeds array size' if data_in.bytesize > byte_size

  self.data = data_in.dup << "\u0000" * (byte_size - data_in.bytesize)
end
reset() click to toggle source
# File lib/barray.rb, line 46
def reset
  init_data
end
set(position) click to toggle source
# File lib/barray.rb, line 26
def set(position)
  ensure_position!(position)
  data.setbyte(position / 8, (data.getbyte(position / 8) | (1 << (position % 8))))
end
set?(position) click to toggle source
# File lib/barray.rb, line 36
def set?(position)
  ensure_position!(position)
  get(position) != 0
end
set_size() click to toggle source
# File lib/barray.rb, line 63
def set_size
  count = 0

  data.each_byte do |byte|
    next if byte.zero?

    count += byte.to_s(2).split('').reject { |bit| bit == '0' }.length
  end

  count
end
toggle(position) click to toggle source
# File lib/barray.rb, line 50
def toggle(position)
  ensure_position!(position)
  data.setbyte(position / 8, (data.getbyte(position / 8) ^ (1 << (position % 8))))
end
unset(position) click to toggle source
# File lib/barray.rb, line 31
def unset(position)
  ensure_position!(position)
  data.setbyte(position / 8, (data.getbyte(position / 8) & (255 ^ (1 << (position % 8)))))
end
unset_size() click to toggle source
# File lib/barray.rb, line 75
def unset_size
  size - set_size
end

Private Instance Methods

ensure_position!(position) click to toggle source
# File lib/barray.rb, line 88
def ensure_position!(position)
  raise InvalidPositionError, 'Position cannot exceed size' if position >= size
end
init_data() click to toggle source
# File lib/barray.rb, line 84
def init_data
  self.data = "\u0000" * byte_size
end