module BinData::BitField
def self.create_methods(klass, nbits, endian)
def self.create_methods(klass, nbits, endian) min = 0 max = (1 << nbits) - 1 clamp = "val = (val < #{min}) ? #{min} : (val > #{max}) ? #{max} : val" # allow single bits to be used as booleans if nbits == 1 clamp = "val = (val == true) ? 1 : (not val) ? 0 : #{clamp}" end define_methods(klass, nbits, endian.inspect, clamp) end
def self.define_methods(klass, nbits, endian, clamp)
def self.define_methods(klass, nbits, endian, clamp) # define methods in the given class klass.module_eval <<-END def value=(val) #{clamp} super(val) end #--------------- private def _do_write(io) raise "can't write whilst reading" if @in_read io.writebits(_value, #{nbits}, #{endian}) end def _do_num_bytes(ignored) #{nbits} / 8.0 end def read_val(io) io.readbits(#{nbits}, #{endian}) end def sensible_default 0 end END end