//================================================================================================== /* ROTGEN - Runtime Overlay for Eigen Copyright : CODE RECKONS SPDX-License-Identifier: BSL-1.0 */ //================================================================================================== #include #include "unit/tests.hpp" #include #include auto generate_data(int rows, int cols) { std::vector buffer(rows * cols * 3); for (size_t i = 0; i < buffer.size(); ++i) buffer[i] = static_cast(1 + i); return buffer; } template using r_mat_t = rotgen::matrix; template using e_mat_t = Eigen::Matrix; template> using r_map_t = rotgen::map; template> using e_map_t = Eigen::Map; TTS_CASE("Validate Column Major Map with regular stride behavior") { auto rows = 3; auto cols = 4; auto buffer = generate_data(rows, cols); r_map_t> r_map(buffer.data(), rows, cols); TTS_EQUAL(innerStride(r_map), 1); TTS_EQUAL(outerStride(r_map), 3); e_map_t> e_map(buffer.data(), rows, cols); for (std::ptrdiff_t r = 0; r < rows; r++) for (std::ptrdiff_t c = 0; c < cols; c++) TTS_EQUAL(r_map(r, c), e_map(r, c)); }; TTS_CASE("Validate Column Major Map with specific outer stride behavior") { auto rows = 3; auto cols = 4; auto buffer = generate_data(rows, cols); r_map_t, rotgen::outer_stride<>> r_map( buffer.data(), rows, cols, rotgen::outer_stride<>(rows + 1)); TTS_EQUAL(innerStride(r_map), 1); TTS_EQUAL(outerStride(r_map), 4); e_map_t, Eigen::OuterStride<>> e_map( buffer.data(), rows, cols, Eigen::OuterStride<>(rows + 1)); for (std::ptrdiff_t r = 0; r < rows; r++) for (std::ptrdiff_t c = 0; c < cols; c++) TTS_EQUAL(r_map(r, c), e_map(r, c)); }; TTS_CASE("Validate Column Major Map with specific inner stride behavior") { auto rows = 3; auto cols = 4; auto buffer = generate_data(rows, cols); r_map_t, rotgen::dynamic_stride> r_map( buffer.data(), rows, cols, rotgen::dynamic_stride(rows, 2)); TTS_EQUAL(innerStride(r_map), 2); TTS_EQUAL(outerStride(r_map), 3); e_map_t, Eigen::Stride> e_map(buffer.data(), rows, cols, Eigen::Stride(rows, 2)); for (std::ptrdiff_t r = 0; r < rows; r++) for (std::ptrdiff_t c = 0; c < cols; c++) TTS_EQUAL(r_map(r, c), e_map(r, c)); }; TTS_CASE("Validate Row Major Map with regular stride behavior") { auto rows = 3; auto cols = 4; auto buffer = generate_data(rows, cols); r_map_t> r_map(buffer.data(), rows, cols); TTS_EQUAL(innerStride(r_map), 1); TTS_EQUAL(outerStride(r_map), 4); e_map_t> e_map(buffer.data(), rows, cols); for (std::ptrdiff_t r = 0; r < rows; r++) for (std::ptrdiff_t c = 0; c < cols; c++) TTS_EQUAL(r_map(r, c), e_map(r, c)); }; TTS_CASE("Validate Row Major Map with specific outer stride behavior") { auto rows = 3; auto cols = 4; auto buffer = generate_data(rows, cols); r_map_t, rotgen::outer_stride<>> r_map( buffer.data(), rows, cols, rotgen::outer_stride<>(cols + 1)); TTS_EQUAL(innerStride(r_map), 1); TTS_EQUAL(outerStride(r_map), 5); e_map_t, Eigen::OuterStride<>> e_map( buffer.data(), rows, cols, Eigen::OuterStride<>(cols + 1)); for (std::ptrdiff_t r = 0; r < rows; r++) for (std::ptrdiff_t c = 0; c < cols; c++) TTS_EQUAL(r_map(r, c), e_map(r, c)); }; TTS_CASE("Validate Row Major Map with specific inner stride behavior") { auto rows = 3; auto cols = 4; auto buffer = generate_data(rows, cols); r_map_t, rotgen::dynamic_stride> r_map( buffer.data(), rows, cols, rotgen::dynamic_stride(2, cols)); TTS_EQUAL(innerStride(r_map), 4); TTS_EQUAL(outerStride(r_map), 2); e_map_t, Eigen::Stride> e_map(buffer.data(), rows, cols, Eigen::Stride(2, cols)); for (std::ptrdiff_t r = 0; r < rows; r++) for (std::ptrdiff_t c = 0; c < cols; c++) TTS_EQUAL(r_map(r, c), e_map(r, c)); };