タイトルの通り、数値をリングバッファ化して管理してくれるクラスをつくりました。
↓使用例です
► スポイラーを表示
#include
using namespace std;
void main(){
rbuf rb(5); //0~5をリングバッファ化する。初期値は0
rb += 10; //カウントを10進ませる
cout
class rbuf{
size_t count;
size_t maxNum;
long beg;
public:
rbuf(){}
void init(long rnum){
beg = 0;
maxNum = abs(rnum)+1;
count = 0;
}
rbuf(long rnum){ init(rnum); }
void init(long rbeg, long rend){
beg = rbeg;
maxNum = abs(rend - beg)+1;
count = beg;
}
rbuf(long rbeg, long rend){ init(rbeg, rend); }
long num(){ return count; }
long operator=(long rnum){
count -= beg;
if(rnum >= 0){
count = rnum;
count %= maxNum;
}
else{
long corrected = rnum % maxNum;
count = maxNum + corrected;
}
return count += beg;
}
long operator+=(long rnum){
count -= beg;
if(rnum >= 0){
count += rnum;
count %= maxNum;
}
else{
long corrected = -(-rnum % (long)maxNum);
count += maxNum + corrected;
count %= maxNum;
}
return count += beg;
}
long operator-=(long rnum){
*this += -rnum;
return num();
}
//前置きインクリメント
long operator++(){
*this += 1;
return num();
}
//後置きインクリメント
long operator++(int){
long answer = num();
*this += 1;
return answer;
}
//前置きデクリメント
long operator--(){
*this -= 1;
return num();
}
//後置きデクリメント
long operator--(int){
long answer = num();
*this -= 1;
return answer;
}
template
X operator+(X rnum){ return num() + rnum; }
template
X operator-(X rnum){ return num() - rnum; }
template
X operator*(X rnum){ return num() * rnum; }
template
X operator/(X rnum){ return num() / rnum; }
template
X operator%(X rnum){ return num() % rnum; }
template
bool operator==(X rnum){
if(num() == rnum) return true;
return false;
}
template
bool operator!=(X rnum){
if(num() != rnum) return true;
return false;
}
template
bool operator
bool operator>=(X rnum){
if(num() >= rnum) return true;
return false;
}
template
bool operator
bool operator>(X rnum){
if(num() > rnum) return true;
return false;
}
operator char (){ return (char)num(); }
operator short (){ return (short)num(); }
operator int (){ return (int)num(); }
operator long (){ return (long)num(); }
operator float (){ return (float)num(); }
operator double (){ return (double)num(); }
operator unsigned char (){ return (unsigned char)num(); }
operator unsigned short (){ return (unsigned short)num(); }
operator unsigned int (){ return (unsigned int)num(); }
operator unsigned long (){ return (unsigned long)num(); }
};
バグなどございましたらご報告いただけると幸いです。
では、良いプログラミングライフを。