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から読めます。