module FFI::BitField::Property

Properties provides methods to read and write bit fields.

Public Instance Methods

[](member_name) click to toggle source

@param [Symbol] member_name @return [Integer] value

# File lib/ffi/bit_field/property.rb, line 9
def [](member_name)
  parent_name, start, width = member_value_info(member_name)
  if parent_name
    value = get_member_value(parent_name)
    value[start, width]
  else
    get_member_value(member_name)
  end
end
[]=(member_name, value) click to toggle source
# File lib/ffi/bit_field/property.rb, line 19
def []=(member_name, value)
  parent_name, start, width = member_value_info(member_name)
  if parent_name
    raise "Value #{value} is larger than bit_length: #{width}" if value.bit_length > width

    parent_value = get_member_value(parent_name)
    new_value = (((1 << width) - 1 << start) & parent_value ^ parent_value) |
                (value << start)
    set_member_value(parent_name, new_value)
  else
    set_member_value(member_name, value)
  end
end

Private Instance Methods

member_value_info(member_name) click to toggle source
# File lib/ffi/bit_field/property.rb, line 35
def member_value_info(member_name)
  self.class.instance_variable_get(:@bit_field_hash_table)[member_name]
end