module BinData::BitField

def self.create_methods(klass, nbits, endian)

:nodoc: all
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