summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGiuseppe D'Angelo <giuseppe.dangelo@kdab.com>2020-03-19 17:57:05 +0100
committerGiuseppe D'Angelo <giuseppe.dangelo@kdab.com>2020-11-22 02:22:20 +0100
commit8ae9431c792f14a32909ac013a1383547d6bcfa8 (patch)
treef24f65816836fcc4e716e235ebb8866dce1985c5 /src
parentf08492c6fd9818c7d80b1725355453e179b4d85b (diff)
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>
Diffstat (limited to 'src')
-rw-r--r--src/corelib/tools/qmargins.h60
1 files changed, 60 insertions, 0 deletions
diff --git a/src/corelib/tools/qmargins.h b/src/corelib/tools/qmargins.h
index f8fba1e9d6..b0f61eeb66 100644
--- a/src/corelib/tools/qmargins.h
+++ b/src/corelib/tools/qmargins.h
@@ -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