QAtomic: make ctors constexpr, if possible

This requires using the same chain of conditions that QBasicAtomic*
uses in order to provide constructors, so we're using the newly-added
macro QT_BASIC_ATOMIC_HAS_CONSTRUCTORS to check.

Even though QAtomic<> is a template, we can't just use Q_DECL_CONSTEXPR
since the body of the constructors needs to change, too.

Change-Id: I462a80ed175040f7709c30d07d34036c6c5507d8
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
Marc Mutz 2012-07-01 23:22:38 +02:00 committed by Qt by Nokia
parent 21072c85b6
commit 31788fc981

View File

@ -61,10 +61,14 @@ class QAtomicInt : public QBasicAtomicInt
{
public:
// Non-atomic API
#ifdef Q_BASIC_ATOMIC_HAS_CONSTRUCTORS
constexpr QAtomicInt(int value = 0) Q_DECL_NOTHROW : QBasicAtomicInt(value) {}
#else
inline QAtomicInt(int value = 0) Q_DECL_NOTHROW
{
_q_value = value;
}
#endif
inline QAtomicInt(const QAtomicInt &other) Q_DECL_NOTHROW
{
@ -115,10 +119,14 @@ template <typename T>
class QAtomicPointer : public QBasicAtomicPointer<T>
{
public:
#ifdef QT_BASIC_ATOMIC_HAS_CONSTRUCTORS
constexpr QAtomicPointer(T *value = 0) Q_DECL_NOTHROW : QBasicAtomicPointer<T>(value) {}
#else
inline QAtomicPointer(T *value = 0) Q_DECL_NOTHROW
{
this->store(value);
}
#endif
inline QAtomicPointer(const QAtomicPointer<T> &other) Q_DECL_NOTHROW
{
this->store(other.load());
@ -161,6 +169,10 @@ public:
# pragma GCC diagnostic pop
#endif
#ifdef QT_BASIC_ATOMIC_HAS_CONSTRUCTORS
# undef QT_BASIC_ATOMIC_HAS_CONSTRUCTORS
#endif
/*!
This is a helper for the assignment operators of implicitly
shared classes. Your assignment operator should look like this: