Module: Ibex::Tables::PackedIntegers

Defined in:
lib/ibex/tables/compact.rb,
sig/ibex/tables/compact.rbs

Overview

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

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.decode(source) ⇒ Object

RBS:

  • (String source) -> Array[Integer?]



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

RBS:

  • (String source) -> Array[Integer]



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

RBS:

  • (String source) -> Array[Integer?]



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

RBS:

  • (Array[Integer?] values) -> String



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.

RBS:

  • (Array[Integer?] values) -> String



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

Instance Method Details

#self?.decodeArray[Integer?]

RBS:

  • (String source) -> Array[Integer?]

Parameters:

  • source (String)

Returns:

  • (Array[Integer?])


12
# File 'sig/ibex/tables/compact.rbs', line 12

def self?.decode: (String source) -> Array[Integer?]

#self?.decode_requiredArray[Integer]

RBS:

  • (String source) -> Array[Integer]

Parameters:

  • source (String)

Returns:

  • (Array[Integer])


15
# File 'sig/ibex/tables/compact.rbs', line 15

def self?.decode_required: (String source) -> Array[Integer]

#self?.decode_signedArray[Integer?]

RBS:

  • (String source) -> Array[Integer?]

Parameters:

  • source (String)

Returns:

  • (Array[Integer?])


22
# File 'sig/ibex/tables/compact.rbs', line 22

def self?.decode_signed: (String source) -> Array[Integer?]

#self?.encodeString

RBS:

  • (Array[Integer?] values) -> String

Parameters:

  • values (Array[Integer?])

Returns:

  • (String)


9
# File 'sig/ibex/tables/compact.rbs', line 9

def self?.encode: (Array[Integer?] values) -> String

#self?.encode_signedString

Zigzag-encode signed values after reserving zero for nil.

RBS:

  • (Array[Integer?] values) -> String

Parameters:

  • values (Array[Integer?])

Returns:

  • (String)


19
# File 'sig/ibex/tables/compact.rbs', line 19

def self?.encode_signed: (Array[Integer?] values) -> String