src/corelib/tools/qmap.cpp
changeset 3 41300fa6a67c
parent 0 1918ee327afb
child 4 3b1da2848fc7
--- a/src/corelib/tools/qmap.cpp	Tue Jan 26 12:42:25 2010 +0200
+++ b/src/corelib/tools/qmap.cpp	Tue Feb 02 00:43:10 2010 +0200
@@ -53,11 +53,16 @@
 QMapData QMapData::shared_null = {
     &shared_null,
     { &shared_null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
-    Q_BASIC_ATOMIC_INITIALIZER(1), 0, 0, 0, false, true
+    Q_BASIC_ATOMIC_INITIALIZER(1), 0, 0, 0, false, true, false, 0
 };
 
 QMapData *QMapData::createData()
 {
+    return createData(0);
+}
+
+QMapData *QMapData::createData(int alignment)
+{
     QMapData *d = new QMapData;
     Q_CHECK_PTR(d);
     Node *e = reinterpret_cast<Node *>(d);
@@ -69,6 +74,8 @@
     d->randomBits = 0;
     d->insertInOrder = false;
     d->sharable = true;
+    d->strictAlignment = alignment > 8;
+    d->reserved = 0;
     return d;
 }
 
@@ -80,11 +87,19 @@
     while (cur != e) {
         prev = cur;
         cur = cur->forward[0];
-        qFree(reinterpret_cast<char *>(prev) - offset);
+        if (strictAlignment)
+            qFreeAligned(reinterpret_cast<char *>(prev) - offset);
+        else
+            qFree(reinterpret_cast<char *>(prev) - offset);
     }
     delete this;
 }
 
+QMapData::Node *QMapData::node_create(Node *update[], int offset)
+{
+    return node_create(update, offset, 0);
+}
+
 /*!
     Creates a new node inside the data structure.
 
@@ -94,10 +109,12 @@
     \a offset is an amount of bytes that needs to reserved just before the
     QMapData::Node structure.
 
+    \a alignment dictates the alignment for the data.
+
     \internal
     \since 4.6
 */
-QMapData::Node *QMapData::node_create(Node *update[], int offset)
+QMapData::Node *QMapData::node_create(Node *update[], int offset, int alignment)
 {
     int level = 0;
     uint mask = (1 << Sparseness) - 1;
@@ -118,7 +135,9 @@
     if (level == 3 && !insertInOrder)
         randomBits = qrand();
 
-    void *concreteNode = qMalloc(offset + sizeof(Node) + level * sizeof(Node *));
+    void *concreteNode = strictAlignment ?
+                         qMallocAligned(offset + sizeof(Node) + level * sizeof(Node *), alignment) :
+                         qMalloc(offset + sizeof(Node) + level * sizeof(Node *));
     Q_CHECK_PTR(concreteNode);
 
     Node *abstractNode = reinterpret_cast<Node *>(reinterpret_cast<char *>(concreteNode) + offset);
@@ -145,7 +164,10 @@
         update[i]->forward[i] = node->forward[i];
     }
     --size;
-    qFree(reinterpret_cast<char *>(node) - offset);
+    if (strictAlignment)
+        qFreeAligned(reinterpret_cast<char *>(node) - offset);
+    else
+        qFree(reinterpret_cast<char *>(node) - offset);
 }
 
 #ifdef QT_QMAP_DEBUG