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_〜)も追加しました。こちらは変換テーブルが違うだけです。