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が使えます。
#あっ、クラステンプレートに対応するの忘れてた、、、。