Class: LZ4::StreamEncoder

Inherits:
Object
  • Object
show all
Includes:
BasicStream
Defined in:
lib/extlz4/oldstream.rb

Overview

LZ4 stream encoder

Constant Summary collapse

OPTIONS =
{
  legacy: false,
  blocksize: 7,
  block_dependency: false,
  block_checksum: false,
  stream_checksum: true,
}

Constants included from BasicStream

BasicStream::BLOCK_CHECKSUM, BasicStream::BLOCK_INDEPENDENCY, BasicStream::BLOCK_MAXIMUM_SIZES, BasicStream::LITERAL_DATA_BLOCK_FLAG, BasicStream::MAGIC_NUMBER, BasicStream::MAGIC_NUMBER_LEGACY, BasicStream::PRESET_DICTIONARY, BasicStream::STREAM_CHECKSUM, BasicStream::STREAM_SIZE, BasicStream::VERSION_NUMBER, BasicStream::VERSION_NUMBER_MASK

Instance Method Summary collapse

Constructor Details

#initialize(io, level, blocksize, block_dependency, block_checksum, stream_checksum) ⇒ StreamEncoder

Returns a new instance of StreamEncoder.

Raises:

  • (ArgumentError)


231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
# File 'lib/extlz4/oldstream.rb', line 231

def initialize(io, level, blocksize, block_dependency,
               block_checksum, stream_checksum)
  @block_checksum = !!block_checksum
  @stream_checksum = XXhash::XXhashInternal::StreamingHash32.new(0) if stream_checksum

  @blocksize = BLOCK_MAXIMUM_SIZES[blocksize]
  raise ArgumentError, "wrong blocksize (#{blocksize})" unless @blocksize

  @block_dependency = !!block_dependency
  level = level ? level.to_i : nil
  case
  when level.nil? || level < 4
    level = nil
  when level > 16
    level = 16
  end
  @encoder = get_encoder(level, @block_dependency)
  @io = io
  @buf = "".force_encoding(Encoding::BINARY)

  header = [MAGIC_NUMBER].pack("V")
  sd = VERSION_NUMBER |
       (@block_dependency ? 0 : BLOCK_INDEPENDENCY) |
       (@block_checksum ? BLOCK_CHECKSUM : 0) |
       (false ? STREAM_SIZE : 0) |
       (@stream_checksum ? STREAM_CHECKSUM : 0) |
       (false ? PRESET_DICTIONARY : 0)
  bd = (blocksize << 4)
  desc = [sd, bd].pack("CC")
  header << desc
  # TODO: header << [stream_size].pack("Q<") if stream_size
  # TODO: header << [XXhash.xxh32(predict)].pack("V") if predict # preset dictionary
  header << [XXhash.xxh32(desc) >> 8].pack("C")
  @io << header
end

Instance Method Details

#<<(data) ⇒ Object

Same as ‘write` method, but return self always.



301
302
303
304
# File 'lib/extlz4/oldstream.rb', line 301

def <<(data)
  write data
  self
end

#closeObject



306
307
308
309
310
311
312
# File 'lib/extlz4/oldstream.rb', line 306

def close
  export_block unless @buf.empty?
  @io << [0].pack("V")
  @io << [@stream_checksum.digest].pack("V") if @stream_checksum
  @io.flush if @io.respond_to?(:flush)
  @io = nil
end

#write(data) ⇒ Object

call-seq:

write(data) -> nil or self

Write data to lz4 stream.

If data is nil, return to process nothing.

RETURN (self)

Success write process.

RETURN (nil)

Given nil to data.

data (String)


283
284
285
286
287
288
289
290
291
292
293
294
295
296
# File 'lib/extlz4/oldstream.rb', line 283

def write(data)
  return nil if data.nil?
  @slicebuf ||= ""
  @inputproxy ||= StringIO.new
  @inputproxy.string = String(data)
  until @inputproxy.eof?
    slicesize = @blocksize - @buf.bytesize
    slicesize = @blocksize if slicesize > @blocksize
    @buf << @inputproxy.read(slicesize, @slicebuf)
    export_block if @buf.bytesize >= @blocksize
  end

  self
end