#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_