Sha256: 09898519bfee48c4ce85c2784c3d14dea822e141cd4a3f9b5a87f8e1495bb9f8
Contents?: true
Size: 1.45 KB
Versions: 1
Compression:
Stored size: 1.45 KB
Contents
# -*- encoding : utf-8 -*- require 'stringio' module Bychar VERSION = '1.0.0' # Default buffer size is 512k DEFAULT_BUFFER_SIZE = 512 * 1024 # This object helps you build parsers that parse an IO byte by byte without having to # read byte by byte. # Reading byte by byte is very inefficient, but we want to parse byte by byte since # this makes parser construction much easier. So what we do is cache some chunk of the # passed buffer and read from that. Once exhausted there will be some caching again, # and ad infinitum until the passed buffer is exhausted class Reader def initialize(with_io, buffer_size = DEFAULT_BUFFER_SIZE) @io = with_io @bufsize = buffer_size @buf = StringIO.new end # Will transparently read one byte off the contained IO, maintaining the internal cache. # If the cache has been depleted it will read a big chunk from the IO and cache it and then # return the byte def read_one_byte cache if @buf.pos == @buf.size return nil if @buf.size.zero? return @buf.read(1) end # Tells whether all the data has been both read from the passed buffer # and from the internal cache buffer (checks whether there is anything that # can be retreived using read_one_byte) def eof? @buf.eof? && @io.eof? end private def cache data = @io.read(@bufsize) @buf = StringIO.new(data.to_s) # Make nil become "" end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
bychar-1.0.0 | lib/bychar.rb |