Browse Source

Trade: deinline SceneFieldData::*Data() accessors.

These APIs are mostly just for debugging purposes, not widely used, so
it doesn't make sense to have them as constexpr in the header. (Plus the
returned void view is useless in a constexpr context anyway.)

This header size is getting out of hand, so every stripped bit counts.
Also now that they're no longer constexpr, I can go back to using
regular assertions. The reinterpret_cast<> wasn't needed either.
pull/499/head
Vladimír Vondruš 3 years ago
parent
commit
9ba9c406aa
  1. 32
      src/Magnum/Trade/SceneData.cpp
  2. 30
      src/Magnum/Trade/SceneData.h
  3. 17
      src/Magnum/Trade/Test/SceneDataTest.cpp

32
src/Magnum/Trade/SceneData.cpp

@ -531,6 +531,38 @@ SceneFieldData::SceneFieldData(const SceneField name, const Containers::StridedA
CORRADE_ASSERT(fieldData.isContiguous<1>(), "Trade::SceneFieldData: second field view dimension is not contiguous", ); CORRADE_ASSERT(fieldData.isContiguous<1>(), "Trade::SceneFieldData: second field view dimension is not contiguous", );
} }
Containers::StridedArrayView1D<const void> SceneFieldData::mappingData() const {
CORRADE_ASSERT(!(_flags & SceneFieldFlag::OffsetOnly),
"Trade::SceneFieldData::mappingData(): the field is offset-only, supply a data array", {});
return Containers::StridedArrayView1D<const void>{
/* We're *sure* the view is correct, so faking the view size */
/** @todo better ideas for the StridedArrayView API? */
{_mappingData.pointer, ~std::size_t{}}, _size, _mappingStride};
}
Containers::StridedArrayView1D<const void> SceneFieldData::mappingData(const Containers::ArrayView<const void> data) const {
return Containers::StridedArrayView1D<const void>{
/* We're *sure* the view is correct, so faking the view size */
/** @todo better ideas for the StridedArrayView API? */
data, _flags & SceneFieldFlag::OffsetOnly ? static_cast<const char*>(data.data()) + _mappingData.offset : _mappingData.pointer, _size, _mappingStride};
}
Containers::StridedArrayView1D<const void> SceneFieldData::fieldData() const {
CORRADE_ASSERT(!(_flags & SceneFieldFlag::OffsetOnly),
"Trade::SceneFieldData::fieldData(): the field is offset-only, supply a data array", {});
return Containers::StridedArrayView1D<const void>{
/* We're *sure* the view is correct, so faking the view size */
/** @todo better ideas for the StridedArrayView API? */
{_fieldData.pointer, ~std::size_t{}}, _size, _fieldStride};
}
Containers::StridedArrayView1D<const void> SceneFieldData::fieldData(const Containers::ArrayView<const void> data) const {
return Containers::StridedArrayView1D<const void>{
/* We're *sure* the view is correct, so faking the view size */
/** @todo better ideas for the StridedArrayView API? */
data, _flags & SceneFieldFlag::OffsetOnly ? static_cast<const char*>(data.data()) + _fieldData.offset : _fieldData.pointer, _size, _fieldStride};
}
Containers::Array<SceneFieldData> sceneFieldDataNonOwningArray(const Containers::ArrayView<const SceneFieldData> view) { Containers::Array<SceneFieldData> sceneFieldDataNonOwningArray(const Containers::ArrayView<const SceneFieldData> view) {
return Containers::Array<SceneFieldData>{const_cast<SceneFieldData*>(view.data()), view.size(), Implementation::nonOwnedArrayDeleter}; return Containers::Array<SceneFieldData>{const_cast<SceneFieldData*>(view.data()), view.size(), Implementation::nonOwnedArrayDeleter};
} }

30
src/Magnum/Trade/SceneData.h

@ -812,13 +812,7 @@ class MAGNUM_TRADE_EXPORT SceneFieldData {
* overload instead. * overload instead.
* @see @ref flags() * @see @ref flags()
*/ */
constexpr Containers::StridedArrayView1D<const void> mappingData() const { Containers::StridedArrayView1D<const void> mappingData() const;
return Containers::StridedArrayView1D<const void>{
/* We're *sure* the view is correct, so faking the view size */
/** @todo better ideas for the StridedArrayView API? */
{_mappingData.pointer, ~std::size_t{}}, _size,
(CORRADE_CONSTEXPR_ASSERT(!(_flags & SceneFieldFlag::OffsetOnly), "Trade::SceneFieldData::mappingData(): the field is offset-only, supply a data array"), _mappingStride)};
}
/** /**
* @brief Type-erased object mapping data for an offset-only field * @brief Type-erased object mapping data for an offset-only field
@ -827,12 +821,7 @@ class MAGNUM_TRADE_EXPORT SceneFieldData {
* @p data parameter is ignored. * @p data parameter is ignored.
* @see @ref flags(), @ref mappingData() const * @see @ref flags(), @ref mappingData() const
*/ */
Containers::StridedArrayView1D<const void> mappingData(Containers::ArrayView<const void> data) const { Containers::StridedArrayView1D<const void> mappingData(Containers::ArrayView<const void> data) const;
return Containers::StridedArrayView1D<const void>{
/* We're *sure* the view is correct, so faking the view size */
/** @todo better ideas for the StridedArrayView API? */
data, _flags & SceneFieldFlag::OffsetOnly ? reinterpret_cast<const char*>(data.data()) + _mappingData.offset : _mappingData.pointer, _size, _mappingStride};
}
/** @brief Field type */ /** @brief Field type */
constexpr SceneFieldType fieldType() const { return _fieldType; } constexpr SceneFieldType fieldType() const { return _fieldType; }
@ -848,13 +837,7 @@ class MAGNUM_TRADE_EXPORT SceneFieldData {
* overload instead. * overload instead.
* @see @ref flags() * @see @ref flags()
*/ */
constexpr Containers::StridedArrayView1D<const void> fieldData() const { Containers::StridedArrayView1D<const void> fieldData() const;
return Containers::StridedArrayView1D<const void>{
/* We're *sure* the view is correct, so faking the view size */
/** @todo better ideas for the StridedArrayView API? */
{_fieldData.pointer, ~std::size_t{}}, _size,
(CORRADE_CONSTEXPR_ASSERT(!(_flags & SceneFieldFlag::OffsetOnly), "Trade::SceneFieldData::fieldData(): the field is offset-only, supply a data array"), _fieldStride)};
}
/** /**
* @brief Type-erased field data for an offset-only field * @brief Type-erased field data for an offset-only field
@ -863,12 +846,7 @@ class MAGNUM_TRADE_EXPORT SceneFieldData {
* @p data parameter is ignored. * @p data parameter is ignored.
* @see @ref flags(), @ref fieldData() const * @see @ref flags(), @ref fieldData() const
*/ */
Containers::StridedArrayView1D<const void> fieldData(Containers::ArrayView<const void> data) const { Containers::StridedArrayView1D<const void> fieldData(Containers::ArrayView<const void> data) const;
return Containers::StridedArrayView1D<const void>{
/* We're *sure* the view is correct, so faking the view size */
/** @todo better ideas for the StridedArrayView API? */
data, _flags & SceneFieldFlag::OffsetOnly ? reinterpret_cast<const char*>(data.data()) + _fieldData.offset : _fieldData.pointer, _size, _fieldStride};
}
private: private:
friend SceneData; friend SceneData;

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

@ -816,21 +816,22 @@ void SceneDataTest::constructField() {
constexpr SceneField name = crotations.name(); constexpr SceneField name = crotations.name();
constexpr SceneFieldFlags flags = crotations.flags(); constexpr SceneFieldFlags flags = crotations.flags();
constexpr SceneMappingType mappingType = crotations.mappingType(); constexpr SceneMappingType mappingType = crotations.mappingType();
constexpr Containers::StridedArrayView1D<const void> mappingData = crotations.mappingData();
constexpr SceneFieldType fieldType = crotations.fieldType(); constexpr SceneFieldType fieldType = crotations.fieldType();
constexpr UnsignedShort fieldArraySize = crotations.fieldArraySize(); constexpr UnsignedShort fieldArraySize = crotations.fieldArraySize();
constexpr Containers::StridedArrayView1D<const void> fieldData = crotations.fieldData();
CORRADE_COMPARE(name, SceneField::Rotation); CORRADE_COMPARE(name, SceneField::Rotation);
CORRADE_COMPARE(flags, SceneFieldFlag::ImplicitMapping); CORRADE_COMPARE(flags, SceneFieldFlag::ImplicitMapping);
CORRADE_COMPARE(mappingType, SceneMappingType::UnsignedShort); CORRADE_COMPARE(mappingType, SceneMappingType::UnsignedShort);
CORRADE_COMPARE(mappingData.size(), 3);
CORRADE_COMPARE(mappingData.stride(), sizeof(UnsignedShort));
CORRADE_COMPARE(mappingData.data(), RotationMapping2D);
CORRADE_COMPARE(fieldType, SceneFieldType::Complexd); CORRADE_COMPARE(fieldType, SceneFieldType::Complexd);
CORRADE_COMPARE(fieldArraySize, 0); CORRADE_COMPARE(fieldArraySize, 0);
CORRADE_COMPARE(fieldData.size(), 3); /* These are deliberately not constexpr to save header size a bit --
CORRADE_COMPARE(fieldData.stride(), sizeof(Complexd)); compared to SceneField APIs they get used very little and it's mostly
CORRADE_COMPARE(fieldData.data(), RotationField2D); useless in a constexpr context anyway */
CORRADE_COMPARE(crotations.mappingData().size(), 3);
CORRADE_COMPARE(crotations.mappingData().stride(), sizeof(UnsignedShort));
CORRADE_COMPARE(crotations.mappingData().data(), RotationMapping2D);
CORRADE_COMPARE(crotations.fieldData().size(), 3);
CORRADE_COMPARE(crotations.fieldData().stride(), sizeof(Complexd));
CORRADE_COMPARE(crotations.fieldData().data(), RotationField2D);
#endif #endif
} }

Loading…
Cancel
Save