GILのpixelのコードが凄い

たかがpixelでもジェネリックなコードにすると必然とこうなるのかという.
mpl::vectorとmpl::range_cを色空間とメモリレイアウトの指定の為に利用していて関心した.
mplのコンテナ類は全然勉強していないのだけれど,凄く便利そうだな.

struct red_t {};
struct green_t {};
struct blue_t {};

// 色空間モデル
typedef mpl::vector3<ret_t, green_t, blue_t> rgb_t;

// RGB色空間でメモリレイアウトはRGB
typedef layout<rgb_t> rgb_layout_t;

// RGB色空間でメモリレイアウトはBGR
typedef layout<rgb_t, mpl::vector3_c<int, 2, 1, 0> > bgr_layout_t;

// layoutクラスの定義
template <
    typename ColorSpace, 
    typename ChannelMapping = mpl::range_c<int, 0, mpl::size<ColorSpace>::value> >
struct layout{
    typedef ColorSpace color_space_t;
    typedef ChannelMapping channel_mapping_t;
};

これを元にして色空間が同じピクセルのレイアウトの違いを吸収するようにしている.

それ以外に,例えば各チャンネルの要素をコピーするのにループを使うと遅くなるのでコンパイル再帰でコードを生成していたりといろんなテクニックを使っている.

すごく勉強になるので,最初はそのまま使っちゃおうと思ってたけれど自分で一から書いてみよう.