diff options
author | Thiago Macieira <thiago.macieira@nokia.com> | 2009-07-24 20:52:10 (GMT) |
---|---|---|
committer | Thiago Macieira <thiago.macieira@nokia.com> | 2009-07-24 20:52:10 (GMT) |
commit | 585d01e0c2833e16899a502d53bfd62a32573b35 (patch) | |
tree | d32102e94e5a7b8ee7219a61021cde749a693908 /src/corelib | |
parent | 3a8c8583545b4d5eb0b1fe8d17838bea2b819703 (diff) | |
download | Qt-585d01e0c2833e16899a502d53bfd62a32573b35.zip Qt-585d01e0c2833e16899a502d53bfd62a32573b35.tar.gz Qt-585d01e0c2833e16899a502d53bfd62a32573b35.tar.bz2 |
Revert "Revert "Add support for creating the object alongside the Data structure in QSharedPointer""
This restores the original implementation of the creating
function. The next commit will make it suitable for use.
Diffstat (limited to 'src/corelib')
-rw-r--r-- | src/corelib/tools/qsharedpointer_impl.h | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/corelib/tools/qsharedpointer_impl.h b/src/corelib/tools/qsharedpointer_impl.h index 2d48bdb..98f225b 100644 --- a/src/corelib/tools/qsharedpointer_impl.h +++ b/src/corelib/tools/qsharedpointer_impl.h @@ -48,6 +48,7 @@ #pragma qt_sync_stop_processing #endif +#include <new> #include <QtCore/qatomic.h> #include <QtCore/qobject.h> // for qobject_cast @@ -231,6 +232,34 @@ namespace QtSharedPointer { }; template <class T> + struct ExternalRefCountWithContiguousData: public ExternalRefCountData + { +#ifdef Q_DECL_ALIGN +# ifdef Q_ALIGNOF +# define QSP_ALIGNOF(T) Q_ALIGNOF(T) +# else +# define QSP_ALIGNOF(T) (sizeof(T) >= 16 ? 16 : sizeof(T) >= 8 ? 8 : sizeof(T) >= 4 ? 4 : sizeof(T) >= 2 ? 2 : 1) +# endif + + char data[sizeof(T)] Q_DECL_ALIGN(QSP_ALIGNOF(T)); + inline T *pointer() { return reinterpret_cast<T *>(data); } + +# undef QSP_ALIGNOF +#else + union { + char data[sizeof(T) + 16]; + double dummy1; +# ifndef Q_OS_DARWIN + long double dummy2; +# endif + }; + inline T *pointer() { return reinterpret_cast<T *>(data + 16 - (quintptr(data) & 0xf)); } +#endif + + inline bool destroy() { this->pointer()->~T(); return true; } + }; + + template <class T> class ExternalRefCount: public Basic<T> { typedef ExternalRefCountData Data; @@ -261,6 +290,16 @@ namespace QtSharedPointer { d = ExternalRefCountWithCustomDeleter<T, Deleter>::create(ptr, deleter); } + inline void internalCreate() + { + ExternalRefCountWithContiguousData<T> *dd = new ExternalRefCountWithContiguousData<T>; + T *ptr = dd->pointer(); + new (ptr) T(); // create + + Basic<T>::internalConstruct(ptr); + d = dd; + } + inline ExternalRefCount() : d(0) { } inline ~ExternalRefCount() { if (d && !deref()) delete d; } inline ExternalRefCount(const ExternalRefCount<T> &other) : Basic<T>(other), d(other.d) @@ -388,6 +427,14 @@ public: inline void clear() { *this = QSharedPointer<T>(); } QWeakPointer<T> toWeakRef() const; + +public: + static QSharedPointer<T> create() + { + QSharedPointer<T> result; + result.internalCreate(); + return result; + } }; template <class T> |