aboutsummaryrefslogtreecommitdiff
path: root/src/util
diff options
context:
space:
mode:
Diffstat (limited to 'src/util')
-rw-r--r--src/util/torus_array.h52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/util/torus_array.h b/src/util/torus_array.h
new file mode 100644
index 0000000..bef0c9f
--- /dev/null
+++ b/src/util/torus_array.h
@@ -0,0 +1,52 @@
+#ifndef LIFE_SRC_UTIL_TORUS_ARRAY_
+#define LIFE_SRC_UTIL_TORUS_ARRAY_
+
+#include <array>
+#include <cstdint>
+
+namespace life {
+namespace util {
+
+template<
+ typename TYPE,
+ std::size_t WIDTH,
+ std::size_t HEIGHT
+>
+class TorusArray {
+ static std::size_t toMatrixColumn(const std::ptrdiff_t x) {
+ if ( x >= 0 ) {
+ return x % WIDTH;
+ } else {
+ return WIDTH - ( std::abs(x) % WIDTH );
+ }
+ }
+
+ static std::size_t toMatrixRow(const std::ptrdiff_t y) {
+ if ( y >= 0 ) {
+ return y % HEIGHT;
+ } else {
+ return HEIGHT - ( std::abs(y) % HEIGHT );
+ }
+ }
+
+ public:
+ static const std::size_t width = WIDTH;
+ static const std::size_t height = HEIGHT;
+
+ TYPE get(const std::ptrdiff_t x, const std::ptrdiff_t y) const {
+ return this->matrix_[toMatrixRow(y)][toMatrixColumn(x)];
+ }
+
+ void set(const std::ptrdiff_t x, const std::ptrdiff_t y, TYPE&& value) {
+ this->matrix_[toMatrixRow(y)][toMatrixColumn(x)] = value;
+ }
+
+ private:
+ std::array<std::array<TYPE, WIDTH>, HEIGHT> matrix_;
+
+};
+
+}
+}
+
+#endif // LIFE_SRC_UTIL_TORUS_ARRAY_