boost::iostreams で圧縮・復元(gzip)

C++ でデータの圧縮・復元をする場合,boost C++ library に便利な Filter があります.gzip -c や gzip -cd などで対応できないときには,検討する価値があると思います.

# リンクするときにライブラリ libboost_iostream... を指定する必要があります.また,zlib_compressor や bzip2_compressor も提供されています.

#include <iostream>

#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/filter/gzip.hpp>

// 受け取ったデータを圧縮して出力ストリームに渡す.
class Compressor
{
public:
	Compressor(std::ostream *output) : filter_(), stream_(&filter_)
	{
		filter_.push(boost::iostreams::gzip_compressor());
		filter_.push(*output);
	}

	std::ostream &stream() { return stream_; }

private:
	boost::iostreams::filtering_streambuf<boost::iostreams::output> filter_;
	std::ostream stream_;

	// Disallows copies.
	Compressor(const Compressor &);
	Compressor &operator=(const Compressor &);
};

// 入力ストリームから受け取った圧縮データを解凍する.
class Decompressor
{
public:
	Decompressor(std::istream *input) : filter_(), stream_(&filter_)
	{
		filter_.push(boost::iostreams::gzip_decompressor());
		filter_.push(*input);
	}

	std::istream &stream() { return stream_; }

private:
	boost::iostreams::filtering_streambuf<boost::iostreams::input> filter_;
	std::istream stream_;

	// Disallows copies.
	Decompressor(const Decompressor &);
	Decompressor &operator=(const Decompressor &);
};