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", );
}
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) {
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.
* @see @ref flags()
*/
constexpr 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)};
}
Containers::StridedArrayView1D<const void> mappingData() const;
/**
* @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.
* @see @ref flags(), @ref mappingData() 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};
}
Containers::StridedArrayView1D<const void> mappingData(Containers::ArrayView<const void> data) const;
/** @brief Field type */
constexpr SceneFieldType fieldType() const { return _fieldType; }
@ -848,13 +837,7 @@ class MAGNUM_TRADE_EXPORT SceneFieldData {
* overload instead.
* @see @ref flags()
*/
constexpr 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)};
}
Containers::StridedArrayView1D<const void> fieldData() const;
/**
* @brief Type-erased field data for an offset-only field
@ -863,12 +846,7 @@ class MAGNUM_TRADE_EXPORT SceneFieldData {
* @p data parameter is ignored.
* @see @ref flags(), @ref fieldData() 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};
}
Containers::StridedArrayView1D<const void> fieldData(Containers::ArrayView<const void> data) const;
private:
friend SceneData;

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

@ -816,21 +816,22 @@ void SceneDataTest::constructField() {
constexpr SceneField name = crotations.name();
constexpr SceneFieldFlags flags = crotations.flags();
constexpr SceneMappingType mappingType = crotations.mappingType();
constexpr Containers::StridedArrayView1D<const void> mappingData = crotations.mappingData();
constexpr SceneFieldType fieldType = crotations.fieldType();
constexpr UnsignedShort fieldArraySize = crotations.fieldArraySize();
constexpr Containers::StridedArrayView1D<const void> fieldData = crotations.fieldData();
CORRADE_COMPARE(name, SceneField::Rotation);
CORRADE_COMPARE(flags, SceneFieldFlag::ImplicitMapping);
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(fieldArraySize, 0);
CORRADE_COMPARE(fieldData.size(), 3);
CORRADE_COMPARE(fieldData.stride(), sizeof(Complexd));
CORRADE_COMPARE(fieldData.data(), RotationField2D);
/* 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(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
}

Loading…
Cancel
Save