aki017/ZeroFormatter.rb

View on GitHub
lib/zero_formatter/utils.rb

Summary

Maintainability
A
2 hrs
Test Coverage
module ZeroFormatter
  class Utils
    class << self
      def read_s1(bytes, index)
        to_signed(bytes.getbyte(index), 1 << (8 -1))
      end

      def read_u1(bytes, index)
        bytes.getbyte(index)
      end

      def read_u2(bytes, index)
        bytes.byteslice(index, 2).unpack('v')[0]
      end

      def read_s2(bytes, index)
        to_signed(read_u2(bytes, index), 1 << (16 - 1))
      end

      def read_u4(bytes, index)
        bytes.byteslice(index, 4).unpack('V')[0]
      end

      def read_s4(bytes, index)
        to_signed(read_u4(bytes, index), 1 << (32 - 1))
      end

      def read_u8(bytes, index)
        l, h = bytes.byteslice(index, 8).unpack('VV')
        (h << 32) + l
      end

      def read_s8(bytes, index)
        to_signed(read_u8(bytes, index), 1 << (64 - 1))
      end

      def read_f4(bytes, index)
        bytes.byteslice(index, 4).unpack('e')[0]
      end

      def read_d8(bytes, index)
        bytes.byteslice(index, 8).unpack('E')[0]
      end

      def to_signed(v, mask)
        (v & ~mask) - (v & mask)
      end




      def write_u1(value)
        value ||= 0
        [value].pack("C")
      end

      def write_s1(value)
        value ||= 0
        [value].pack("c")
      end

      def write_u2(value)
        value ||= 0
        [value].pack('v')
      end

      def write_s2(value)
        value ||= 0
        [value].pack('v')
      end

      def write_u4(value)
        value ||= 0
        [value].pack('V')
      end

      def write_s4(value)
        value ||= 0
        [value].pack('V')
      end

      def write_u8(value)
        value ||= 0
        [value].pack('Q!<')
      end

      def write_s8(value)
        value ||= 0
        value += (2 ** 64) if value < 0
        [value].pack('q!<')
      end

      def write_f4(value)
        value ||= 0.0
        [value].pack("e")
      end

      def write_d8(value)
        value ||= 0.0
        [value].pack("E")
      end
    end
  end
end