![]() |
次の構造体は、Microsoft Windowsのddsファイルで用いられるDDPIXELFORMAT
構造体である。
typedef struct _DDPIXELFORMAT { DWORD dwSize; DWORD dwFlags; DWORD dwFourCC; union { DWORD dwRGBBitCount; DWORD dwYUVBitCount; DWORD dwZBufferBitDepth; DWORD dwAlphaBitDepth; DWORD dwLuminanceBitCount; DWORD dwBumpBitCount; }; union { DWORD dwRBitMask; DWORD dwYBitMask; DWORD dwStencilBitDepth; DWORD dwLuminanceBitMask; DWORD dwBumpDuBitMask; }; union { DWORD dwGBitMask; DWORD dwUBitMask; DWORD dwZBitMask; DWORD dwBumpDvBitMask; }; union { DWORD dwBBitMask; DWORD dwVBitMask; DWORD dwStencilBitMask; DWORD dwBumpLuminanceBitMask; }; union { DWORD dwRGBAlphaBitMask; DWORD dwYUVAlphaBitMask; DWORD dwLuminanceAlphaBitMask; DWORD dwRGBZBitMask; DWORD dwYUVZBitMask; }; } DDPIXELFORMAT;
DDPIXELFORMAT
構造体では、タグ名のない共用体が使われているため、dwRGBBitCount
などのメンバポインタを取得できない。
このような場合は、member
の代わりに次のようなカスタムメンバを用意することで対処できる。
struct dd_pixel_format_u1 { typedef ::DDPIXELFORMAT struct_type; typedef ::DWORD member_type; static const hamigaki::endianness endian = hamigaki::little; // binary_read()用 ::DWORD& operator()(::DDPIXELFORMAT& x) const { return x.dwRGBBitCount; } // binary_write()用 ::DWORD operator()(const ::DDPIXELFORMAT& x) const { return x.dwRGBBitCount; } }; namespace hamigaki { template<> struct member_size< ::dd_pixel_format_u1> : boost::mpl::size_t<4> {}; } // namespace hamigaki
ここで、struct_type
は構造体の型、member_type
はフィールドの型、endian
は出力時のエンディアンである。2つの関数呼出し演算子は、入出力の際にメンバへアクセスするために用いられる。
また、カスタムメンバにはメタ関数member_size
の特殊化を用意しなければいけない。member_size
は、member
やカスタムメンバを引数として、そのメンバのバイナリサイズをboost::mpl::size_t
で返すメタ関数である。
こうして用意したカスタムメンバはmember
やpadding
と同様にstruct_traits
でmembers
の要素として用いることができる。
製作著作 © 2006, 2007 Takeshi Mouri |