class Object

Public Instance Methods

_def_enum(size) click to toggle source
# File lib/bindata-contrib/enum.rb, line 3
def _def_enum(size)
  eval %(
    module BinData
      class Enum#{size} < Primitive
        mandatory_parameter :list

        endian :big
        uint#{size} :enum, initial_value: 0

        def get
          list.invert.fetch(enum)
        rescue KeyError
          enum
        end

        def set(value)
          self.enum = list.fetch(value)
        rescue KeyError
          self.enum = value
        end

        private

        def list
          list = eval_parameter(:list)
          case list.class.to_s
          when 'Array'
            shift = 0
            list.each_with_object({}) do |each, result|
              result[each] = shift
              shift += 1
              result
            end
          when 'Hash'
            list
          end
        end
      end
    end
  )
end
_def_flags(size) click to toggle source
# File lib/bindata-contrib/flags.rb, line 3
def _def_flags(size)
  eval %(
    module BinData
      class Flags#{size} < Primitive
        mandatory_parameter :list

        endian :big
        uint#{size} :flags, initial_value: 0

        def get
          list.each_with_object([]) do |(key, value), result|
            result << key if (flags & value != 0) || (flags == value)
            result
          end
        end

        def set(value)
          value.each do |each|
            fail "Invalid flag: \#{value}" unless list.keys.include?(each)
          end
          self.flags = value.empty? ?
                       0 :
                       value.map { |each| list[each] }.inject(:|)
        end

        private

        def list
          list = eval_parameter(:list)
          case list.class.to_s
          when 'Array'
            shift = 0
            list.each_with_object({}) do |each, result|
              result[each] = 1 << shift
              shift += 1
              result
            end
          when 'Hash'
            list
          end
        end
      end
    end
  )
end