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