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
- .decode(source) ⇒ Object
- .decode_required(source) ⇒ Object
- .decode_signed(source) ⇒ Object
- .encode(values) ⇒ Object
-
.encode_signed(values) ⇒ Object
Zigzag-encode signed values after reserving zero for nil.
Class Method Details
.decode(source) ⇒ Object
20 21 22 23 24 25 26 27 28 |
# File 'lib/ibex/tables/compact.rb', line 20 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
31 32 33 34 35 36 37 |
# File 'lib/ibex/tables/compact.rb', line 31 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
52 53 54 55 56 57 58 |
# File 'lib/ibex/tables/compact.rb', line 52 def decode_signed(source) decode(source).map do |value| next unless value value.even? ? value / 2 : -((value + 1) / 2) end end |
.encode(values) ⇒ Object
10 11 12 13 14 15 16 17 |
# File 'lib/ibex/tables/compact.rb', line 10 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.
41 42 43 44 45 46 47 48 49 |
# File 'lib/ibex/tables/compact.rb', line 41 def encode_signed(values) encode( values.map do |value| next unless value value.negative? ? (-value * 2) - 1 : value * 2 end ) end |