Sha256: 190ebbfaf8f2a09f12f76256ed0545f8bef07fe05a5a76623a74770ac4e44038

Contents?: true

Size: 1.84 KB

Versions: 1

Compression:

Stored size: 1.84 KB

Contents

class ByteArray 
  VERSION = "0.9.0"
  
  attr_reader :bytes
  def initialize size = 0, obj = 0
    @bytes = []
    size.times do @bytes << Byte[obj] end
  end
   
  def self.[] array = []
    return array if array.is_a? ByteArray
    b = new
    b.insert 0, *array
    b
  end

  def [] slice
    case slice
    when Range
      ByteArray[@bytes[slice]]
    when Integer
      @bytes[slice]
    end
  end

  def []= slice, *input
    input = input.flat_map(&method(:to_bytes))
    case slice
    when Range
      @bytes[slice] = *input 
    when Integer
      insert slice, *input
    end unless input.empty?
  end

  def length
    @bytes.length
  end

  def inspect
    "ByteArray#{@bytes}"
  end

  def insert position, *what
    assert_in_range position

    what = what.flat_map(&method(:to_bytes))
    @bytes[position..position+what.length-1] = what unless what.empty?
  end

  def == other
    return false if other.length != @bytes.length
    ByteArray[other].zip(@bytes).all?{|a,b| a == b}
  end
  
  def coerce other
    [ByteArray[other], self]
  end

  def to_ary
    @bytes
  end

  def to_a
    @bytes
  end

  def method_missing m, *a, &b
    #puts "Method #{m} called with", *a
    @bytes.send m, *a, &b
  end

  private
  # to_bytes always returns Array of Bytes
  def to_bytes input
    b = case input
    when String
      input.unpack("C*")
    when Integer
      raise RangeError, "Integer #{input} is to large to be a Byte" unless input < 256
      [input]
    when Byte
      return [input]
    when Array
      input
    when NilClass
      []
    else
      raise TypeError, "Unexpected type #{input.class} for ByteArray#to_bytes"
    end
    b.map &Byte
  end

  def assert_in_range index
    unless (0..@bytes.length).include? index
      raise RangeError,
        "Range Exceeded! #{index} is outside of 0..#{@bytes.length}"
    end
    true
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
byte_array-0.9.0 lib/byte_array/byte_array.rb