ゴミ箱
Public Member Functions | List of all members
boost::beast::zlib::deflate_stream Class Reference

#include <deflate_stream.hpp>

Inheritance diagram for boost::beast::zlib::deflate_stream:
boost::beast::zlib::detail::deflate_stream

Public Member Functions

 deflate_stream ()
 
void reset (int level, int windowBits, int memLevel, Strategy strategy)
 
void reset ()
 
void clear ()
 
std::size_t upper_bound (std::size_t sourceLen) const
 
void tune (int good_length, int max_lazy, int nice_length, int max_chain)
 
void write (z_params &zs, Flush flush, error_code &ec)
 
void params (z_params &zs, int level, Strategy strategy, error_code &ec)
 
void pending (unsigned *value, int *bits)
 
void prime (int bits, int value, error_code &ec)
 

Detailed Description

Raw deflate compressor.

This is a port of zlib's "deflate" functionality to C++.

Constructor & Destructor Documentation

boost::beast::zlib::deflate_stream::deflate_stream ( )
inline

Construct a default deflate stream.

Upon construction, the stream settings will be set to these default values:

  • level = 6
  • windowBits = 15
  • memLevel = 8

Although the stream is ready to be used immediately after construction, any required internal buffers are not dynamically allocated until needed.

Member Function Documentation

void boost::beast::zlib::deflate_stream::clear ( )
inline

Clear the stream.

This function resets the stream and frees all dynamically allocated internal buffers. The compression settings are left unchanged.

Note
Any unprocessed input or pending output from previous calls are discarded.
void boost::beast::zlib::deflate_stream::params ( z_params zs,
int  level,
Strategy  strategy,
error_code ec 
)
inline

Update the compression level and strategy.

This function dynamically updates the compression level and compression strategy. The interpretation of level and strategy is as in reset. This can be used to switch between compression and straight copy of the input data, or to switch to a different kind of input data requiring a different strategy. If the compression level is changed, the input available so far is compressed with the old level (and may be flushed); the new level will take effect only at the next call of write.

Before the call of params, the stream state must be set as for a call of write, since the currently available input may have to be compressed and flushed. In particular, zs.avail_out must be non-zero.

Returns
Z_OK if success, Z_STREAM_ERROR if the source stream state was inconsistent or if a parameter was invalid, error::need_buffers if zs.avail_out was zero.
void boost::beast::zlib::deflate_stream::pending ( unsigned *  value,
int *  bits 
)
inline

Return bits pending in the output.

This function returns the number of bytes and bits of output that have been generated, but not yet provided in the available output. The bytes not provided would be due to the available output space having being consumed. The number of bits of output not provided are between 0 and 7, where they await more bits to join them in order to fill out a full byte. If pending or bits are nullptr, then those values are not set.

Returns
Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent.
void boost::beast::zlib::deflate_stream::prime ( int  bits,
int  value,
error_code ec 
)
inline

Insert bits into the compressed output stream.

This function inserts bits in the deflate output stream. The intent is that this function is used to start off the deflate output with the bits leftover from a previous deflate stream when appending to it. As such, this function can only be used for raw deflate, and must be used before the first write call after an initialization. bits must be less than or equal to 16, and that many of the least significant bits of value will be inserted in the output.

Returns
error::need_buffers if there was not enough room in the internal buffer to insert the bits.
void boost::beast::zlib::deflate_stream::reset ( int  level,
int  windowBits,
int  memLevel,
Strategy  strategy 
)
inline

Reset the stream and compression settings.

This function initializes the stream to the specified compression settings.

Although the stream is ready to be used immediately after a reset, any required internal buffers are not dynamically allocated until needed.

Note
Any unprocessed input or pending output from previous calls are discarded.
void boost::beast::zlib::deflate_stream::reset ( )
inline

Reset the stream without deallocating memory.

This function performs the equivalent of calling clear followed by reset with the same compression settings, without deallocating the internal buffers.

Note
Any unprocessed input or pending output from previous calls are discarded.
void boost::beast::zlib::deflate_stream::tune ( int  good_length,
int  max_lazy,
int  nice_length,
int  max_chain 
)
inline

Fine tune internal compression parameters.

Compression parameters should only be tuned by someone who understands the algorithm used by zlib's deflate for searching for the best matching string, and even then only by the most fanatic optimizer trying to squeeze out the last compressed bit for their specific input data. Read the deflate.c source code (ZLib) for the meaning of the max_lazy, good_length, nice_length, and max_chain parameters.

std::size_t boost::beast::zlib::deflate_stream::upper_bound ( std::size_t  sourceLen) const
inline

Returns the upper limit on the size of a compressed block.

This function makes a conservative estimate of the maximum number of bytes needed to store the result of compressing a block of data based on the current compression level and strategy.

Parameters
sourceLenThe size of the uncompressed data.
Returns
The maximum number of resulting compressed bytes.
void boost::beast::zlib::deflate_stream::write ( z_params zs,
Flush  flush,
error_code ec 
)
inline

Compress input and write output.

This function compresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce some output latency (reading input without producing any output) except when forced to flush.

In each call, one or both of these actions are performed:

  • Compress more input starting at zs.next_in and update zs.next_in and zs.avail_in accordingly. If not all input can be processed (because there is not enough room in the output buffer), zs.next_in and zs.avail_in are updated and processing will resume at this point for the next call.
  • Provide more output starting at zs.next_out and update zs.next_out and zs.avail_out accordingly. This action is forced if the parameter flush is not Flush::none. Forcing flush frequently degrades the compression ratio, so this parameter should be set only when necessary (in interactive applications). Some output may be provided even if flush is not set.

Before the call, the application must ensure that at least one of the actions is possible, by providing more input and/or consuming more output, and updating zs.avail_in or zs.avail_out accordingly; zs.avail_out should never be zero before the call. The application can consume the compressed output when it wants, for example when the output buffer is full (zs.avail_out == 0), or after each call of write. If write returns no error with zero zs.avail_out, it must be called again after making room in the output buffer because there might be more output pending.

Normally the parameter flush is set to Flush::none, which allows deflate to decide how much data to accumulate before producing output, in order to maximize compression.

If the parameter flush is set to Flush::sync, all pending output is flushed to the output buffer and the output is aligned on a byte boundary, so that the decompressor can get all input data available so far. In particular zs.avail_in is zero after the call if enough output space has been provided before the call. Flushing may degrade compression for some compression algorithms and so it should be used only when necessary. This completes the current deflate block and follows it with an empty stored block that is three bits plus filler bits to the next byte, followed by the four bytes { 0x00, 0x00 0xff 0xff }.

If flush is set to Flush::partial, all pending output is flushed to the output buffer, but the output is not aligned to a byte boundary. All of the input data so far will be available to the decompressor, as for Z_SYNC_FLUSH. This completes the current deflate block and follows it with an empty fixed codes block that is 10 bits long. This assures that enough bytes are output in order for the decompressor to finish the block before the empty fixed code block.

If flush is set to Flush::block, a deflate block is completed and emitted, as for Flush::sync, but the output is not aligned on a byte boundary, and up to seven bits of the current block are held to be written as the next byte after the next deflate block is completed. In this case, the decompressor may not be provided enough bits at this point in order to complete decompression of the data provided so far to the compressor. It may need to wait for the next block to be emitted. This is for advanced applications that need to control the emission of deflate blocks.

If flush is set to Flush::full, all output is flushed as with Flush::sync, and the compression state is reset so that decompression can restart from this point if previous compressed data has been damaged or if random access is desired. Using Flush::full too often can seriously degrade compression.

If write returns with zs.avail_out == 0, this function must be called again with the same value of the flush parameter and more output space (updated zs.avail_out), until the flush is complete (write returns with non-zero zs.avail_out). In the case of a Flush::fullor Flush::sync, make sure that zs.avail_out is greater than six to avoid repeated flush markers due to zs.avail_out == 0 on return.

If the parameter flush is set to Flush::finish, pending input is processed, pending output is flushed and deflate returns the error error::end_of_stream if there was enough output space; if deflate returns with no error, this function must be called again with Flush::finish and more output space (updated zs.avail_out) but no more input data, until it returns the error error::end_of_stream or another error. After write has returned the error::end_of_stream error, the only possible operations on the stream are to reset or destroy.

Flush::finish can be used immediately after initialization if all the compression is to be done in a single step. In this case, zs.avail_out must be at least value returned by upper_bound (see below). Then write is guaranteed to return the error::end_of_stream error. If not enough output space is provided, deflate will not return error::end_of_stream, and it must be called again as described above.

write returns no error if some progress has been made (more input processed or more output produced), error::end_of_stream if all input has been consumed and all output has been produced (only when flush is set to Flush::finish), error::stream_error if the stream state was inconsistent (for example if zs.next_in or zs.next_out was nullptr), error::need_buffers if no progress is possible (for example zs.avail_in or zs.avail_out was zero). Note that error::need_buffers is not fatal, and write can be called again with more input and more output space to continue compressing.


The documentation for this class was generated from the following file: