Top Level Namespace

Defined Under Namespace

Modules: BinData

Instance Method Summary collapse

Instance Method Details

#_def_enum(size) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 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) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# 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