module Bitfields::InstanceMethods

Public Instance Methods

bitfield_changes() click to toggle source
# File lib/bitfields.rb, line 187
def bitfield_changes
  self.class.bitfields.values.flat_map(&:keys).each_with_object({}) do |bit, changes|
    old, current = bitfield_value_was(bit), bitfield_value(bit)
    changes[bit.to_s] = [old, current] unless old == current
  end
end
bitfield_values(column) click to toggle source
# File lib/bitfields.rb, line 183
def bitfield_values(column)
  Hash[self.class.bitfields[column.to_sym].map{|bit_name, _| [bit_name, bitfield_value(bit_name)]}]
end

Private Instance Methods

bitfield_info(bit_name) click to toggle source
# File lib/bitfields.rb, line 236
def bitfield_info(bit_name)
  column = self.class.bitfield_column(bit_name)
  [
    column,
    self.class.bitfields[column][bit_name], # bit
    (send(column)||0) # current value
  ]
end
bitfield_value(bit_name) click to toggle source
# File lib/bitfields.rb, line 196
def bitfield_value(bit_name)
  _, bit, current_value = bitfield_info(bit_name)
  current_value & bit != 0
end
bitfield_value_before_last_save(bit_name) click to toggle source
# File lib/bitfields.rb, line 206
def bitfield_value_before_last_save(bit_name)
  column, bit, _ = bitfield_info(bit_name)
  column_before_last_save = send("#{column}_before_last_save")
  column_before_last_save.nil? ? nil : column_before_last_save & bit != 0
end
bitfield_value_change(bit_name) click to toggle source
# File lib/bitfields.rb, line 212
def bitfield_value_change(bit_name)
  values = [bitfield_value_was(bit_name), bitfield_value(bit_name)]
  values unless values[0] == values[1]
end
bitfield_value_was(bit_name) click to toggle source
# File lib/bitfields.rb, line 201
def bitfield_value_was(bit_name)
  column, bit, _ = bitfield_info(bit_name)
  send("#{column}_was") & bit != 0
end
saved_change_to_bitfield_value(bit_name) click to toggle source
# File lib/bitfields.rb, line 217
def saved_change_to_bitfield_value(bit_name)
  value_before_last_save = bitfield_value_before_last_save(bit_name)
  current_value = bitfield_value(bit_name)
  unless value_before_last_save.nil? || (value_before_last_save == current_value)
    [value_before_last_save, current_value]
  end
end
set_bitfield_value(bit_name, value) click to toggle source
# File lib/bitfields.rb, line 225
def set_bitfield_value(bit_name, value)
  column, bit, current_value = bitfield_info(bit_name)
  new_value = TRUE_VALUES.include?(value)
  old_value = bitfield_value(bit_name)
  return if new_value == old_value

  # 8 + 1 == 9 // 8 + 8 == 8 // 1 - 8 == 1 // 8 - 8 == 0
  new_bits = if new_value then current_value | bit else (current_value | bit) - bit end
  send("#{column}=", new_bits)
end