modNum

とっさに書いた。今お持ち帰り環境が無いのでここにメモ。
リングバッファのポインタの差計算で毎回あちこちで moduloとるのがアホらしくなった為。

template <int _mod = 10>
class modNum {
    int a;
public:
    modNum(int val = 0) : a(val){}


    static int normalize(int a) {
	return (a < 0) ? _mod + (a % _mod) : a % _mod;
    }

    modNum& operator ++() {
	a = normalize(a+1);
	return *this;
    }
    modNum& operator --() {
	a = normalize(a-1);
	return *this;
    }

    modNum& operator +(int b) {
	return *(new modNum<_mod>( normalize(a+b)));
    }

    modNum& operator -(int b) { 
	return *(new modNum<_mod>( normalize(a-b)));
    }

    modNum& operator *(int b) { 
	return *(new modNum<_mod>( normalize(a*b)));
    }

    modNum& operator /(int b) { 
	return *(new modNum<_mod>( normalize(a/b)));
    }

    modNum& operator =(const modNum& b) {
	a = normalize(b.a);
	return *this;
    }

    modNum& operator =(const int b) {
	a = normalize(b);
	return *this;
    }
    operator int() {
	return a;
    }
};