Module: Ibex::Tables::PackedIntegers

Defined in:
lib/ibex/tables/compact.rb

Overview

Encodes nonnegative integer arrays into compact generated-source literals. Zero represents nil; positive values are offset by one.

Class Method Summary collapse

Class Method Details

.decode(source) ⇒ Object



22
23
24
25
26
27
28
29
30
# File 'lib/ibex/tables/compact.rb', line 22

def decode(source)
  binary = source.unpack1("m0")
  raise ArgumentError, "packed integer source is invalid" unless binary.is_a?(String)

  values = binary.unpack("w*") #: Array[Integer]
  values.map { |value| value.zero? ? nil : value - 1 }
rescue ArgumentError
  raise ArgumentError, "packed integer source is invalid"
end

.decode_required(source) ⇒ Object



33
34
35
36
37
38
39
# File 'lib/ibex/tables/compact.rb', line 33

def decode_required(source)
  decode(source).map do |value|
    raise ArgumentError, "packed integer source contains nil" unless value

    value
  end
end

.decode_signed(source) ⇒ Object



54
55
56
57
58
59
60
# File 'lib/ibex/tables/compact.rb', line 54

def decode_signed(source)
  decode(source).map do |value|
    next unless value

    value.even? ? value / 2 : -((value + 1) / 2)
  end
end

.encode(values) ⇒ Object



12
13
14
15
16
17
18
19
# File 'lib/ibex/tables/compact.rb', line 12

def encode(values)
  encoded = values.map do |value|
    raise ArgumentError, "packed integer must be nonnegative or nil" if value&.negative?

    value ? value + 1 : 0
  end.pack("w*")
  [encoded].pack("m0")
end

.encode_signed(values) ⇒ Object

Zigzag-encode signed values after reserving zero for nil.



43
44
45
46
47
48
49
50
51
# File 'lib/ibex/tables/compact.rb', line 43

def encode_signed(values)
  encode(
    values.map do |value|
      next unless value

      value.negative? ? (-value * 2) - 1 : value * 2
    end
  )
end