class BinData::Buffer::BufferIO

a buffer of specified length.
Transforms the IO stream to restrict access inside

def after_read_transform

def after_read_transform
  read(nil)
end

def after_write_transform

def after_write_transform
  write("\x00" * @bytes_remaining)
end

def before_transform

def before_transform
  @buf_start = offset
  @buf_end = @buf_start + @bytes_remaining
end

def buffer_limited_n(n)

def buffer_limited_n(n)
  if n.nil?
    @bytes_remaining
  elsif n.positive?
    limit = @bytes_remaining
    n > limit ? limit : n
mment if we decide to allow backwards skipping
   elsif n.negative?
     limit = @bytes_remaining + @buf_start - @buf_end
     n < limit ? limit : n
  else
    0
  end
end

def initialize(length)

def initialize(length)
  super()
  @bytes_remaining = length
end

def num_bytes_remaining

def num_bytes_remaining
  [@bytes_remaining, super].min
rescue IOError
  @bytes_remaining
end

def read(n)

def read(n)
  nbytes = buffer_limited_n(n)
  @bytes_remaining -= nbytes
  chain_read(nbytes)
end

def seek_abs(n)

def seek_abs(n)
  if n < @buf_start || n >= @buf_end
    raise IOError, "can not seek to abs_offset outside of buffer"
  end
  @bytes_remaining -= (n - offset)
  chain_seek_abs(n)
end

def skip(n)

def skip(n)
  nbytes = buffer_limited_n(n)
  @bytes_remaining -= nbytes
  chain_skip(nbytes)
end

def write(data)

def write(data)
  nbytes = buffer_limited_n(data.size)
  @bytes_remaining -= nbytes
  if nbytes < data.size
    data = data[0, nbytes]
  end
  chain_write(data)
end