tiny_restrict

この日記でも何度か触れましたが、boost::iostreams::restrict()はデバイスの限定した区間へのアクセスを仮想のデバイスとして見せるためのViewです。
アクセスする区間は、現在位置からのオフセットと長さで指定します。
オフセット分の移動は、元になるデバイスがシーク可能(seekable)ならばboost::iostreams::seek()を、シーク可能でないならばboost::iostreams::skip()を用いて行われます。
boost::iostreams::skip()はドキュメントには載っていませんが、指定した数だけ文字を読み飛ばす関数で、boost::iostreams::get()を用いて実装されています。
残念ながらboost::iostreams::get()はstd::char_traitsを要求するため、floatストリームではコンパイルできません。


実際のところ、シークできないデバイスでrestrict()を使いたい場合のほとんどはオフセットが0で、長さだけを制限したい場合です。
この場合、実際にはシーク操作は発生しないため、seek()もskip()を必要ありません。
というわけで、オフセット指定のないrestrict、tiny_restrictを作りました。
意味的には、

hamigaki::iostreams::tiny_restrict(dev, len)

boost::iostreams::restrict(dev, 0, len)

が同じになる感じです。
少し名前が分かりにくいですね。