指定範囲をループするint型

最近ネタ不足で、何かないかと自分のライブラリを眺めてます。
そこからの出展で内容はタイトルの通りです。
つまりこういうものです。


Counter i;
i.Set(0,3);     // min=0、max=3

for(;;) {
    out(i++);
}

実行結果
0 1 2 3 0 1 2 3...

5を足すと一周して1 2 3 0 1で1となります。
逆向きも可です。(i--, 0 3 2 1 0 3 2 1 0...
実装してみます。


差分計算の+1、*部分の-1がミソです。


/**
    m_nMin→最小値
    m_nMax→最大値
    m_nCount→現在値
*/

void Counter::Set(int nMin, int nMax)
{
    if (nMin > nMax) {
        // nMinとnMaxをswap
        ...
    }

    m_nCount = m_nMin = nMin;
    m_nMax   = nMax;
    m_nDiff  = (m_nMax - m_nMin) + 1;
}

// 値が変わるごとに呼ぶ
void Counter::MinMax()
{
    // 最小値と比較
    if (m_nCount < m_nMin) {
        m_nCount = m_nMax - ((m_nMin - m_nCount - 1) % m_nDiff);// *
        return ;
    }
    // 最大値と比較
    if (m_nCount > m_nMax) {
        m_nCount = m_nMin + ((m_nCount - m_nMax - 1) % m_nDiff);// *
        return ;
    }
}


検証コード


Counter i;
i.Set(-1,8);
i = -1;
i += 1503;

i == 2

                                                        • -

i = -1;
i -= 1503;

i == 6


ソースコードはこちら
Counter.h
Counter.cpp


差分で剰余した結果を加減算してます。
ただ単に一行で書きたかっただけなんですが(*゜ω゜)