diff options
Diffstat (limited to 'common')
-rw-r--r-- | common/cyclicint.h | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/common/cyclicint.h b/common/cyclicint.h new file mode 100644 index 0000000..3b24399 --- /dev/null +++ b/common/cyclicint.h @@ -0,0 +1,80 @@ +#ifndef CYCLICINT_H +#define CYCLICINT_H + +//! Class containing an integer which ranges from 0..N-1. +//! +//! Exceeding the ends will overflow to the other end. Implicit cast to/from int is provided. +template<int N> +class CyclicInt { + private: + int value; + + CyclicInt set(int v) { + value = v < N ? v < 0 ? N - -v % N : v : v % N; + return *this; + } + + public: + CyclicInt() { + + } + + CyclicInt(int v) { + set(v); + } + + CyclicInt operator=(int v) { + return set(v); + } + + CyclicInt operator+(CyclicInt v) { + return value + v.value; + } + + CyclicInt operator+(int v) { + return value + v; + } + + CyclicInt operator+=(CyclicInt v) { + return set(value + v.value); + } + + CyclicInt operator++() { + return set(value + 1); + } + + CyclicInt operator++(int) { + int v = value; + set(value + 1); + return v; + } + + CyclicInt operator-(CyclicInt v) { + return value - v.value; + } + + CyclicInt operator-(int v) { + return value - v; + } + + CyclicInt operator-=(CyclicInt v) { + return set(value - v.value); + } + + CyclicInt operator--() { + return set(value - 1); + } + + CyclicInt operator--(int) { + int v = value; + set(value - 1); + return v; + } + + operator int() { + return value; + } +}; + + +#endif |