続 Hamigaki.Binary

Hamigaki.Binaryのリファレンスを追加しました。
http://hamigaki.sourceforge.jp/doc/html/binary/reference.html
いつも通り、内容のほとんどないリファレンスですが、自分が仕様を再確認する程度には役立っています。


ドキュメントを書いていて、Hamigaki.Binaryの存在意義について改めて考えさせられました。
そもそもの発端は、

// 適当な構造体
struct hoge
{
    boost::int16_t a;
    boost::uint32_t b;
};

// 符号付き16ビット整数(リトルエンディアン)の読み込み
template<class Source>
boost::int16_t read_int16_little(Source& src);

// 符号なし32ビット整数(リトルエンディアン)の読み込み
template<class Source>
boost::uint32_t read_uint32_little(Source& src);

// 符号付き16ビット整数(リトルエンディアン)の書き出し
template<class Sink>
void read_int16_little(Sink& sink, boost::int16_t n);

// 符号なし32ビット整数(リトルエンディアン)の書き出し
template<class Sink>
void read_uint32_little(Sink& sink, boost::uint32_t);

// hogeの読み込み
template<class Source>
hoge read_hoge(Source& src)
{
    hoge h;
    h.a = read_int16_little(src);
    h.a = read_uint32_little(src);
    return h;
}

// hogeの書き出し
template<class Sink>
void write_hoge(Sink& sink, hoge& h)
{
    write_int16_little(sink, h.a);
    write_uint32_little(sink, h.b);
}

のようなことをやっていて、読み込みと書き出しで似たコードを書くのが面倒だなということでした。
それだけなら、Boost.Serializationの、

namespace boost { namespace serialization {
    // 読み書き両用
    template<class Archive>
    void serialize(Archive& ar, ::hoge& h, const unsigned int)
    {
        ar & h.a & h.b;
    }
} }

というやり方も考えられるわけです。


それでもそうならなかったのは、Boost.Serializationではエンディアンやパディングといった情報を扱えなかったからです。
これはBoost.SerializationがC++のオブジェクトを正確に保存/復元することに焦点を当てているためで、シリアライズされたアーカイブはどんな形式でも良いわけです。


Hamigaki.Binaryの場合は逆です。
まずフォーマットありきで、C++オブジェクトはどんな形でもよいのです。
ここにHamigaki.Binaryの存在意義があるのでしょうね。