Make QListData::shared_null const
authorBradley T. Hughes <bradley.hughes@nokia.com>
Fri, 9 Sep 2011 09:09:16 +0000 (11:09 +0200)
committerQt by Nokia <qt-info@nokia.com>
Mon, 26 Sep 2011 05:50:20 +0000 (07:50 +0200)
Similar to QMap, QVector, QByteArray and QString, keep the shared_null
in shareable memory and never modify it.

Change-Id: I2b4bb8de564080021043f6ede6c903d567c686cf
Reviewed-on: http://codereview.qt-project.org/4531
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com>
src/corelib/tools/qlist.cpp
src/corelib/tools/qlist.h

index 4c04385..0daec4d 100644 (file)
@@ -57,7 +57,7 @@ QT_BEGIN_NAMESPACE
     the number of elements in the list.
 */
 
-QListData::Data QListData::shared_null = { Q_BASIC_ATOMIC_INITIALIZER(1), 0, 0, 0, true, { 0 } };
+const QListData::Data QListData::shared_null = { Q_REFCOUNT_INITIALIZER(-1), 0, 0, 0, true, { 0 } };
 
 static int grow(int size)
 {
index a215cc6..e9e44db 100644 (file)
@@ -42,9 +42,9 @@
 #ifndef QLIST_H
 #define QLIST_H
 
-#include <QtCore/qiterator.h>
-#include <QtCore/qatomic.h>
 #include <QtCore/qalgorithms.h>
+#include <QtCore/qiterator.h>
+#include <QtCore/qrefcount.h>
 
 #ifndef QT_NO_STL
 #include <iterator>
@@ -70,7 +70,7 @@ template <typename T> class QSet;
 
 struct Q_CORE_EXPORT QListData {
     struct Data {
-        QBasicAtomicInt ref;
+        QtPrivate::RefCount ref;
         int alloc, begin, end;
         uint sharable : 1;
         void *array[1];
@@ -80,7 +80,7 @@ struct Q_CORE_EXPORT QListData {
     Data *detach(int alloc);
     Data *detach_grow(int *i, int n);
     void realloc(int alloc);
-    static Data shared_null;
+    static const Data shared_null;
     Data *d;
     void **erase(void **xi);
     void **append(int n);
@@ -114,7 +114,7 @@ class QList
     union { QListData p; QListData::Data *d; };
 
 public:
-    inline QList() : d(&QListData::shared_null) { d->ref.ref(); }
+    inline QList() : d(const_cast<QListData::Data *>(&QListData::shared_null)) { }
     inline QList(const QList<T> &l) : d(l.d) { d->ref.ref(); if (!d->sharable) detach_helper(); }
     ~QList();
     QList<T> &operator=(const QList<T> &l);
@@ -124,8 +124,9 @@ public:
 #endif
     inline void swap(QList<T> &other) { qSwap(d, other.d); }
 #ifdef Q_COMPILER_INITIALIZER_LISTS
-    inline QList(std::initializer_list<T> args) : d(&QListData::shared_null)
-    { d->ref.ref(); qCopy(args.begin(), args.end(), std::back_inserter(*this)); }
+    inline QList(std::initializer_list<T> args)
+        : d(const_cast<QListData::Data *>(&QListData::shared_null))
+    { qCopy(args.begin(), args.end(), std::back_inserter(*this)); }
 #endif
     bool operator==(const QList<T> &l) const;
     inline bool operator!=(const QList<T> &l) const { return !(*this == l); }