Bug 1403444 - Expand rbp_first and rbp_last. r?njn draft
authorMike Hommey <mh+mozilla@glandium.org>
Tue, 26 Sep 2017 16:59:02 +0900
changeset 670930 e9a5e4ac7b22b980cafc4dda39a6af319d880f6e
parent 670929 2e21726138e12d2bf5f9a54ecd0cacdea3f72433
child 670931 a665a0c7d9be7aa8212691079c0845b92fc5757c
push id81767
push userbmo:mh+mozilla@glandium.org
push dateWed, 27 Sep 2017 06:43:40 +0000
reviewersnjn
bugs1403444
milestone58.0a1
Bug 1403444 - Expand rbp_first and rbp_last. r?njn At the same time, simplify the expanded code to better fit in the template.
memory/build/rb.h
--- a/memory/build/rb.h
+++ b/memory/build/rb.h
@@ -125,31 +125,16 @@ public:
   }
 
   void SetColor(NodeColor aColor)
   {
     mRightAndColor = (mRightAndColor & uintptr_t(~1)) | aColor;
   }
 };
 
-/* Tree operations. */
-#define rbp_first(a_type, a_field, a_tree, a_root, r_node)                     \
-  do {                                                                         \
-    for ((r_node) = (a_root); a_field(r_node).Left() != &(a_tree)->rbt_nil;    \
-         (r_node) = a_field(r_node).Left()) {                                  \
-    }                                                                          \
-  } while (0)
-
-#define rbp_last(a_type, a_field, a_tree, a_root, r_node)                      \
-  do {                                                                         \
-    for ((r_node) = (a_root); a_field(r_node).Right() != &(a_tree)->rbt_nil;   \
-         (r_node) = a_field(r_node).Right()) {                                 \
-    }                                                                          \
-  } while (0)
-
 #define rbp_rotate_left(a_type, a_field, a_node, r_node)                       \
   do {                                                                         \
     (r_node) = a_field(a_node).Right();                                        \
     a_field(a_node).SetRight(a_field(r_node).Left());                          \
     a_field(r_node).SetLeft((a_node));                                         \
   } while (0)
 
 #define rbp_rotate_right(a_type, a_field, a_node, r_node)                      \
@@ -509,24 +494,30 @@ struct RedBlackTree
     Trait::GetTreeNode(&rbt_nil).SetLeft(&rbt_nil);
     Trait::GetTreeNode(&rbt_nil).SetRight(&rbt_nil);
     Trait::GetTreeNode(&rbt_nil).SetColor(NodeColor::Black);
   }
 
   T* First(T* aStart = nullptr)
   {
     T* ret;
-    rbp_first(T, Trait::GetTreeNode, this, (aStart ? aStart : rbt_root), (ret));
+    for (ret = aStart ? aStart : rbt_root;
+         Trait::GetTreeNode(ret).Left() != &rbt_nil;
+         ret = Trait::GetTreeNode(ret).Left()) {
+    }
     return (ret == &rbt_nil) ? nullptr : ret;
   }
 
   T* Last(T* aStart = nullptr)
   {
     T* ret;
-    rbp_last(T, Trait::GetTreeNode, this, (aStart ? aStart : rbt_root), ret);
+    for (ret = aStart ? aStart : rbt_root;
+         Trait::GetTreeNode(ret).Right() != &rbt_nil;
+         ret = Trait::GetTreeNode(ret).Right()) {
+    }
     return (ret == &rbt_nil) ? nullptr : ret;
   }
 
   T* Next(T* aNode)
   {
     T* ret;
     if (Trait::GetTreeNode(aNode).Right() != &rbt_nil) {
       ret = First(Trait::GetTreeNode(aNode).Right());