diff --git a/src/Magnum/Trade/Test/SceneDataTest.cpp b/src/Magnum/Trade/Test/SceneDataTest.cpp index 015f35669..e454ea095 100644 --- a/src/Magnum/Trade/Test/SceneDataTest.cpp +++ b/src/Magnum/Trade/Test/SceneDataTest.cpp @@ -804,16 +804,8 @@ void SceneDataTest::debugFieldFlagsSupersets() { } } -const UnsignedShort RotationMapping2D[3] { - 17, - 35, - 98 -}; -constexpr Complexd RotationField2D[3] { - Complexd{Constantsd::sqrtHalf(), Constantsd::sqrtHalf()}, /* 45° */ - Complexd{1.0, 0.0}, /* 0° */ - Complexd{0.0, 1.0}, /* 90° */ -}; +constexpr UnsignedShort RotationMapping2D[3]{}; +constexpr Complexd RotationField2D[3]{}; void SceneDataTest::constructField() { const UnsignedShort rotationMappingData[3]{}; @@ -843,13 +835,14 @@ void SceneDataTest::constructField() { CORRADE_COMPARE(rotations.fieldData(someArray).stride(), sizeof(Complexd)); CORRADE_COMPARE(rotations.fieldData(someArray).data(), rotationFieldData); - #ifndef CORRADE_MSVC2015_COMPATIBILITY /* Won't bother anymore */ constexpr SceneFieldData crotations{SceneField::Rotation, Containers::arrayView(RotationMapping2D), Containers::arrayView(RotationField2D), SceneFieldFlag::ImplicitMapping}; constexpr SceneField name = crotations.name(); constexpr SceneFieldFlags flags = crotations.flags(); + constexpr std::size_t size = crotations.size(); constexpr SceneMappingType mappingType = crotations.mappingType(); CORRADE_COMPARE(name, SceneField::Rotation); CORRADE_COMPARE(flags, SceneFieldFlag::ImplicitMapping); + CORRADE_COMPARE(size, 3); CORRADE_COMPARE(mappingType, SceneMappingType::UnsignedShort); /* These are not marked constexpr because it'd work only partially, not for string fields (tested in constructFieldOffsetOnlyString()) */ @@ -864,7 +857,6 @@ void SceneDataTest::constructField() { CORRADE_COMPARE(crotations.fieldData().size(), 3); CORRADE_COMPARE(crotations.fieldData().stride(), sizeof(Complexd)); CORRADE_COMPARE(crotations.fieldData().data(), RotationField2D); - #endif } void SceneDataTest::constructFieldDefault() { @@ -999,6 +991,9 @@ void SceneDataTest::constructFieldStringNegativeOffset() { CORRADE_COMPARE(names.stringData(someArray), static_cast(data.nameString)); } +constexpr char ScalingMappingData[3*sizeof(UnsignedLong)]{}; +constexpr char ScalingFieldData[3*sizeof(Vector3)]{}; + void SceneDataTest::constructFieldTypeErased() { const UnsignedLong scalingMappingData[3]{}; const Vector3 scalingFieldData[3]; @@ -1015,6 +1010,30 @@ void SceneDataTest::constructFieldTypeErased() { CORRADE_COMPARE(scalings.fieldData().size(), 3); CORRADE_COMPARE(scalings.fieldData().stride(), sizeof(Vector3)); CORRADE_COMPARE(scalings.fieldData().data(), scalingFieldData); + + constexpr SceneFieldData cscalings{SceneField::Scaling, SceneMappingType::UnsignedLong, Containers::StridedArrayView1D{ScalingMappingData, 3, sizeof(UnsignedLong)}, SceneFieldType::Vector3, Containers::StridedArrayView1D{ScalingFieldData, 3, sizeof(Vector3)}, SceneFieldFlag::OrderedMapping}; + constexpr SceneField name = cscalings.name(); + constexpr SceneFieldFlags flags = cscalings.flags(); + constexpr std::size_t size = cscalings.size(); + constexpr SceneMappingType mappingType = cscalings.mappingType(); + CORRADE_COMPARE(name, SceneField::Scaling); + CORRADE_COMPARE(flags, SceneFieldFlag::OrderedMapping); + CORRADE_COMPARE(size, 3); + CORRADE_COMPARE(mappingType, SceneMappingType::UnsignedLong); + /* These are not marked constexpr because it'd work only partially, not for + string fields (tested in constructFieldTypeErasedString()) */ + CORRADE_COMPARE(cscalings.fieldType(), SceneFieldType::Vector3); + CORRADE_COMPARE(cscalings.fieldArraySize(), 0); + /* These are deliberately not constexpr to save header size a bit -- + compared to SceneField APIs they get used very little and it's mostly + useless in a constexpr context anyway */ + CORRADE_COMPARE(cscalings.mappingType(), SceneMappingType::UnsignedLong); + CORRADE_COMPARE(cscalings.mappingData().size(), 3); + CORRADE_COMPARE(cscalings.mappingData().stride(), sizeof(UnsignedLong)); + CORRADE_COMPARE(cscalings.mappingData().data(), ScalingMappingData); + CORRADE_COMPARE(cscalings.fieldData().size(), 3); + CORRADE_COMPARE(cscalings.fieldData().stride(), sizeof(Vector3)); + CORRADE_COMPARE(cscalings.fieldData().data(), ScalingFieldData); } void SceneDataTest::constructFieldTypeErasedString() { @@ -1060,6 +1079,9 @@ void SceneDataTest::constructFieldTypeErased2D() { CORRADE_COMPARE(rotations.fieldData().size(), 3); CORRADE_COMPARE(rotations.fieldData().stride(), 2*sizeof(Complexd)); CORRADE_COMPARE(rotations.fieldData().data(), rotationFieldView.data()); + + /* 2D type-erased construction is not constexpr due to branching to select + a corresponding SceneMappingType */ } void SceneDataTest::constructFieldTypeErased2DString() { @@ -1083,6 +1105,9 @@ void SceneDataTest::constructFieldTypeErased2DString() { CORRADE_COMPARE(names.fieldData().stride(), 2*sizeof(UnsignedShort)*2); CORRADE_COMPARE(names.fieldData().data(), nameFieldView.data()); CORRADE_COMPARE(names.stringData(), static_cast(nameStringData)); + + /* 2D type-erased construction is not constexpr due to branching to select + a corresponding SceneMappingType */ } void SceneDataTest::constructFieldNonOwningArray() { @@ -1119,6 +1144,33 @@ void SceneDataTest::constructFieldOffsetOnly() { CORRADE_COMPARE_AS(Containers::arrayCast(a.fieldData(data)), Containers::arrayView({{2.0f, 3.0f}, {67.0f, -1.1f}}), TestSuite::Compare::Container); + + constexpr SceneFieldData ca{SceneField::Translation, 2, SceneMappingType::UnsignedShort, offsetof(Data, object), sizeof(Data), SceneFieldType::Vector2, offsetof(Data, translation), sizeof(Data), SceneFieldFlag::ImplicitMapping}; + constexpr SceneField name = ca.name(); + constexpr SceneFieldFlags flags = ca.flags(); + constexpr std::size_t size = ca.size(); + constexpr SceneMappingType mappingType = ca.mappingType(); + CORRADE_COMPARE(name, SceneField::Translation); + CORRADE_COMPARE(flags, SceneFieldFlag::OffsetOnly|SceneFieldFlag::ImplicitMapping); + CORRADE_COMPARE(size, 2); + CORRADE_COMPARE(mappingType, SceneMappingType::UnsignedShort); + /* These are not marked constexpr because it'd work only partially, not for + string fields (tested in constructFieldOffsetOnlyString()) */ + CORRADE_COMPARE(ca.fieldType(), SceneFieldType::Vector2); + CORRADE_COMPARE(ca.fieldArraySize(), 0); + /* These are deliberately not constexpr to save header size a bit -- + compared to SceneField APIs they get used very little and it's mostly + useless in a constexpr context anyway */ + CORRADE_COMPARE(ca.mappingData(data).size(), 2); + CORRADE_COMPARE(ca.mappingData(data).stride(), sizeof(Data)); + CORRADE_COMPARE_AS(Containers::arrayCast(ca.mappingData(data)), + Containers::arrayView({2, 15}), + TestSuite::Compare::Container); + CORRADE_COMPARE(ca.fieldData(data).size(), 2); + CORRADE_COMPARE(ca.fieldData(data).stride(), sizeof(Data)); + CORRADE_COMPARE_AS(Containers::arrayCast(ca.fieldData(data)), + Containers::arrayView({{2.0f, 3.0f}, {67.0f, -1.1f}}), + TestSuite::Compare::Container); } void SceneDataTest::constructFieldOffsetOnlyString() { @@ -1232,18 +1284,27 @@ void SceneDataTest::constructFieldArray() { CORRADE_VERIFY(data.fieldData().data() == offsetFieldData); constexpr SceneFieldData cdata{sceneFieldCustom(34), Containers::arrayView(ArrayOffsetMappingData), Containers::StridedArrayView2D{ArrayOffsetFieldData, {3, 4}}, SceneFieldFlag::OrderedMapping}; - CORRADE_COMPARE(cdata.flags(), SceneFieldFlag::OrderedMapping); - CORRADE_COMPARE(cdata.name(), sceneFieldCustom(34)); - CORRADE_COMPARE(cdata.size(), 3); - CORRADE_COMPARE(cdata.mappingType(), SceneMappingType::UnsignedByte); - CORRADE_COMPARE(cdata.mappingData().size(), 3); - CORRADE_COMPARE(cdata.mappingData().stride(), sizeof(UnsignedByte)); - CORRADE_VERIFY(cdata.mappingData().data() == ArrayOffsetMappingData); + constexpr SceneField name = cdata.name(); + constexpr SceneFieldFlags flags = cdata.flags(); + constexpr std::size_t size = cdata.size(); + constexpr SceneMappingType mappingType = cdata.mappingType(); + CORRADE_COMPARE(name, sceneFieldCustom(34)); + CORRADE_COMPARE(flags, SceneFieldFlag::OrderedMapping); + CORRADE_COMPARE(size, 3); + CORRADE_COMPARE(mappingType, SceneMappingType::UnsignedByte); + /* These are not marked constexpr because it'd work only partially, not for + string fields (tested in constructFieldOffsetOnlyString()) */ CORRADE_COMPARE(cdata.fieldType(), SceneFieldType::Int); CORRADE_COMPARE(cdata.fieldArraySize(), 4); + /* These are deliberately not constexpr to save header size a bit -- + compared to SceneField APIs they get used very little and it's mostly + useless in a constexpr context anyway */ + CORRADE_COMPARE(cdata.mappingData().size(), 3); + CORRADE_COMPARE(cdata.mappingData().stride(), sizeof(UnsignedByte)); + CORRADE_COMPARE(cdata.mappingData().data(), ArrayOffsetMappingData); CORRADE_COMPARE(cdata.fieldData().size(), 3); CORRADE_COMPARE(cdata.fieldData().stride(), 4*sizeof(Int)); - CORRADE_VERIFY(cdata.fieldData().data() == ArrayOffsetFieldData); + CORRADE_COMPARE(cdata.fieldData().data(), ArrayOffsetFieldData); } void SceneDataTest::constructFieldArrayTypeErased() { @@ -1263,6 +1324,29 @@ void SceneDataTest::constructFieldArrayTypeErased() { CORRADE_COMPARE(data.fieldData().size(), 3); CORRADE_COMPARE(data.fieldData().stride(), 4*sizeof(Int)); CORRADE_VERIFY(data.fieldData().data() == offsetFieldData); + + constexpr SceneFieldData cdata{sceneFieldCustom(34), SceneMappingType::UnsignedByte, Containers::StridedArrayView1D{ArrayOffsetMappingData}, SceneFieldType::Int, Containers::StridedArrayView1D{ArrayOffsetFieldData, 3, 4*sizeof(Int)}, 4, SceneFieldFlag::OrderedMapping}; + constexpr SceneField name = cdata.name(); + constexpr SceneFieldFlags flags = cdata.flags(); + constexpr std::size_t size = cdata.size(); + constexpr SceneMappingType mappingType = cdata.mappingType(); + CORRADE_COMPARE(name, sceneFieldCustom(34)); + CORRADE_COMPARE(flags, SceneFieldFlag::OrderedMapping); + CORRADE_COMPARE(size, 3); + CORRADE_COMPARE(mappingType, SceneMappingType::UnsignedByte); + /* These are not marked constexpr because it'd work only partially, not for + string fields (tested in constructFieldOffsetOnlyString()) */ + CORRADE_COMPARE(cdata.fieldType(), SceneFieldType::Int); + CORRADE_COMPARE(cdata.fieldArraySize(), 4); + /* These are deliberately not constexpr to save header size a bit -- + compared to SceneField APIs they get used very little and it's mostly + useless in a constexpr context anyway */ + CORRADE_COMPARE(cdata.mappingData().size(), 3); + CORRADE_COMPARE(cdata.mappingData().stride(), sizeof(UnsignedByte)); + CORRADE_COMPARE(cdata.mappingData().data(), ArrayOffsetMappingData); + CORRADE_COMPARE(cdata.fieldData().size(), 3); + CORRADE_COMPARE(cdata.fieldData().stride(), 4*sizeof(Int)); + CORRADE_COMPARE(cdata.fieldData().data(), ArrayOffsetFieldData); } void SceneDataTest::constructFieldArrayTypeErased2D() { @@ -1281,38 +1365,72 @@ void SceneDataTest::constructFieldArrayTypeErased2D() { CORRADE_COMPARE(data.fieldData().size(), 3); CORRADE_COMPARE(data.fieldData().stride(), 4*sizeof(Int)); CORRADE_VERIFY(data.fieldData().data() == offsetFieldData); + + /* 2D type-erased construction is not constexpr due to branching to select + a corresponding SceneMappingType */ } void SceneDataTest::constructFieldArrayOffsetOnly() { struct Data { Byte parent; UnsignedByte object; - Int offset[4]; + Int offset[2]; + } data[]{ + {0, 2, {0, 1}}, + {0, 15, {2, 3}}, + {0, 22, {4, 5}} }; - SceneFieldData data{sceneFieldCustom(34), 3, SceneMappingType::UnsignedByte, offsetof(Data, object), sizeof(Data), SceneFieldType::Int, offsetof(Data, offset), sizeof(Data), 4, SceneFieldFlag::ImplicitMapping}; - CORRADE_COMPARE(data.flags(), SceneFieldFlag::OffsetOnly|SceneFieldFlag::ImplicitMapping); - CORRADE_COMPARE(data.name(), sceneFieldCustom(34)); - CORRADE_COMPARE(data.size(), 3); - CORRADE_COMPARE(data.mappingType(), SceneMappingType::UnsignedByte); - CORRADE_COMPARE(data.fieldType(), SceneFieldType::Int); - CORRADE_COMPARE(data.fieldArraySize(), 4); + SceneFieldData a{sceneFieldCustom(34), 3, SceneMappingType::UnsignedByte, offsetof(Data, object), sizeof(Data), SceneFieldType::Int, offsetof(Data, offset), sizeof(Data), 2, SceneFieldFlag::ImplicitMapping}; + CORRADE_COMPARE(a.flags(), SceneFieldFlag::OffsetOnly|SceneFieldFlag::ImplicitMapping); + CORRADE_COMPARE(a.name(), sceneFieldCustom(34)); + CORRADE_COMPARE(a.size(), 3); + CORRADE_COMPARE(a.mappingType(), SceneMappingType::UnsignedByte); + CORRADE_COMPARE(a.mappingData(data).size(), 3); + CORRADE_COMPARE(a.mappingData(data).stride(), sizeof(Data)); + CORRADE_COMPARE_AS(Containers::arrayCast(a.mappingData(data)), + Containers::arrayView({2, 15, 22}), + TestSuite::Compare::Container); + CORRADE_COMPARE(a.fieldType(), SceneFieldType::Int); + CORRADE_COMPARE(a.fieldArraySize(), 2); + CORRADE_COMPARE(a.fieldData(data).size(), 3); + CORRADE_COMPARE(a.fieldData(data).stride(), sizeof(Data)); + CORRADE_COMPARE_AS((Containers::arrayCast<2, const Int>(a.fieldData(data), 2).transposed<0, 1>())[0], + Containers::arrayView({0, 2, 4}), + TestSuite::Compare::Container); + CORRADE_COMPARE_AS((Containers::arrayCast<2, const Int>(a.fieldData(data), 2).transposed<0, 1>())[1], + Containers::arrayView({1, 3, 5}), + TestSuite::Compare::Container); - Data actual[3]; - CORRADE_COMPARE(data.fieldData(actual).size(), 3); - CORRADE_COMPARE(data.fieldData(actual).stride(), sizeof(Data)); - CORRADE_VERIFY(data.fieldData(actual).data() == &actual[0].offset); - CORRADE_COMPARE(data.mappingData(actual).size(), 3); - CORRADE_COMPARE(data.mappingData(actual).stride(), sizeof(Data)); - CORRADE_VERIFY(data.mappingData(actual).data() == &actual[0].object); - - constexpr SceneFieldData cdata{sceneFieldCustom(34), 3, SceneMappingType::UnsignedByte, offsetof(Data, object), sizeof(Data), SceneFieldType::Int, offsetof(Data, offset), sizeof(Data), 4, SceneFieldFlag::OrderedMapping}; - CORRADE_COMPARE(cdata.flags(), SceneFieldFlag::OffsetOnly|SceneFieldFlag::OrderedMapping); - CORRADE_COMPARE(cdata.name(), sceneFieldCustom(34)); - CORRADE_COMPARE(cdata.size(), 3); - CORRADE_COMPARE(cdata.mappingType(), SceneMappingType::UnsignedByte); - CORRADE_COMPARE(cdata.fieldType(), SceneFieldType::Int); - CORRADE_COMPARE(cdata.fieldArraySize(), 4); + constexpr SceneFieldData ca{sceneFieldCustom(34), 3, SceneMappingType::UnsignedByte, offsetof(Data, object), sizeof(Data), SceneFieldType::Int, offsetof(Data, offset), sizeof(Data), 2, SceneFieldFlag::OrderedMapping}; + constexpr SceneField name = ca.name(); + constexpr SceneFieldFlags flags = ca.flags(); + constexpr std::size_t size = ca.size(); + constexpr SceneMappingType mappingType = ca.mappingType(); + CORRADE_COMPARE(name, sceneFieldCustom(34)); + CORRADE_COMPARE(flags, SceneFieldFlag::OffsetOnly|SceneFieldFlag::OrderedMapping); + CORRADE_COMPARE(size, 3); + CORRADE_COMPARE(mappingType, SceneMappingType::UnsignedByte); + /* These are not marked constexpr because it'd work only partially, not for + string fields (tested in constructFieldOffsetOnlyString()) */ + CORRADE_COMPARE(ca.fieldType(), SceneFieldType::Int); + CORRADE_COMPARE(ca.fieldArraySize(), 2); + /* These are deliberately not constexpr to save header size a bit -- + compared to SceneField APIs they get used very little and it's mostly + useless in a constexpr context anyway */ + CORRADE_COMPARE(ca.mappingData(data).size(), 3); + CORRADE_COMPARE(ca.mappingData(data).stride(), sizeof(Data)); + CORRADE_COMPARE_AS(Containers::arrayCast(ca.mappingData(data)), + Containers::arrayView({2, 15, 22}), + TestSuite::Compare::Container); + CORRADE_COMPARE(ca.fieldData(data).size(), 3); + CORRADE_COMPARE(ca.fieldData(data).stride(), sizeof(Data)); + CORRADE_COMPARE_AS((Containers::arrayCast<2, const Int>(ca.fieldData(data), 2).transposed<0, 1>())[0], + Containers::arrayView({0, 2, 4}), + TestSuite::Compare::Container); + CORRADE_COMPARE_AS((Containers::arrayCast<2, const Int>(ca.fieldData(data), 2).transposed<0, 1>())[1], + Containers::arrayView({1, 3, 5}), + TestSuite::Compare::Container); } void SceneDataTest::constructFieldInconsistentViewSize() {