class Enummer::EnummerType
Public Class Methods
new(value_names:)
click to toggle source
@param [Array<Symbol>] value_names list of all possible values for this type
# File lib/enummer/enummer_type.rb, line 8 def initialize(value_names:) @value_names = value_names @bit_pairs = determine_bit_pairs(value_names) end
Public Instance Methods
deserialize(value)
click to toggle source
@param [Numeric] value Numeric representation of values @return [Array<Symbol>] Current value represented as symbols
# File lib/enummer/enummer_type.rb, line 30 def deserialize(value) return [] unless value return [] if value.to_i.zero? @bit_pairs.each_with_object([]) do |(pair_name, pair_value), value_names| next if (value & pair_value).zero? value_names << pair_name end end
serialize(value)
click to toggle source
@param [Symbol|Array<Symbol>] value Current value represented as one or more symbols @return Numeric Numeric representation of values
# File lib/enummer/enummer_type.rb, line 22 def serialize(value) return unless value Array.wrap(value).sum { |value_name| @bit_pairs.fetch(value_name.to_sym, 0) } end
type()
click to toggle source
@return Symbol Representation of this type @example
:enummer[read|write|execute]
# File lib/enummer/enummer_type.rb, line 16 def type "enummer[#{@value_names.join("|")}]".to_sym end
Private Instance Methods
determine_bit_pairs(value_names)
click to toggle source
# File lib/enummer/enummer_type.rb, line 43 def determine_bit_pairs(value_names) value_names.map.with_index do |name, shift| [name, 1 << shift] end.to_h end