From 3a3c9967ac079bf15ac0cea7ff52c040c9764392 Mon Sep 17 00:00:00 2001 From: Vegard Storheil Eriksen Date: Sat, 27 Nov 2010 07:21:21 +0100 Subject: Added CyclicInt convenience class. --- common/cyclicint.h | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 common/cyclicint.h (limited to 'common') 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 +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 -- cgit v1.2.3