QMargins(F): add support for structured binding

[ChangeLog][QtCore][QMargins] QMargins is usable in a structured
binding.

[ChangeLog][QtCore][QMarginsF] QMarginsF is usable in a structured
binding.

Change-Id: I0c501847b9377c47bd0e63da3735792075bd0079
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
bb10
Giuseppe D'Angelo 2020-03-19 17:57:05 +01:00
parent f08492c6fd
commit 8ae9431c79
2 changed files with 116 additions and 0 deletions

View File

@ -94,6 +94,22 @@ private:
{
return !(m1 == m2);
}
template <std::size_t I,
typename M,
std::enable_if_t<(I < 4), bool> = true,
std::enable_if_t<std::is_same_v<std::decay_t<M>, QMargins>, bool> = true>
friend constexpr decltype(auto) get(M &&m) noexcept
{
if constexpr (I == 0)
return (std::forward<M>(m).m_left);
else if constexpr (I == 1)
return (std::forward<M>(m).m_top);
else if constexpr (I == 2)
return (std::forward<M>(m).m_right);
else if constexpr (I == 3)
return (std::forward<M>(m).m_bottom);
}
};
Q_DECLARE_TYPEINFO(QMargins, Q_MOVABLE_TYPE);
@ -327,6 +343,22 @@ private:
{
return !(lhs == rhs);
}
template <std::size_t I,
typename M,
std::enable_if_t<(I < 4), bool> = true,
std::enable_if_t<std::is_same_v<std::decay_t<M>, QMarginsF>, bool> = true>
friend constexpr decltype(auto) get(M &&m) noexcept
{
if constexpr (I == 0)
return (std::forward<M>(m).m_left);
else if constexpr (I == 1)
return (std::forward<M>(m).m_top);
else if constexpr (I == 2)
return (std::forward<M>(m).m_right);
else if constexpr (I == 3)
return (std::forward<M>(m).m_bottom);
}
};
Q_DECLARE_TYPEINFO(QMarginsF, Q_MOVABLE_TYPE);
@ -494,4 +526,32 @@ Q_CORE_EXPORT QDebug operator<<(QDebug, const QMarginsF &);
QT_END_NAMESPACE
/*****************************************************************************
QMargins/QMarginsF tuple protocol
*****************************************************************************/
namespace std {
template <>
class tuple_size<QT_PREPEND_NAMESPACE(QMargins)> : public integral_constant<size_t, 4> {};
template <>
class tuple_element<0, QT_PREPEND_NAMESPACE(QMargins)> { public: using type = int; };
template <>
class tuple_element<1, QT_PREPEND_NAMESPACE(QMargins)> { public: using type = int; };
template <>
class tuple_element<2, QT_PREPEND_NAMESPACE(QMargins)> { public: using type = int; };
template <>
class tuple_element<3, QT_PREPEND_NAMESPACE(QMargins)> { public: using type = int; };
template <>
class tuple_size<QT_PREPEND_NAMESPACE(QMarginsF)> : public integral_constant<size_t, 4> {};
template <>
class tuple_element<0, QT_PREPEND_NAMESPACE(QMarginsF)> { public: using type = QT_PREPEND_NAMESPACE(qreal); };
template <>
class tuple_element<1, QT_PREPEND_NAMESPACE(QMarginsF)> { public: using type = QT_PREPEND_NAMESPACE(qreal); };
template <>
class tuple_element<2, QT_PREPEND_NAMESPACE(QMarginsF)> { public: using type = QT_PREPEND_NAMESPACE(qreal); };
template <>
class tuple_element<3, QT_PREPEND_NAMESPACE(QMarginsF)> { public: using type = QT_PREPEND_NAMESPACE(qreal); };
}
#endif // QMARGINS_H

View File

@ -52,6 +52,8 @@ private slots:
#ifndef QT_NO_DEBUG_STREAM
void debugStreamCheckF();
#endif
void structuredBinding();
};
// Testing get/set functions
@ -283,5 +285,59 @@ void tst_QMargins::debugStreamCheckF()
}
#endif
void tst_QMargins::structuredBinding()
{
{
QMargins m(1, 2, 3, 4);
auto [left, top, right, bottom] = m;
QCOMPARE(left, 1);
QCOMPARE(top, 2);
QCOMPARE(right, 3);
QCOMPARE(bottom, 4);
}
{
QMargins m(1, 2, 3, 4);
auto &[left, top, right, bottom] = m;
QCOMPARE(left, 1);
QCOMPARE(top, 2);
QCOMPARE(right, 3);
QCOMPARE(bottom, 4);
left = 10;
top = 20;
right = 30;
bottom = 40;
QCOMPARE(m.left(), 10);
QCOMPARE(m.top(), 20);
QCOMPARE(m.right(), 30);
QCOMPARE(m.bottom(), 40);
}
{
QMarginsF m(1.0, 2.0, 3.0, 4.0);
auto [left, top, right, bottom] = m;
QCOMPARE(left, 1.0);
QCOMPARE(top, 2.0);
QCOMPARE(right, 3.0);
QCOMPARE(bottom, 4.0);
}
{
QMarginsF m(1.0, 2.0, 3.0, 4.0);
auto &[left, top, right, bottom] = m;
QCOMPARE(left, 1.0);
QCOMPARE(top, 2.0);
QCOMPARE(right, 3.0);
QCOMPARE(bottom, 4.0);
left = 10.0;
top = 20.0;
right = 30.0;
bottom = 40.0;
QCOMPARE(m.left(), 10.0);
QCOMPARE(m.top(), 20.0);
QCOMPARE(m.right(), 30.0);
QCOMPARE(m.bottom(), 40.0);
}
}
QTEST_APPLESS_MAIN(tst_QMargins)
#include "tst_qmargins.moc"