base64_decoder
base64_decoderの実装のためにRepositionalInputFilterのコンセプトを変更しました。
シグネチャは、
template<class Source> std::streamsize read_blocks(Source& src, CharT* s, std::streamsize n)
で、nは要求するブロックサイズ、戻り値は読み込んだ文字数です。
これに合わせて、Repositional{OutputFilter|Source|Sink}も修正しています。
出来たbase64_decoderは普通の(Mutli-Character)InputFilterなので、
// srcから読んだデータをBase64デコードしてsinkに書き出す template<class Source, class Sink> void base64_decode(const Source& src, const Sink& sink) { io::copy(io::compose(io_ex::base64_decoder(), src), sink); }
のように使用できます。アダプタのように使いたい場合は、次のような関数を書くだけです。
// srcをBase64デコードした結果を読み出すSourceを返す template<class Source> io::composite<io_ex::base64_decoder,Source> base64_decoded(const Source& src) { return io::compose(io_ex::base64_decoder(), src); }
おまけでRFC3548の「Base 64 Encoding with URL and Filename Safe Alphabet」版のフィルタ(urlsafe_〜)も追加しました。こちらは変換テーブルが違うだけです。