Method: PackedModel::Base.bit_vector

Defined in:
lib/packed_model/base.rb

.bit_vector(name, fields, options = {}) ⇒ Object



165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
# File 'lib/packed_model/base.rb', line 165

def self.bit_vector(name, fields, options={})
  raise "too many fields for bit vecotr #{name}" if fields.size > 32

  self.attribute name, {:type => :integer, :fields => fields}.merge(options)

  name_equals = "#{name}="

  fields.each_with_index do |fld, idx|
    mask = 1 << idx

    define_method fld do
      (self.send(name) & mask) == mask
    end

    define_method "#{fld}=" do |val|
      if val
        self.send(name_equals, self.send(name) | mask)
      else
        self.send(name_equals, self.send(name) ^ mask)
      end
    end
  end
end