QSizePolicy: add some constexpr
Also add a basic test for constexpr expressions involving QSizePolicy. GCC < 4.8.0 has problems with initializing variant members in constexpr ctors: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54922 Instead of revoking its Q_COMPILER_CONSTEXPR, which is a source-incompatible change, simply note the fact so we can selectively provide constexpr for QSizePolicy. Change-Id: Iba8e5a7cdf847d73e8e2b6bb6211fb3c9846aa0a Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
parent
1aea3c1229
commit
ce3402b5ef
@ -171,6 +171,7 @@ Cpp.ignoretokens += \
|
|||||||
QT_END_NAMESPACE \
|
QT_END_NAMESPACE \
|
||||||
QT_FASTCALL \
|
QT_FASTCALL \
|
||||||
QT_MUTEX_LOCK_NOEXCEPT \
|
QT_MUTEX_LOCK_NOEXCEPT \
|
||||||
|
QT_SIZEPOLICY_CONSTEXPR \
|
||||||
QT_WARNING_DISABLE_DEPRECATED \
|
QT_WARNING_DISABLE_DEPRECATED \
|
||||||
QT_WARNING_PUSH \
|
QT_WARNING_PUSH \
|
||||||
QT_WARNING_POP \
|
QT_WARNING_POP \
|
||||||
|
@ -45,6 +45,15 @@
|
|||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
// gcc < 4.8.0 has problems with init'ing variant members in constexpr ctors
|
||||||
|
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54922
|
||||||
|
#if !defined(Q_CC_GNU) || defined(Q_CC_INTEL) || defined(Q_CC_CLANG) || Q_CC_GNU >= 408
|
||||||
|
# define QT_SIZEPOLICY_CONSTEXPR Q_DECL_CONSTEXPR
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef QT_SIZEPOLICY_CONSTEXPR
|
||||||
|
# define QT_SIZEPOLICY_CONSTEXPR
|
||||||
|
#endif
|
||||||
|
|
||||||
class QVariant;
|
class QVariant;
|
||||||
class QSizePolicy;
|
class QSizePolicy;
|
||||||
@ -94,7 +103,7 @@ public:
|
|||||||
Q_DECLARE_FLAGS(ControlTypes, ControlType)
|
Q_DECLARE_FLAGS(ControlTypes, ControlType)
|
||||||
Q_FLAG(ControlTypes)
|
Q_FLAG(ControlTypes)
|
||||||
|
|
||||||
QSizePolicy() : data(0) { }
|
QT_SIZEPOLICY_CONSTEXPR QSizePolicy() : data(0) { }
|
||||||
|
|
||||||
QSizePolicy(Policy horizontal, Policy vertical, ControlType type = DefaultType)
|
QSizePolicy(Policy horizontal, Policy vertical, ControlType type = DefaultType)
|
||||||
: data(0) {
|
: data(0) {
|
||||||
@ -102,48 +111,47 @@ public:
|
|||||||
bits.verPolicy = vertical;
|
bits.verPolicy = vertical;
|
||||||
setControlType(type);
|
setControlType(type);
|
||||||
}
|
}
|
||||||
Policy horizontalPolicy() const { return static_cast<Policy>(bits.horPolicy); }
|
QT_SIZEPOLICY_CONSTEXPR Policy horizontalPolicy() const { return static_cast<Policy>(bits.horPolicy); }
|
||||||
Policy verticalPolicy() const { return static_cast<Policy>(bits.verPolicy); }
|
QT_SIZEPOLICY_CONSTEXPR Policy verticalPolicy() const { return static_cast<Policy>(bits.verPolicy); }
|
||||||
ControlType controlType() const;
|
ControlType controlType() const;
|
||||||
|
|
||||||
void setHorizontalPolicy(Policy d) { bits.horPolicy = d; }
|
void setHorizontalPolicy(Policy d) { bits.horPolicy = d; }
|
||||||
void setVerticalPolicy(Policy d) { bits.verPolicy = d; }
|
void setVerticalPolicy(Policy d) { bits.verPolicy = d; }
|
||||||
void setControlType(ControlType type);
|
void setControlType(ControlType type);
|
||||||
|
|
||||||
Qt::Orientations expandingDirections() const {
|
QT_SIZEPOLICY_CONSTEXPR Qt::Orientations expandingDirections() const {
|
||||||
return ( (verticalPolicy() & ExpandFlag) ? Qt::Vertical : Qt::Orientations() )
|
return ( (verticalPolicy() & ExpandFlag) ? Qt::Vertical : Qt::Orientations() )
|
||||||
| ( (horizontalPolicy() & ExpandFlag) ? Qt::Horizontal : Qt::Orientations() ) ;
|
| ( (horizontalPolicy() & ExpandFlag) ? Qt::Horizontal : Qt::Orientations() ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setHeightForWidth(bool b) { bits.hfw = b; }
|
void setHeightForWidth(bool b) { bits.hfw = b; }
|
||||||
bool hasHeightForWidth() const { return bits.hfw; }
|
QT_SIZEPOLICY_CONSTEXPR bool hasHeightForWidth() const { return bits.hfw; }
|
||||||
void setWidthForHeight(bool b) { bits.wfh = b; }
|
void setWidthForHeight(bool b) { bits.wfh = b; }
|
||||||
bool hasWidthForHeight() const { return bits.wfh; }
|
QT_SIZEPOLICY_CONSTEXPR bool hasWidthForHeight() const { return bits.wfh; }
|
||||||
|
|
||||||
bool operator==(const QSizePolicy& s) const { return data == s.data; }
|
QT_SIZEPOLICY_CONSTEXPR bool operator==(const QSizePolicy& s) const { return data == s.data; }
|
||||||
bool operator!=(const QSizePolicy& s) const { return data != s.data; }
|
QT_SIZEPOLICY_CONSTEXPR bool operator!=(const QSizePolicy& s) const { return data != s.data; }
|
||||||
|
|
||||||
friend Q_DECL_CONST_FUNCTION uint qHash(QSizePolicy key, uint seed) Q_DECL_NOTHROW { return qHash(key.data, seed); }
|
friend Q_DECL_CONST_FUNCTION uint qHash(QSizePolicy key, uint seed) Q_DECL_NOTHROW { return qHash(key.data, seed); }
|
||||||
|
|
||||||
operator QVariant() const;
|
operator QVariant() const;
|
||||||
|
|
||||||
int horizontalStretch() const { return static_cast<int>(bits.horStretch); }
|
QT_SIZEPOLICY_CONSTEXPR int horizontalStretch() const { return static_cast<int>(bits.horStretch); }
|
||||||
int verticalStretch() const { return static_cast<int>(bits.verStretch); }
|
QT_SIZEPOLICY_CONSTEXPR int verticalStretch() const { return static_cast<int>(bits.verStretch); }
|
||||||
void setHorizontalStretch(int stretchFactor) { bits.horStretch = static_cast<quint32>(qBound(0, stretchFactor, 255)); }
|
void setHorizontalStretch(int stretchFactor) { bits.horStretch = static_cast<quint32>(qBound(0, stretchFactor, 255)); }
|
||||||
void setVerticalStretch(int stretchFactor) { bits.verStretch = static_cast<quint32>(qBound(0, stretchFactor, 255)); }
|
void setVerticalStretch(int stretchFactor) { bits.verStretch = static_cast<quint32>(qBound(0, stretchFactor, 255)); }
|
||||||
|
|
||||||
bool retainSizeWhenHidden() const { return bits.retainSizeWhenHidden; }
|
QT_SIZEPOLICY_CONSTEXPR bool retainSizeWhenHidden() const { return bits.retainSizeWhenHidden; }
|
||||||
void setRetainSizeWhenHidden(bool retainSize) { bits.retainSizeWhenHidden = retainSize; }
|
void setRetainSizeWhenHidden(bool retainSize) { bits.retainSizeWhenHidden = retainSize; }
|
||||||
|
|
||||||
void transpose();
|
void transpose();
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
#ifndef QT_NO_DATASTREAM
|
#ifndef QT_NO_DATASTREAM
|
||||||
friend Q_WIDGETS_EXPORT QDataStream &operator<<(QDataStream &, const QSizePolicy &);
|
friend Q_WIDGETS_EXPORT QDataStream &operator<<(QDataStream &, const QSizePolicy &);
|
||||||
friend Q_WIDGETS_EXPORT QDataStream &operator>>(QDataStream &, QSizePolicy &);
|
friend Q_WIDGETS_EXPORT QDataStream &operator>>(QDataStream &, QSizePolicy &);
|
||||||
#endif
|
#endif
|
||||||
QSizePolicy(int i) : data(i) { }
|
QT_SIZEPOLICY_CONSTEXPR QSizePolicy(int i) : data(i) { }
|
||||||
|
|
||||||
struct Bits {
|
struct Bits {
|
||||||
quint32 horStretch : 8;
|
quint32 horStretch : 8;
|
||||||
@ -187,6 +195,8 @@ inline void QSizePolicy::transpose() {
|
|||||||
setVerticalStretch(hStretch);
|
setVerticalStretch(hStretch);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef QT_SIZEPOLICY_CONSTEXPR
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
#endif // QSIZEPOLICY_H
|
#endif // QSIZEPOLICY_H
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
CONFIG += testcase
|
CONFIG += testcase
|
||||||
|
contains(QT_CONFIG, c++14): CONFIG += c++14
|
||||||
TARGET = tst_qsizepolicy
|
TARGET = tst_qsizepolicy
|
||||||
|
|
||||||
QT += widgets widgets-private testlib
|
QT += widgets widgets-private testlib
|
||||||
|
@ -41,6 +41,7 @@ class tst_QSizePolicy : public QObject
|
|||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void cleanup() { QVERIFY(QApplication::topLevelWidgets().isEmpty()); }
|
void cleanup() { QVERIFY(QApplication::topLevelWidgets().isEmpty()); }
|
||||||
void qtest();
|
void qtest();
|
||||||
|
void constExpr();
|
||||||
void defaultValues();
|
void defaultValues();
|
||||||
void getSetCheck_data() { data(); }
|
void getSetCheck_data() { data(); }
|
||||||
void getSetCheck();
|
void getSetCheck();
|
||||||
@ -102,6 +103,19 @@ void tst_QSizePolicy::qtest()
|
|||||||
#undef CHECK2
|
#undef CHECK2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_QSizePolicy::constExpr()
|
||||||
|
{
|
||||||
|
/* gcc < 4.8.0 has problems with init'ing variant members in constexpr ctors */
|
||||||
|
/* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54922 */
|
||||||
|
#if !defined(Q_CC_GNU) || defined(Q_CC_INTEL) || defined(Q_CC_CLANG) || Q_CC_GNU >= 408
|
||||||
|
// check that certain ctors are constexpr (compile-only):
|
||||||
|
{ Q_CONSTEXPR QSizePolicy sp; Q_UNUSED(sp); }
|
||||||
|
{ Q_CONSTEXPR QSizePolicy sp = QSizePolicy(); Q_UNUSED(sp); }
|
||||||
|
#else
|
||||||
|
QSKIP("QSizePolicy cannot be constexpr with this version of the compiler.");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void tst_QSizePolicy::defaultValues()
|
void tst_QSizePolicy::defaultValues()
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user