diff --git a/src/Magnum/Trade/SceneData.cpp b/src/Magnum/Trade/SceneData.cpp index 97294045a..4beb7b022 100644 --- a/src/Magnum/Trade/SceneData.cpp +++ b/src/Magnum/Trade/SceneData.cpp @@ -1258,9 +1258,9 @@ Containers::Array> SceneData::parentsAsArray( strings in the binary */ "Trade::SceneData::parentsInto(): field not found", {}); Containers::Array> out{NoInit, std::size_t(_fields[fieldId]._size)}; - /** @todo use slicing once Pair exposes members somehow */ - mappingIntoInternal(fieldId, 0, {out, reinterpret_cast(reinterpret_cast(out.data())), out.size(), sizeof(decltype(out)::Type)}); - parentsIntoInternal(fieldId, 0, {out, reinterpret_cast(reinterpret_cast(out.data()) + sizeof(UnsignedInt)), out.size(), sizeof(decltype(out)::Type)}); + /* Explicit slice() template parameters needed by GCC 4.8 and MSVC 2015 */ + mappingIntoInternal(fieldId, 0, stridedArrayView(out).slice(&decltype(out)::Type::first)); + parentsIntoInternal(fieldId, 0, stridedArrayView(out).slice(&decltype(out)::Type::second)); return out; } @@ -1467,9 +1467,9 @@ Containers::Array> SceneData::transformat strings in the binary */ "Trade::SceneData::transformations2DInto(): no transformation-related field found", {}); Containers::Array> out{NoInit, std::size_t(_fields[fieldWithObjectMapping]._size)}; - /** @todo use slicing once Pair exposes members somehow */ - mappingIntoInternal(fieldWithObjectMapping, 0, {out, reinterpret_cast(reinterpret_cast(out.data())), out.size(), sizeof(decltype(out)::Type)}); - transformations2DIntoInternal(transformationFieldId, translationFieldId, rotationFieldId, scalingFieldId, 0, {out, reinterpret_cast(reinterpret_cast(out.data()) + sizeof(UnsignedInt)), out.size(), sizeof(decltype(out)::Type)}); + /* Explicit slice() template parameters needed by GCC 4.8 and MSVC 2015 */ + mappingIntoInternal(fieldWithObjectMapping, 0, stridedArrayView(out).slice(&decltype(out)::Type::first)); + transformations2DIntoInternal(transformationFieldId, translationFieldId, rotationFieldId, scalingFieldId, 0, stridedArrayView(out).slice(&decltype(out)::Type::second)); return out; } @@ -1590,12 +1590,13 @@ Containers::Array>> out{NoInit, std::size_t(_fields[fieldWithObjectMapping]._size)}; - /** @todo use slicing once Triple exposes members somehow */ - mappingIntoInternal(fieldWithObjectMapping, 0, {out, reinterpret_cast(reinterpret_cast(out.data())), out.size(), sizeof(decltype(out)::Type)}); - const Containers::StridedArrayView1D translationsOut{out, reinterpret_cast(reinterpret_cast(out.data()) + sizeof(UnsignedInt)), out.size(), sizeof(decltype(out)::Type)}; - const Containers::StridedArrayView1D rotationsOut{out, reinterpret_cast(reinterpret_cast(out.data()) + sizeof(UnsignedInt) + sizeof(Vector2)), out.size(), sizeof(decltype(out)::Type)}; - const Containers::StridedArrayView1D scalingsOut{out, reinterpret_cast(reinterpret_cast(out.data()) + sizeof(UnsignedInt) + sizeof(Vector2) + sizeof(Complex)), out.size(), sizeof(decltype(out)::Type)}; - translationsRotationsScalings2DIntoInternal(translationFieldId, rotationFieldId, scalingFieldId, 0, translationsOut, rotationsOut, scalingsOut); + /* Explicit slice() template parameters needed by GCC 4.8 and MSVC 2015 */ + mappingIntoInternal(fieldWithObjectMapping, 0, stridedArrayView(out).slice(&decltype(out)::Type::first)); + const auto outSecond = stridedArrayView(out).slice>(&decltype(out)::Type::second); + translationsRotationsScalings2DIntoInternal(translationFieldId, rotationFieldId, scalingFieldId, 0, + outSecond.slice(&decltype(outSecond)::Type::first), + outSecond.slice(&decltype(outSecond)::Type::second), + outSecond.slice(&decltype(outSecond)::Type::third)); return out; } @@ -1712,9 +1713,9 @@ Containers::Array> SceneData::transformat strings in the binary */ "Trade::SceneData::transformations3DInto(): no transformation-related field found", {}); Containers::Array> out{NoInit, std::size_t(_fields[fieldWithObjectMapping]._size)}; - /** @todo use slicing once Pair exposes members somehow */ - mappingIntoInternal(fieldWithObjectMapping, 0, {out, reinterpret_cast(reinterpret_cast(out.data())), out.size(), sizeof(decltype(out)::Type)}); - transformations3DIntoInternal(transformationFieldId, translationFieldId, rotationFieldId, scalingFieldId, 0, {out, reinterpret_cast(reinterpret_cast(out.data()) + sizeof(UnsignedInt)), out.size(), sizeof(decltype(out)::Type)}); + /* Explicit slice() template parameters needed by GCC 4.8 and MSVC 2015 */ + mappingIntoInternal(fieldWithObjectMapping, 0, stridedArrayView(out).slice(&decltype(out)::Type::first)); + transformations3DIntoInternal(transformationFieldId, translationFieldId, rotationFieldId, scalingFieldId, 0, stridedArrayView(out).slice(&decltype(out)::Type::second)); return out; } @@ -1835,12 +1836,13 @@ Containers::Array>> out{NoInit, std::size_t(_fields[fieldWithObjectMapping]._size)}; - /** @todo use slicing once Triple exposes members somehow */ - mappingIntoInternal(fieldWithObjectMapping, 0, {out, reinterpret_cast(reinterpret_cast(out.data())), out.size(), sizeof(decltype(out)::Type)}); - const Containers::StridedArrayView1D translationsOut{out, reinterpret_cast(reinterpret_cast(out.data()) + sizeof(UnsignedInt)), out.size(), sizeof(decltype(out)::Type)}; - const Containers::StridedArrayView1D rotationsOut{out, reinterpret_cast(reinterpret_cast(out.data()) + sizeof(UnsignedInt) + sizeof(Vector3)), out.size(), sizeof(decltype(out)::Type)}; - const Containers::StridedArrayView1D scalingsOut{out, reinterpret_cast(reinterpret_cast(out.data()) + sizeof(UnsignedInt) + sizeof(Vector3) + sizeof(Quaternion)), out.size(), sizeof(decltype(out)::Type)}; - translationsRotationsScalings3DIntoInternal(translationFieldId, rotationFieldId, scalingFieldId, 0, translationsOut, rotationsOut, scalingsOut); + /* Explicit slice() template parameters needed by GCC 4.8 and MSVC 2015 */ + mappingIntoInternal(fieldWithObjectMapping, 0, stridedArrayView(out).slice(&decltype(out)::Type::first)); + const auto outSecond = stridedArrayView(out).slice>(&decltype(out)::Type::second); + translationsRotationsScalings3DIntoInternal(translationFieldId, rotationFieldId, scalingFieldId, 0, + outSecond.slice(&decltype(outSecond)::Type::first), + outSecond.slice(&decltype(outSecond)::Type::second), + outSecond.slice(&decltype(outSecond)::Type::third)); return out; } @@ -1880,9 +1882,9 @@ void SceneData::indexFieldIntoInternal(const UnsignedInt fieldId, const std::siz Containers::Array> SceneData::unsignedIndexFieldAsArrayInternal(const UnsignedInt fieldId) const { Containers::Array> out{NoInit, std::size_t(_fields[fieldId]._size)}; - /** @todo use slicing once Pair exposes members somehow */ - mappingIntoInternal(fieldId, 0, {out, reinterpret_cast(reinterpret_cast(out.data())), out.size(), sizeof(decltype(out)::Type)}); - unsignedIndexFieldIntoInternal(fieldId, 0, {out, reinterpret_cast(reinterpret_cast(out.data()) + sizeof(UnsignedInt)), out.size(), sizeof(decltype(out)::Type)}); + /* Explicit slice() template parameters needed by GCC 4.8 and MSVC 2015 */ + mappingIntoInternal(fieldId, 0, stridedArrayView(out).slice(&decltype(out)::Type::first)); + unsignedIndexFieldIntoInternal(fieldId, 0, stridedArrayView(out).slice(&decltype(out)::Type::second)); return out; } @@ -1947,11 +1949,12 @@ Containers::Array>> out{NoInit, std::size_t(_fields[fieldId]._size)}; - /** @todo use slicing once Pair exposes members somehow */ - mappingIntoInternal(fieldId, 0, {out, reinterpret_cast(reinterpret_cast(out.data())), out.size(), sizeof(decltype(out)::Type)}); - const Containers::StridedArrayView1D meshesOut{out, reinterpret_cast(reinterpret_cast(out.data()) + sizeof(UnsignedInt)), out.size(), sizeof(decltype(out)::Type)}; - const Containers::StridedArrayView1D meshMaterialsOut{out, reinterpret_cast(reinterpret_cast(out.data()) + sizeof(UnsignedInt) + sizeof(UnsignedInt)), out.size(), sizeof(decltype(out)::Type)}; - meshesMaterialsIntoInternal(fieldId, 0, meshesOut, meshMaterialsOut); + /* Explicit slice() template parameters needed by GCC 4.8 and MSVC 2015 */ + mappingIntoInternal(fieldId, 0, stridedArrayView(out).slice(&decltype(out)::Type::first)); + const auto outSecond = stridedArrayView(out).slice>(&decltype(out)::Type::second); + meshesMaterialsIntoInternal(fieldId, 0, + outSecond.slice(&decltype(outSecond)::Type::first), + outSecond.slice(&decltype(outSecond)::Type::second)); return out; } @@ -2115,10 +2118,9 @@ Containers::Array> SceneData::importe ValueInit #endif , std::size_t(_fields[fieldId]._size)}; - /** @todo use slicing once Pair exposes members somehow, especially because - this is EXTREMELY prone to bugs due to the padding before the pointer */ - mappingIntoInternal(fieldId, 0, {out, reinterpret_cast(reinterpret_cast(out.data())), out.size(), sizeof(decltype(out)::Type)}); - importerStateIntoInternal(fieldId, 0, {out, reinterpret_cast(reinterpret_cast(out.data()) + sizeof(const void*)), out.size(), sizeof(decltype(out)::Type)}); + /* Explicit slice() template parameters needed by GCC 4.8 and MSVC 2015 */ + mappingIntoInternal(fieldId, 0, stridedArrayView(out).slice(&decltype(out)::Type::first)); + importerStateIntoInternal(fieldId, 0, stridedArrayView(out).slice(&decltype(out)::Type::second)); return out; }