mirror of
https://github.com/boostorg/iostreams.git
synced 2026-02-22 15:32:20 +00:00
83 lines
2.0 KiB
HTML
Executable File
83 lines
2.0 KiB
HTML
Executable File
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
|
<HTML>
|
|
<HEAD>
|
|
<TITLE>Zlib Example Output</TITLE>
|
|
</HEAD>
|
|
<BODY>
|
|
<PRE>
|
|
**** Length of code ****
|
|
|
|
883
|
|
|
|
**** Length of compressed code ****
|
|
|
|
458
|
|
|
|
**** Code before compression ****
|
|
|
|
class zlib_compressor : public one_step_output_filter {
|
|
public:
|
|
explicit zlib_compressor(int level = Z_DEFAULT_COMPRESSION)
|
|
: level_(level)
|
|
{
|
|
assert( level_ >= 0 && level_ <= 9 ||
|
|
level == Z_DEFAULT_COMPRESSION );
|
|
}
|
|
protected:
|
|
void do_filter(const vector_type& src, vector_type& dest)
|
|
{
|
|
dest.assign(src.begin(), src.end());
|
|
dest.insert(dest.end(), (size_t) ceil(src.size() * 1.001) + 12, 0);
|
|
unsigned long length = (unsigned long) dest.size();
|
|
int result =
|
|
compress2( (Bytef*) &dest[0], &length,
|
|
(Bytef*) &src[0], (unsigned long) src.size(),
|
|
level_ );
|
|
if (result == Z_OK)
|
|
dest.erase(dest.begin() + length, dest.end());
|
|
else if (result == Z_MEM_ERROR)
|
|
throw std::bad_alloc();
|
|
else if (result == Z_STREAM_ERROR)
|
|
throw std::ios_base::failure("invalid level");
|
|
}
|
|
private:
|
|
int level_;
|
|
};
|
|
|
|
|
|
**** Code after decompression ****
|
|
|
|
class zlib_compressor : public one_step_output_filter {
|
|
public:
|
|
explicit zlib_compressor(int level = Z_DEFAULT_COMPRESSION)
|
|
: level_(level)
|
|
{
|
|
assert( level_ >= 0 && level_ <= 9 ||
|
|
level == Z_DEFAULT_COMPRESSION );
|
|
}
|
|
protected:
|
|
void do_filter(const vector_type& src, vector_type& dest)
|
|
{
|
|
dest.assign(src.begin(), src.end());
|
|
dest.insert(dest.end(), (size_t) ceil(src.size() * 1.001) + 12, 0);
|
|
unsigned long length = (unsigned long) dest.size();
|
|
int result =
|
|
compress2( (Bytef*) &dest[0], &length,
|
|
(Bytef*) &src[0], (unsigned long) src.size(),
|
|
level_ );
|
|
if (result == Z_OK)
|
|
dest.erase(dest.begin() + length, dest.end());
|
|
else if (result == Z_MEM_ERROR)
|
|
throw std::bad_alloc();
|
|
else if (result == Z_STREAM_ERROR)
|
|
throw std::ios_base::failure("invalid level");
|
|
}
|
|
private:
|
|
int level_;
|
|
};
|
|
|
|
|
|
</PRE>
|
|
</BODY>
|
|
</HTML>
|