//================================================================================================== /* ROTGEN - Runtime Overlay for Eigen Copyright : CODE RECKONS SPDX-License-Identifier: BSL-1.0 */ //================================================================================================== #include #include "unit/tests.hpp" using row_matrixXf = rotgen::matrix; template void check_acceptance(Generator f) { auto in = f(); rotgen::matrixXf data; bool verbose = ::tts::arguments()[{"--verbose"}]; auto acceptor = [&](rotgen::ref v, auto ptr) { // Check that ref is not a copy TTS_EQUAL(v.data(), ptr); // Setup the data correctly data.resize(v.rows(), v.cols()); rotgen::setRandom(data); // Assign through the ref v = data; if (verbose) std::cout << "V:\n" << v << std::endl << std::endl; }; auto constant_acceptor = [&](rotgen::ref v) { return minCoeff(v); }; acceptor(in, in.data()); data.resize(in.rows(), in.cols()); TTS_EQUAL(in, data); TTS_EQUAL(constant_acceptor(in), minCoeff(data)) << in << "\n" << data << "\n"; } TTS_CASE_TPL("Assert ref construction rules - Vector cases", rotgen::vectorXf, rotgen::vector2f, rotgen::row_vectorXf, rotgen::row_vector2f) (::tts::type) { TTS_WHEN("Call a function accepting a ref<" << ::tts::typename_ << "> ...") { rotgen::matrixXf mc(2, 1); rotgen::vectorXf vc(2); rotgen::matrixXf mr(1, 2); row_matrixXf mrr(1, 2); rotgen::row_vectorXf vr(2); rotgen::vector2f vcf; rotgen::row_vector2f vrf; TTS_AND_THEN("with a vector-like matrix") { check_acceptance([&]() { return mc; }); check_acceptance([&]() { return vc; }); check_acceptance([&]() { return mr; }); check_acceptance([&]() { return mrr; }); check_acceptance([&]() { return vr; }); check_acceptance([&]() { return vcf; }); check_acceptance([&]() { return vrf; }); } TTS_AND_THEN("with a vector-like block") { check_acceptance([&]() { return rotgen::head(vc, 2); }); check_acceptance([&]() { return rotgen::head(vr, 2); }); check_acceptance([&]() { return rotgen::head(vcf, 2); }); check_acceptance([&]() { return rotgen::head(vrf, 2); }); check_acceptance([&]() { return rotgen::head<2>(vc); }); check_acceptance([&]() { return rotgen::head<2>(vr); }); check_acceptance([&]() { return rotgen::head<2>(vcf); }); check_acceptance([&]() { return rotgen::head<2>(vrf); }); } TTS_AND_THEN("with a vector-like map") { rotgen::map mmc(vc.data(), 2, 1); rotgen::map mmr(vc.data(), 1, 2); rotgen::map mmrr(vc.data(), 1, 2); rotgen::map mvc(vc.data(), vc.size()); rotgen::map mvr(vr.data(), vr.size()); rotgen::map mvcf(vc.data()); rotgen::map mvrf(vr.data()); check_acceptance([&]() { return mmc; }); check_acceptance([&]() { return mvc; }); check_acceptance([&]() { return mvr; }); check_acceptance([&]() { return mmr; }); check_acceptance([&]() { return mmrr; }); check_acceptance([&]() { return mvcf; }); check_acceptance([&]() { return mvrf; }); } TTS_AND_THEN("with a vector-like ref") { rotgen::ref mmrr(mrr); rotgen::ref mvc(mc); rotgen::ref mvr(mc); rotgen::ref mvcf(mc); rotgen::ref mvrf(mc); check_acceptance([&]() { return mvc; }); check_acceptance([&]() { return mvr; }); check_acceptance([&]() { return mmrr; }); check_acceptance([&]() { return mvcf; }); check_acceptance([&]() { return mvrf; }); } } }; TTS_CASE("Assert ref construction rules Matrix cases") { using MatC = rotgen::matrix; using MatR = rotgen::matrix; TTS_WHEN("Call a function accepting a ref<" << ::tts::typename_ << "> ...") { rotgen::matrixXf mc(2, 1); rotgen::matrixXf mr(1, 2); rotgen::matrixXf mn(4, 2); row_matrixXf mnr(4, 2); rotgen::matrix mcf(2, 1); rotgen::matrix mrf(1, 2); rotgen::matrix mnf(4, 2); TTS_AND_THEN("with a matrix") { check_acceptance([&]() { return mc; }); check_acceptance([&]() { return mr; }); check_acceptance([&]() { return mn; }); check_acceptance([&]() { return mcf; }); check_acceptance([&]() { return mrf; }); check_acceptance([&]() { return mnf; }); TTS_EXPECT_COMPILES(mnr, { rotgen::ref{mnr}; }); } TTS_AND_THEN("with a map") { rotgen::map mmc(mc.data(), 2, 1); rotgen::map mmr(mc.data(), 1, 2); rotgen::map mmrr(mc.data(), 1, 2); rotgen::map mmnr(mnr.data(), 4, 2); rotgen::map mvc(mc.data(), mc.size()); rotgen::map mvr(mr.data(), mr.size()); rotgen::map mvcf(mc.data()); rotgen::map mvrf(mr.data()); check_acceptance([&]() { return mmc; }); check_acceptance([&]() { return mmr; }); check_acceptance([&]() { return mvc; }); check_acceptance([&]() { return mvr; }); check_acceptance([&]() { return mvcf; }); check_acceptance([&]() { return mvrf; }); TTS_EXPECT_COMPILES(mmnr, { rotgen::ref{mmnr}; }); TTS_EXPECT_COMPILES(mmrr, { rotgen::ref{mmrr}; }); } } TTS_WHEN("Call a function accepting a ref<" << ::tts::typename_ << "> ...") { row_matrixXf mc(2, 1); row_matrixXf mr(1, 2); row_matrixXf mn(4, 2); rotgen::matrix mcf(2, 1); rotgen::matrix mrf(1, 2); rotgen::matrix mnf(4, 2); TTS_AND_THEN("with a matrix") { check_acceptance([&]() { return mc; }); check_acceptance([&]() { return mr; }); check_acceptance([&]() { return mn; }); check_acceptance([&]() { return mcf; }); check_acceptance([&]() { return mrf; }); check_acceptance([&]() { return mnf; }); } } };