Module: Ibex::Tables::PackedIntegers

Defined in:
lib/json5/generated_parser.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

RBS:

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



9492
9493
9494
9495
9496
9497
9498
9499
9500
# File 'lib/json5/generated_parser.rb', line 9492

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]



9503
9504
9505
9506
9507
9508
9509
# File 'lib/json5/generated_parser.rb', line 9503

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?]



9524
9525
9526
9527
9528
9529
9530
# File 'lib/json5/generated_parser.rb', line 9524

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



9482
9483
9484
9485
9486
9487
9488
9489
# File 'lib/json5/generated_parser.rb', line 9482

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



9513
9514
9515
9516
9517
9518
9519
9520
9521
# File 'lib/json5/generated_parser.rb', line 9513

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

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