From c09a4f39f742a94b150cad6a3fb0bbbfbb99e495 Mon Sep 17 00:00:00 2001 From: Adrian Kummerlaender Date: Fri, 24 Mar 2017 22:47:19 +0100 Subject: Switch to toroidial world matrix i.e. glue together top and bottom respectively right hand side and left hand side borders. This makes for nicer life behaviour in constrained worlds. --- src/util/torus_array.h | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/util/torus_array.h (limited to 'src/util') 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 +#include + +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, HEIGHT> matrix_; + +}; + +} +} + +#endif // LIFE_SRC_UTIL_TORUS_ARRAY_ -- cgit v1.2.3