]> git.llucax.com Git - software/druntime.git/blobdiff - src/compiler/dmd/aaA.d
Changed D 2.0 runtime to account for 'this' being changed from a pointer to a referen...
[software/druntime.git] / src / compiler / dmd / aaA.d
index 3c61b9add708be0d56e6cf7d5425bfade6743ff0..d5f84e713807169c724a2b9a410bd626eb37f194 100644 (file)
@@ -35,8 +35,8 @@ module rt.aaA;
 
 private
 {
 
 private
 {
-    import stdc.stdarg;
-    import stdc.string;
+    import core.stdc.stdarg;
+    import core.stdc.string;
 
     enum BlkAttr : uint
     {
 
     enum BlkAttr : uint
     {
@@ -592,11 +592,58 @@ body
         }
 
         *paa.a = newb;
         }
 
         *paa.a = newb;
+        _aaBalance(paa);
     }
     return (*paa).a;
 }
 
     }
     return (*paa).a;
 }
 
+/********************************************
+ * Balance an array.
+ */
 
 
+void _aaBalance(AA* paa)
+{
+    //printf("_aaBalance()\n");
+    if (paa.a)
+    {
+        aaA*[16] tmp;
+        aaA*[] array = tmp;
+        auto aa = paa.a;
+        foreach (j, e; aa.b)
+        {
+            /* Temporarily store contents of bucket in array[]
+             */
+            size_t k = 0;
+            void addToArray(aaA* e)
+            {
+                while (e)
+                {   addToArray(e.left);
+                    if (k == array.length)
+                        array.length = array.length * 2;
+                    array[k++] = e;
+                    e = e.right;
+                }
+            }
+            addToArray(e);
+            /* The contents of the bucket are now sorted into array[].
+             * Rebuild the tree.
+             */
+            void buildTree(aaA** p, size_t x1, size_t x2)
+            {
+                if (x1 >= x2)
+                    *p = null;
+                else
+                {   auto mid = (x1 + x2) >> 1;
+                    *p = array[mid];
+                    buildTree(&(*p).left, x1, mid);
+                    buildTree(&(*p).right, mid + 1, x2);
+                }
+            }
+            auto p = &aa.b[j];
+            buildTree(p, 0, k);
+        }
+    }
+}
 /********************************************
  * Produce array of N byte keys from aa.
  */
 /********************************************
  * Produce array of N byte keys from aa.
  */