summaryrefslogtreecommitdiffstats
path: root/src/corelib
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@nokia.com>2009-07-24 20:52:10 (GMT)
committerThiago Macieira <thiago.macieira@nokia.com>2009-07-24 20:52:10 (GMT)
commit585d01e0c2833e16899a502d53bfd62a32573b35 (patch)
treed32102e94e5a7b8ee7219a61021cde749a693908 /src/corelib
parent3a8c8583545b4d5eb0b1fe8d17838bea2b819703 (diff)
downloadQt-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.h47
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>