From 78a29431b1d45ac7dfdf57febe081728e7237ac1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 13 Jan 2020 21:13:20 +0100 Subject: [PATCH] MeshTools: duplicateInto() taking also type-erased indices. --- src/Magnum/MeshTools/Duplicate.cpp | 12 +++++ src/Magnum/MeshTools/Duplicate.h | 11 ++++ src/Magnum/MeshTools/Test/DuplicateTest.cpp | 60 ++++++++++++++++++++- 3 files changed, 82 insertions(+), 1 deletion(-) diff --git a/src/Magnum/MeshTools/Duplicate.cpp b/src/Magnum/MeshTools/Duplicate.cpp index 8d2d076b1..a640755be 100644 --- a/src/Magnum/MeshTools/Duplicate.cpp +++ b/src/Magnum/MeshTools/Duplicate.cpp @@ -61,4 +61,16 @@ void duplicateInto(const Containers::StridedArrayView1D& indi duplicateIntoImplementation(indices, data, out); } +void duplicateInto(const Containers::StridedArrayView2D& indices, const Containers::StridedArrayView2D& data, const Containers::StridedArrayView2D& out) { + CORRADE_ASSERT(indices.isContiguous<1>(), "MeshTools::duplicateInto(): second index view dimension is not contiguous", ); + if(indices.size()[1] == 4) + return duplicateIntoImplementation(Containers::arrayCast<1, const UnsignedInt>(indices), data, out); + else if(indices.size()[1] == 2) + return duplicateIntoImplementation(Containers::arrayCast<1, const UnsignedShort>(indices), data, out); + else { + CORRADE_ASSERT(indices.size()[1] == 1, "MeshTools::duplicateInto(): expected index type size 1, 2 or 4 but got" << indices.size()[1], ); + return duplicateIntoImplementation(Containers::arrayCast<1, const UnsignedByte>(indices), data, out); + } +} + }} diff --git a/src/Magnum/MeshTools/Duplicate.h b/src/Magnum/MeshTools/Duplicate.h index 94d736aa0..8b58cd13d 100644 --- a/src/Magnum/MeshTools/Duplicate.h +++ b/src/Magnum/MeshTools/Duplicate.h @@ -115,6 +115,17 @@ MAGNUM_MESHTOOLS_EXPORT void duplicateInto(const Containers::StridedArrayView1D< */ MAGNUM_MESHTOOLS_EXPORT void duplicateInto(const Containers::StridedArrayView1D& indices, const Containers::StridedArrayView2D& data, const Containers::StridedArrayView2D& out); +/** +@brief Duplicate type-erased data using a type-erased index array into given output array +@m_since_latest + +Expects that the second dimension of @p indices is contiguous and represents +the actual 1/2/4-byte index type. Based on its size then calls one of the +@ref duplicateInto(const Containers::StridedArrayView1D&, const Containers::StridedArrayView2D&, const Containers::StridedArrayView2D&) +etc. overloads. +*/ +MAGNUM_MESHTOOLS_EXPORT void duplicateInto(const Containers::StridedArrayView2D& indices, const Containers::StridedArrayView2D& data, const Containers::StridedArrayView2D& out); + template inline void duplicateInto(const Containers::StridedArrayView1D& indices, const Containers::StridedArrayView1D& data, const Containers::StridedArrayView1D& out) { duplicateInto(indices, Containers::arrayCast<2, const char>(data), Containers::arrayCast<2, char>(out)); } diff --git a/src/Magnum/MeshTools/Test/DuplicateTest.cpp b/src/Magnum/MeshTools/Test/DuplicateTest.cpp index 38f7650df..a715b4239 100644 --- a/src/Magnum/MeshTools/Test/DuplicateTest.cpp +++ b/src/Magnum/MeshTools/Test/DuplicateTest.cpp @@ -47,6 +47,10 @@ struct DuplicateTest: TestSuite::Tester { template void duplicateIntoErased(); void duplicateIntoErasedWrongTypeSize(); void duplicateIntoErasedNonContiguous(); + + template void duplicateErasedIndicesIntoErased(); + void duplicateErasedIndicesIntoErasedNonContiguous(); + void duplicateErasedIndicesIntoErasedWrongTypeSize(); }; DuplicateTest::DuplicateTest() { @@ -61,7 +65,13 @@ DuplicateTest::DuplicateTest() { &DuplicateTest::duplicateIntoErased, &DuplicateTest::duplicateIntoErased, &DuplicateTest::duplicateIntoErasedWrongTypeSize, - &DuplicateTest::duplicateIntoErasedNonContiguous}); + &DuplicateTest::duplicateIntoErasedNonContiguous, + + &DuplicateTest::duplicateErasedIndicesIntoErased, + &DuplicateTest::duplicateErasedIndicesIntoErased, + &DuplicateTest::duplicateErasedIndicesIntoErased, + &DuplicateTest::duplicateErasedIndicesIntoErasedNonContiguous, + &DuplicateTest::duplicateErasedIndicesIntoErasedWrongTypeSize}); } void DuplicateTest::duplicate() { @@ -162,6 +172,54 @@ void DuplicateTest::duplicateIntoErasedNonContiguous() { "MeshTools::duplicateInto(): second view dimension is not contiguous\n"); } +template void DuplicateTest::duplicateErasedIndicesIntoErased() { + setTestCaseTemplateName(Math::TypeTraits::name()); + + constexpr T indices[]{1, 1, 0, 3, 2, 2}; + constexpr Int data[]{-7, 35, 12, -18}; + Int output[6]; + + MeshTools::duplicateInto( + Containers::arrayCast<2, const char>(Containers::stridedArrayView(indices)), + Containers::arrayCast<2, const char>(Containers::stridedArrayView(data)), + Containers::arrayCast<2, char>(Containers::stridedArrayView(output))); + CORRADE_COMPARE_AS(Containers::arrayView(output), + Containers::arrayView({35, 35, -7, -18, 12, 12}), + TestSuite::Compare::Container); +} + +void DuplicateTest::duplicateErasedIndicesIntoErasedWrongTypeSize() { + constexpr char indices[6*3]{}; + constexpr Int data[]{-7, 35, 12, -18}; + Short output[6]; + + std::ostringstream out; + Error redirectError{&out}; + + MeshTools::duplicateInto( + Containers::StridedArrayView2D{indices, {6, 3}}.every(2), + Containers::arrayCast<2, const char>(Containers::stridedArrayView(data)), + Containers::arrayCast<2, char>(Containers::stridedArrayView(output))); + CORRADE_COMPARE(out.str(), + "MeshTools::duplicateInto(): expected index type size 1, 2 or 4 but got 3\n"); +} + +void DuplicateTest::duplicateErasedIndicesIntoErasedNonContiguous() { + constexpr char indices[3*6]{}; + constexpr Int data[]{-7, 35, 12, -18}; + Short output[6]; + + std::ostringstream out; + Error redirectError{&out}; + + MeshTools::duplicateInto( + Containers::StridedArrayView2D{indices, {3, 3}, {6, 2}}, + Containers::arrayCast<2, const char>(Containers::stridedArrayView(data)).every({1, 2}), + Containers::arrayCast<2, char>(Containers::stridedArrayView(output))); + CORRADE_COMPARE(out.str(), + "MeshTools::duplicateInto(): second index view dimension is not contiguous\n"); +} + }}}} CORRADE_TEST_MAIN(Magnum::MeshTools::Test::DuplicateTest)