Browse Source

Trade: avoid double lookup in SceneData::fooAsArray().

These need to query field size for allocating the output array which
means looking up the field by name, but the same lookup was then done
again in the fooInto() implementation.
pull/525/head
Vladimír Vondruš 5 years ago
parent
commit
59d6709007
  1. 24
      src/Magnum/Trade/SceneData.cpp
  2. 3
      src/Magnum/Trade/SceneData.h
  3. 14
      src/Magnum/Trade/Test/SceneDataTest.cpp

24
src/Magnum/Trade/SceneData.cpp

@ -715,8 +715,7 @@ Containers::Array<UnsignedInt> SceneData::objectsAsArray(const SceneField name)
return objectsAsArray(fieldId);
}
void SceneData::parentsInto(const Containers::StridedArrayView1D<Int>& destination) const {
const UnsignedInt fieldId = fieldFor(SceneField::Parent);
void SceneData::parentsIntoInternal(const UnsignedInt fieldId, const Containers::StridedArrayView1D<Int>& destination) const {
CORRADE_ASSERT(fieldId != ~UnsignedInt{},
"Trade::SceneData::parentsInto(): field not found", );
const SceneFieldData& field = _fields[fieldId];
@ -737,6 +736,10 @@ void SceneData::parentsInto(const Containers::StridedArrayView1D<Int>& destinati
} else CORRADE_INTERNAL_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */
}
void SceneData::parentsInto(const Containers::StridedArrayView1D<Int>& destination) const {
parentsIntoInternal(fieldFor(SceneField::Parent), destination);
}
Containers::Array<Int> SceneData::parentsAsArray() const {
const UnsignedInt fieldId = fieldFor(SceneField::Parent);
CORRADE_ASSERT(fieldId != ~UnsignedInt{},
@ -744,7 +747,7 @@ Containers::Array<Int> SceneData::parentsAsArray() const {
strings in the binary */
"Trade::SceneData::parentsInto(): field not found", {});
Containers::Array<Int> out{NoInit, std::size_t(_fields[fieldId]._size)};
parentsInto(out);
parentsIntoInternal(fieldId, out);
return out;
}
@ -1022,9 +1025,8 @@ void SceneData::indexFieldIntoInternal(
#ifndef CORRADE_NO_ASSERT
const char* const prefix,
#endif
const SceneField name, const Containers::StridedArrayView1D<UnsignedInt>& destination) const
const UnsignedInt fieldId, const Containers::StridedArrayView1D<UnsignedInt>& destination) const
{
const UnsignedInt fieldId = fieldFor(name);
CORRADE_ASSERT(fieldId != ~UnsignedInt{},
prefix << "field not found", );
const SceneFieldData& field = _fields[fieldId];
@ -1055,7 +1057,7 @@ Containers::Array<UnsignedInt> SceneData::indexFieldAsArrayInternal(
#ifndef CORRADE_NO_ASSERT
prefix,
#endif
name, out);
fieldId, out);
return out;
}
@ -1064,7 +1066,7 @@ void SceneData::meshesInto(const Containers::StridedArrayView1D<UnsignedInt>& de
#ifndef CORRADE_NO_ASSERT
"Trade::SceneData::meshesInto():",
#endif
SceneField::Mesh, destination);
fieldFor(SceneField::Mesh), destination);
}
Containers::Array<UnsignedInt> SceneData::meshesAsArray() const {
@ -1082,7 +1084,7 @@ void SceneData::meshMaterialsInto(const Containers::StridedArrayView1D<UnsignedI
#ifndef CORRADE_NO_ASSERT
"Trade::SceneData::meshMaterialsInto():",
#endif
SceneField::MeshMaterial, destination);
fieldFor(SceneField::MeshMaterial), destination);
}
Containers::Array<UnsignedInt> SceneData::meshMaterialsAsArray() const {
@ -1100,7 +1102,7 @@ void SceneData::lightsInto(const Containers::StridedArrayView1D<UnsignedInt>& de
#ifndef CORRADE_NO_ASSERT
"Trade::SceneData::lightsInto():",
#endif
SceneField::Light, destination);
fieldFor(SceneField::Light), destination);
}
Containers::Array<UnsignedInt> SceneData::lightsAsArray() const {
@ -1118,7 +1120,7 @@ void SceneData::camerasInto(const Containers::StridedArrayView1D<UnsignedInt>& d
#ifndef CORRADE_NO_ASSERT
"Trade::SceneData::camerasInto():",
#endif
SceneField::Camera, destination);
fieldFor(SceneField::Camera), destination);
}
Containers::Array<UnsignedInt> SceneData::camerasAsArray() const {
@ -1136,7 +1138,7 @@ void SceneData::skinsInto(const Containers::StridedArrayView1D<UnsignedInt>& des
#ifndef CORRADE_NO_ASSERT
"Trade::SceneData::skinsInto():",
#endif
SceneField::Skin, destination);
fieldFor(SceneField::Skin), destination);
}
Containers::Array<UnsignedInt> SceneData::skinsAsArray() const {

3
src/Magnum/Trade/SceneData.h

@ -1550,6 +1550,7 @@ class MAGNUM_TRADE_EXPORT SceneData {
template<class T> bool checkFieldTypeCompatibility(const SceneFieldData& attribute, const char* prefix) const;
#endif
MAGNUM_TRADE_LOCAL void parentsIntoInternal(UnsignedInt fieldId, const Containers::StridedArrayView1D<Int>& destination) const;
MAGNUM_TRADE_LOCAL std::size_t findTransformFields(UnsignedInt& transformationFieldId, UnsignedInt& translationFieldId, UnsignedInt& rotationFieldId, UnsignedInt& scalingFieldId) const;
MAGNUM_TRADE_LOCAL void transformations2DIntoInternal(UnsignedInt transformationFieldId, UnsignedInt translationFieldId, UnsignedInt rotationFieldId, UnsignedInt scalingFieldId, const Containers::StridedArrayView1D<Matrix3>& destination) const;
MAGNUM_TRADE_LOCAL void transformations3DIntoInternal(UnsignedInt transformationFieldId, UnsignedInt translationFieldId, UnsignedInt rotationFieldId, UnsignedInt scalingFieldId, const Containers::StridedArrayView1D<Matrix4>& destination) const;
@ -1557,7 +1558,7 @@ class MAGNUM_TRADE_EXPORT SceneData {
#ifndef CORRADE_NO_ASSERT
const char* const prefix,
#endif
const SceneField name, const Containers::StridedArrayView1D<UnsignedInt>& destination) const;
const UnsignedInt fieldId, const Containers::StridedArrayView1D<UnsignedInt>& destination) const;
MAGNUM_TRADE_LOCAL Containers::Array<UnsignedInt> indexFieldAsArrayInternal(
#ifndef CORRADE_NO_ASSERT
const char* const prefix,

14
src/Magnum/Trade/Test/SceneDataTest.cpp

@ -1786,8 +1786,18 @@ template<class T> void SceneDataTest::parentsAsArray() {
SceneFieldData{SceneField::Mesh, SceneObjectType::UnsignedByte, nullptr, SceneFieldType::UnsignedInt, nullptr},
SceneFieldData{SceneField::Parent, view.slice(&Field::object), view.slice(&Field::parent)}
}};
CORRADE_COMPARE_AS(scene.parentsAsArray(),
Containers::arrayView<Int>({15, -1, 44}),
Int expected[]{15, -1, 44};
CORRADE_COMPARE_AS(arrayView(scene.parentsAsArray()),
Containers::arrayView(expected),
TestSuite::Compare::Container);
/* Test Into() as well as it only shares a common helper with AsArray() but
has different top-level code paths */
Int out[3];
scene.parentsInto(out);
CORRADE_COMPARE_AS(Containers::arrayView(out),
Containers::arrayView(expected),
TestSuite::Compare::Container);
}

Loading…
Cancel
Save