#include <iostream>
#include <boost/iostreams/stream.hpp>
#include <boost/iostreams/concepts.hpp>
using namespace std;
// ひたすら無限にAが読み取れるストリームを作ろう
class all_a : public boost::iostreams::source
{
public:
std::streamsize read( char* s, std::streamsize n )
{
for(int i=0; i!=n; ++i)
*s++ = 'A';
return n;
}
};
int main()
{
all_a aa;
boost::iostreams::stream<all_a> s(aa);
char ch;
while( s >> ch ) cout << ch;
}
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...
標準ライブラリのiostreamは使う側としては楽ですが、いざ、自作のストリームクラスを定義しようと思うと、 ちょこちょこお約束があって大変です。 ちなみに自作ストリームの作り方については 「iostreamの拡張」 という文書がわかりやすくまとまっています。オススメです。
それはともかくとして、Boost.Iostreamsは簡単に自作ストリームクラスを作るための補助ライブラリです。 入力ストリームを作るには、上のサンプルのようにreadメソッド1個実装してsourceから派生して streamテンプレートに渡せばOK。出力ストリームも同様にwriteメソッドを実装してsinkから派生して以下略。
さらに面白いのは、 sourceやsinkを使って定義したクラスに Filter をつなげて、unixのコマンドをパイプでつなぐような感覚で、 複雑な処理をするストリームを定義できる機能です。 [gzip圧縮するフィルタ (zlib_compressor())]→[ファイルへ書き込むsink (file_sink())] とつないで、書き込んだ内容を圧縮してファイルに書き出すストリームを作るなどなど。
Takeshi Mouri さんによる Hamigaki.Audio は、Boost.Iostreams のコンセプトに基づいたオーディオ処理ライブラリだそうです。