Sha256: 5fc8e691cc22b4f1491a43233c658e04ad0e5c217f2c3afee53a232ef274a8ac

Contents?: true

Size: 1.91 KB

Versions: 165

Compression:

Stored size: 1.91 KB

Contents

# frozen_string_literal: true

require 'eac_ruby_utils/bit'
require 'eac_ruby_utils/byte'
require 'eac_ruby_utils/byte_array'
require 'eac_ruby_utils/patches/module/compare_by'

module EacRubyUtils
  class BitArray
    class << self
      def assert(obj)
        return obj if obj.is_a?(self)
        return new(obj) if obj.is_a?(::Enumerable)

        raise "Could not convert #{obj} to #{self}"
      end
    end

    delegate :each, :each_with_index, :to_a, :size, :count, :length, :[], :fetch, to: :values_array
    compare_by :values_array

    def initialize(values = [])
      values.each { |value| push(value) }
    end

    def <<(value)
      push(value)
    end

    # @return [EacRubyUtils::BitArray] +self+.
    def push_array(other_bit_array)
      values_array.push(*other_bit_array.to_a)

      self
    end

    # @param value [EacRubyUtils::Bit]
    # @return [EacRubyUtils::Bit]
    def push(value)
      values_array.push(::EacRubyUtils::Bit.assert(value))
    end

    # @return [EacRubyUtils::BitArray]
    def reverse
      self.class.new(values_array.reverse)
    end

    # @param big_endian [Boolean]
    # @return [EacRubyUtils::ByteArray]
    def to_byte_array(big_endian = false)
      unless count.modulo(::EacRubyUtils::Byte::BIT_COUNT).zero?
        raise 'Bits returned is not multile of 8'
      end

      byte_bits_enumerator.each_with_object(::EacRubyUtils::ByteArray.new) do |e, a|
        a << ::EacRubyUtils::Byte.from_bit_array(e, big_endian)
      end
    end

    # @return [Array<Integer>]
    def to_int_array
      values_array.map(&:to_i)
    end

    private

    def byte_bits_enumerator
      ::Enumerator.new do |y|
        offset = 0
        while offset < values_array.count
          y.yield(values_array.slice(offset, ::EacRubyUtils::Byte::BIT_COUNT))
          offset += ::EacRubyUtils::Byte::BIT_COUNT
        end
      end
    end

    def values_array
      @values_array ||= []
    end
  end
end

Version data entries

165 entries across 165 versions & 3 rubygems

Version Path
eac_tools-0.76.1 sub/eac_ruby_utils/lib/eac_ruby_utils/bit_array.rb
eac_tools-0.76.0 sub/eac_ruby_utils/lib/eac_ruby_utils/bit_array.rb
eac_tools-0.75.2 sub/eac_ruby_utils/lib/eac_ruby_utils/bit_array.rb
eac_ruby_utils-0.119.2 lib/eac_ruby_utils/bit_array.rb
eac_tools-0.75.1 sub/eac_ruby_utils/lib/eac_ruby_utils/bit_array.rb
eac_tools-0.75.0 sub/eac_ruby_utils/lib/eac_ruby_utils/bit_array.rb
eac_ruby_utils-0.119.1 lib/eac_ruby_utils/bit_array.rb
eac_tools-0.74.1 sub/eac_ruby_utils/lib/eac_ruby_utils/bit_array.rb
eac_tools-0.74.0 sub/eac_ruby_utils/lib/eac_ruby_utils/bit_array.rb
eac_tools-0.73.0 sub/eac_ruby_utils/lib/eac_ruby_utils/bit_array.rb
eac_ruby_utils-0.119.0 lib/eac_ruby_utils/bit_array.rb
eac_tools-0.72.0 sub/eac_ruby_utils/lib/eac_ruby_utils/bit_array.rb
eac_ruby_utils-0.118.1 lib/eac_ruby_utils/bit_array.rb
eac_ruby_utils-0.118.0 lib/eac_ruby_utils/bit_array.rb
eac_tools-0.70.1 sub/eac_ruby_utils/lib/eac_ruby_utils/bit_array.rb
eac_tools-0.70.0 sub/eac_ruby_utils/lib/eac_ruby_utils/bit_array.rb
eac_tools-0.69.1 sub/eac_ruby_utils/lib/eac_ruby_utils/bit_array.rb
eac_ruby_utils-0.117.1 lib/eac_ruby_utils/bit_array.rb
eac_tools-0.69.0 sub/eac_ruby_utils/lib/eac_ruby_utils/bit_array.rb
eac_tools-0.68.0 sub/eac_ruby_utils/lib/eac_ruby_utils/bit_array.rb