Class: BinStruct::BitAttr Abstract
- Inherits:
-
Object
- Object
- BinStruct::BitAttr
- Includes:
- Structable
- Defined in:
- lib/bin_struct/bit_attr.rb
Overview
This class is abstract.
Subclasses must de derived using BitAttr.create.
Define a bitfield attribute to embed in a Struct. Use it through Struct.define_bit_attr
Defined Under Namespace
Classes: Parameters
Class Attribute Summary collapse
- .bit_methods ⇒ ::Array[Symbol] readonly
- .parameters ⇒ Parameters readonly
Instance Attribute Summary collapse
-
#width ⇒ Integer
readonly
Width in bits of bit attribute.
Class Method Summary collapse
-
.create(width:, endian: :big, **fields) ⇒ Class
Create a new BitAttr subclass with specified parameters.
Instance Method Summary collapse
- #bit_methods ⇒ ::Array[Symbol]
- #format_inspect ⇒ Object
-
#from_human(value) ⇒ self
Set fields from associated integer.
-
#initialize(opts = {}) ⇒ self
constructor
Initialize bit attribute.
- #initialize_copy(_other) ⇒ Object
-
#read(str) ⇒ self
Populate bit attribute from
str
. -
#to_i ⇒ Integer
(also: #to_human)
Give integer associated to this attribute.
-
#to_s ⇒ ::String
Return binary string.
-
#type_name ⇒ ::String
Get type name.
Methods included from Structable
Constructor Details
#initialize(opts = {}) ⇒ self
Initialize bit attribute
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
# File 'lib/bin_struct/bit_attr.rb', line 126 def initialize(opts = {}) parameters = self.class.parameters raise NotImplementedError, "#initialize may only be called on subclass of #{self.class}" if parameters.nil? @width = parameters.width @fields = parameters.fields @int = parameters.int.dup @data = {} @bit_methods = [] parameters.fields.each_key do |name| @data[name] = opts[name] || 0 end @bit_methods.freeze end |
Class Attribute Details
.bit_methods ⇒ ::Array[Symbol] (readonly)
48 49 50 |
# File 'lib/bin_struct/bit_attr.rb', line 48 def bit_methods @bit_methods end |
.parameters ⇒ Parameters (readonly)
44 45 46 |
# File 'lib/bin_struct/bit_attr.rb', line 44 def parameters @parameters end |
Instance Attribute Details
#width ⇒ Integer (readonly)
Returns width in bits of bit attribute.
34 35 36 |
# File 'lib/bin_struct/bit_attr.rb', line 34 def width @width end |
Class Method Details
.create(width:, endian: :big, **fields) ⇒ Class
Create a new BinStruct::BitAttr subclass with specified parameters
59 60 61 62 63 64 65 66 67 68 69 70 |
# File 'lib/bin_struct/bit_attr.rb', line 59 def create(width:, endian: :big, **fields) raise ArgumentError, 'with must be 8, 16, 24, 32 or 64' unless [8, 16, 24, 32, 64].include?(width) hsh = compute_hash(width, endian, fields) cached = cache[hsh] return cached if cached total_size = fields.reduce(0) { |acc, ary| acc + ary.last } raise ArgumentError, "sum of bitfield sizes is not equal to #{width}" unless total_size == width cache[hsh] = create_subclass(width, endian, fields.dup.freeze) end |
Instance Method Details
#bit_methods ⇒ ::Array[Symbol]
147 148 149 |
# File 'lib/bin_struct/bit_attr.rb', line 147 def bit_methods self.class.bit_methods end |
#format_inspect ⇒ Object
201 202 203 204 |
# File 'lib/bin_struct/bit_attr.rb', line 201 def format_inspect str = @int.format_inspect << "\n" str << @data.map { |name, value| "#{name}:#{value}" }.join(' ') end |
#from_human(value) ⇒ self
Set fields from associated integer
197 198 199 |
# File 'lib/bin_struct/bit_attr.rb', line 197 def from_human(value) compute_data(value.to_i) end |
#initialize_copy(_other) ⇒ Object
142 143 144 |
# File 'lib/bin_struct/bit_attr.rb', line 142 def initialize_copy(_other) @data = @data.dup end |
#read(str) ⇒ self
Populate bit attribute from str
167 168 169 170 171 172 |
# File 'lib/bin_struct/bit_attr.rb', line 167 def read(str) return self if str.nil? @int.read(str) compute_data(@int.to_i) end |
#to_i ⇒ Integer Also known as: to_human
Give integer associated to this attribute
176 177 178 179 180 181 182 183 184 |
# File 'lib/bin_struct/bit_attr.rb', line 176 def to_i v = 0 @fields.each do |name, size| v <<= size v |= @data[name] end v end |
#to_s ⇒ ::String
Return binary string
189 190 191 192 |
# File 'lib/bin_struct/bit_attr.rb', line 189 def to_s @int.value = to_i @int.to_s end |
#type_name ⇒ ::String
Get type name
153 154 155 156 157 158 159 160 161 162 |
# File 'lib/bin_struct/bit_attr.rb', line 153 def type_name return @type_name if defined? @type_name endian_suffix = case @int.endian when :big then '' when :little then 'le' when :native then 'n' end @type_name = "BitAttr#{@width}#{endian_suffix}" end |