テンプレートのサンプルと簡単なRaw画像操作クラス

#include <assert.h>

// テンプレートクラス定義
template<class T>
class CBinaryImageImp
{
public:
    // このクラスの実際の型
    typedef T type;

    // 定数値をコンパイル時に決定する
    enum { max_val = (1 << (sizeof(T) * 8)) -1 };

    CBinaryImageImp(T* d, int w, int h) 
        : _d(d), _w(w), _h(h) {}

    // ピクセル値の取得と設定
    T Get(int x, int y);
    void Set(int x, int y, T v);
protected:
    T* _d;
    int _w;
    int _h;
};

// テンプレートクラスメソッド
template<class T>
T CBinaryImageImp<T>::Get(int x, int y)

    return _d[_w * y + x]; 
}

template<class T>
void CBinaryImageImp<T>::Set(int x, int y, T v)

    _d[_w * y + x] = v; 
}

// 型定義
typedef CBinaryImageImp<unsigned char>    CBinaryImage8;
typedef CBinaryImageImp<unsigned short>    CBinaryImage16;

// テストコード
void test_CTypedImage8() 
{
    int w = 100;
    int h = 100;
    int size = sizeof(CBinaryImage8::type);
    assert(size == 1);
    int max = CBinaryImage8::max_val;
    // テンプレートクラスの実際の型と定数値を利用可能
    CBinaryImage8::type* data = new CBinaryImage8::type[w*h];
    memset(data, 0, w*h);
    CBinaryImage8 image(data, w, h);
    for(int y=0; y<h; y++)
    {
        for(int x=0; x<w; x++)
        {
            int v = x * y;
            image.Set(x, y, v);
            assert(image.Get(x, y) == (v & max));
        }
    }
    delete [] data;
}

void test_CTypedImage16() 
{
    int w = 1000;
    int h = 1000;
    int size = sizeof(CBinaryImage16::type);
    assert(size == 2);
    int max = CBinaryImage16::max_val;
    // テンプレートクラスの実際の型と定数値を利用可能
    CBinaryImage16::type* data = new CBinaryImage16::type[w*h];
    memset(data, 0, w*h);
    CBinaryImage16 image(data, w, h);
    for(int y=0; y<h; y++)
    {
        for(int x=0; x<w; x++)
        {
            int v = x * y;
            image.Set(x, y, v);
            assert(image.Get(x, y) == (v & max));
        }
    }    
    delete [] data;
}

[PR]
by isoq | 2006-08-25 11:55 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇
<< ドラビアブログと大人のためのド... ミステリーサークル >>