hamigaki::uuid

実装用クラスを別ファイルに切り出す作業を続行中です。
今日は、GUIDのパースとフォーマットを行うクラスを切り出しました。
http://hamigaki.sourceforge.jp/hamigaki/uuid.hpp
GUID(グイード)はMS用語なので、より広い意味でUUIDを名前にしています。

class uuid : boost::totally_ordered<uuid>
{
public:
    uuid();

    explicit uuid(const char* s);

    bool operator<(const uuid& rhs) const
    {
        return data_ < rhs.data_;
    }

    bool operator==(const uuid& rhs) const
    {
        return data_ == rhs.data_;
    }

    std::size_t size() const
    {
        return data_.size();
    }

    const boost::uint8_t operator[](std::size_t idx) const
    {
        return data_[idx];
    }

    // xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 形式
    std::string to_string() const;

    // {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} 形式
    std::string to_guid_string() const;

private:
    boost::array<boost::uint8_t,16> data_;
};

あと、WindowsのGUID構造体との相互変換もしたいのですね。
データをuint8_tの配列で持っているので、memcpy()するとエンディアンが狂います。
さらに、windows.hをインクルードしたくないのでやっかいです。
guiddef.hでは、

typedef struct _GUID {
    unsigned long  Data1;
    unsigned short Data2;
    unsigned short Data3;
    unsigned char  Data4[ 8 ];
} GUID;

となっているので、struct _GUIDの前方宣言で逃げますかね。


一応、Boost VaultにBoostでの実装があります。こちらはGUIDの生成に焦点がいってる感じです。
ほかに参考にしたのはこの辺り。
http://www.linux.or.jp/JM/html/e2fsprogs/man3/uuid.3.html
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/UUID.html
JDKのページからリンクしてあるインターネットドラフトはInternet Archiveから読めます。