non_blocking_adapter for Blocking

Boost.Iostreamsでは、今のところBlockingデバイスとNon-Blockingデバイスを区別する方法がありません。
そのため、ブロック操作が必要な場合は、

io::non_blocking_adapter<Sink> nb(snk);
io::write(nb, buf, size);

のようにnon_blocking_adapterでラップして強制的にブロック操作を行っていたりします。
元となるデバイスがBlockingかどうか分からないため、操作が完了するまでループするNon-Blocking用のコードが常に使用されます。
このコードは非常に単純なものですが、デバイスにアダプタを複数適用するとアダプタ毎にループが発生し、無駄な多重ループを引き起こす可能性があります。
これを回避するため、あらかじめBlockingであると分かっているクラスに対してnon_blocking_adapterの特別バージョンを用意し、単純な実装を提供する方法を考えてみました。
<hamigaki/iostreams/blocking.hpp>

class Sink { ... };
HAMIGAKI_IOSTREAMS_BLOCKING(Sink); // SinkはBlocking

Sink snk;
io::non_blocking_adapter<Sink> nb(snk);
io::write(nb, buf, size); // io::write(snk, buf, size) と同じ

みみっちい気もしますが、これで気兼ねなくnon_blocking_adapterが使えます。


#あっ、クラステンプレートに対応するの忘れてた、、、。