diff options
author | Roman Pasechnik <roman@pasechnik.net> | 2013-07-02 21:35:21 +0300 |
---|---|---|
committer | Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> | 2014-06-29 23:20:10 +0200 |
commit | 90a68926f311ac5bb8f7c53ac8370f9ff7f12c08 (patch) | |
tree | ec1f5305fb5cf8cc787c4749a95c06b06ab44ba8 /src/corelib/tools/qsharedpointer_impl.h | |
parent | bc19ab03b2e1ac71910ac5309e5ada90b5ffa9a5 (diff) |
Add QEnableSharedFromThis class
It enables you to get a valid QSharedPointer instance to 'this',
when all you have is 'this'.
Task-number: QTBUG-7287
Change-Id: I3ed1c9c4d6b110fe02302312cc3c4a75e9d95a0c
Reviewed-by: Richard J. Moore <rich@kde.org>
Diffstat (limited to 'src/corelib/tools/qsharedpointer_impl.h')
-rw-r--r-- | src/corelib/tools/qsharedpointer_impl.h | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/corelib/tools/qsharedpointer_impl.h b/src/corelib/tools/qsharedpointer_impl.h index 7dafa4981c..fe79aa1db1 100644 --- a/src/corelib/tools/qsharedpointer_impl.h +++ b/src/corelib/tools/qsharedpointer_impl.h @@ -91,6 +91,7 @@ template<typename T> inline void qt_sharedpointer_cast_check(T *) { } // template <class T> class QWeakPointer; template <class T> class QSharedPointer; +template <class T> class QEnableSharedFromThis; class QVariant; @@ -479,6 +480,14 @@ private: delete d; } + template <class X> + inline void enableSharedFromThis(const QEnableSharedFromThis<X> *ptr) + { + ptr->initializeFromSharedPointer(*this); + } + + inline void enableSharedFromThis(...) {} + template <typename Deleter> inline void internalConstruct(T *ptr, Deleter deleter) { @@ -499,6 +508,7 @@ private: internalSafetyCheckAdd(d, ptr); #endif d->setQObjectShared(ptr, true); + enableSharedFromThis(ptr); } template <class X> @@ -707,6 +717,37 @@ public: T *value; }; +template <class T> +class QEnableSharedFromThis +{ +protected: +#ifdef Q_COMPILER_DEFAULT_MEMBERS + QEnableSharedFromThis() = default; +#else + Q_DECL_CONSTEXPR QEnableSharedFromThis() {} +#endif + QEnableSharedFromThis(const QEnableSharedFromThis &) {} + QEnableSharedFromThis &operator=(const QEnableSharedFromThis &) { return *this; } + +public: + inline QSharedPointer<T> sharedFromThis() { return QSharedPointer<T>(weakPointer); } + inline QSharedPointer<const T> sharedFromThis() const { return QSharedPointer<const T>(weakPointer); } + +#ifndef Q_NO_TEMPLATE_FRIENDS +private: + template <class X> friend class QSharedPointer; +#else +public: +#endif + template <class X> + inline void initializeFromSharedPointer(const QSharedPointer<X> &ptr) const + { + weakPointer = ptr; + } + + mutable QWeakPointer<T> weakPointer; +}; + // // operator== and operator!= // |