Class: ZipTricks::WriteBuffer

Inherits:
Object
  • Object
show all
Defined in:
lib/zip_tricks/write_buffer.rb

Overview

Some operations (such as CRC32) benefit when they are performed on larger chunks of data. In certain use cases, it is possible that the consumer of ZipTricks is going to be writing small chunks in rapid succession, so CRC32 is going to have to perform a lot of CRC32 combine operations - and this adds up. Since the CRC32 value is usually not needed until the complete output has completed we can buffer at least some amount of data before computing CRC32 over it.

Instance Method Summary collapse

Constructor Details

#initialize(writable, buffer_size) ⇒ WriteBuffer

Creates a new WriteBuffer bypassing into a given writable object

Parameters:

  • writable (#<<)

    An object that responds to #<< with string as argument

  • buffer_size (Integer)

    How many bytes to buffer



13
14
15
16
17
# File 'lib/zip_tricks/write_buffer.rb', line 13

def initialize(writable, buffer_size)
  @buf = StringIO.new
  @buffer_size = buffer_size
  @writable = writable
end

Instance Method Details

#<<(data) ⇒ Object

Appends the given data to the write buffer, and flushes the buffer into the writable if the buffer size exceeds the buffer_size given at initialization

Parameters:

  • data (String)

    data to be written

Returns:

  • self



24
25
26
27
28
# File 'lib/zip_tricks/write_buffer.rb', line 24

def <<(data)
  @buf << data
  flush! if @buf.size > @buffer_size
  self
end

#flush!Object

Explicitly flushes the buffer if it contains anything

Returns:

  • self



33
34
35
36
37
38
# File 'lib/zip_tricks/write_buffer.rb', line 33

def flush!
  @writable << @buf.string if @buf.size > 0
  @buf.truncate(0)
  @buf.rewind
  self
end

#to_iInteger

Flushes the buffer and returns the result of #to_i of the contained writable. Primarily facilitates working with StreamCRC32 objects where you finish the computation by retrieving the CRC as an integer

Returns:

  • (Integer)

    the return value of writable#to_i



45
46
47
48
# File 'lib/zip_tricks/write_buffer.rb', line 45

def to_i
  flush!
  @writable.to_i
end