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; };
これを元にして色空間が同じピクセルのレイアウトの違いを吸収するようにしている.
それ以外に,例えば各チャンネルの要素をコピーするのにループを使うと遅くなるのでコンパイル時再帰でコードを生成していたりといろんなテクニックを使っている.
すごく勉強になるので,最初はそのまま使っちゃおうと思ってたけれど自分で一から書いてみよう.