Module: BinData::BitField

Defined in:
lib/bindata/bits.rb

Overview

Defines a number of classes that contain a bit based integer. The integer is defined by endian and number of bits.

Class Method Summary collapse

Class Method Details

.create_methods(bit_class, nbits, endian) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/bindata/bits.rb', line 22

def self.create_methods(bit_class, 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(bit_class, nbits, endian.to_s, clamp)
end

.define_class(nbits, endian) ⇒ Object

:nodoc: all



8
9
10
11
12
13
14
15
16
17
18
19
20
# File 'lib/bindata/bits.rb', line 8

def self.define_class(nbits, endian)
  name = "Bit#{nbits}"
  name += "le" if endian == :little
  unless BinData.const_defined?(name)
    BinData.module_eval "      class \#{name} < BinData::BasePrimitive\n        register(self.name, self)\n        BitField.create_methods(self, \#{nbits}, :\#{endian.to_s})\n      end\n    END\n  end\n  BinData.const_get(name)\nend\n"

.define_methods(bit_class, nbits, endian, clamp) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/bindata/bits.rb', line 35

def self.define_methods(bit_class, nbits, endian, clamp)
  bit_class.module_eval "    #---------------\n    private\n\n    def _assign(val)\n      \#{clamp}\n      super(val)\n    end\n\n    def _do_write(io)\n      raise \"can't write whilst reading \\\#{debug_name}\" if @in_read\n      io.writebits(_value, \#{nbits}, :\#{endian})\n    end\n\n    def _do_num_bytes\n      \#{nbits} / 8.0\n    end\n\n    def read_and_return_value(io)\n      io.readbits(\#{nbits}, :\#{endian})\n    end\n\n    def sensible_default\n      0\n    end\n  END\nend\n"