diff options
Diffstat (limited to 'src/util')
-rw-r--r-- | src/util/torus_array.h | 52 |
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_ |