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
- .create_methods(bit_class, nbits, endian) ⇒ Object
-
.define_class(nbits, endian) ⇒ Object
:nodoc: all.
- .define_methods(bit_class, nbits, endian, clamp) ⇒ Object
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" |