指定範囲をループするint型
最近ネタ不足で、何かないかと自分のライブラリを眺めてます。
そこからの出展で内容はタイトルの通りです。
つまりこういうものです。
Counter i;
i.Set(0,3); // min=0、max=3for(;;) {
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
差分で剰余した結果を加減算してます。
ただ単に一行で書きたかっただけなんですが(*゜ω゜)