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 671624 40725b9109c96f22f5c6e6170697371dfd8f6cef
parent 671623 ab3d156392aab01c52ea5dd59b3544c5f87bb026
child 671625 fe67f462f74ae1b3ccb9efa03fe022a3032a08df
push id81993
push userbmo:mh+mozilla@glandium.org
push dateThu, 28 Sep 2017 04:40:59 +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
@@ -129,31 +129,16 @@ public:
 
   void SetColor(NodeColor aColor)
   {
     mRightAndColor = reinterpret_cast<T*>(
       (reinterpret_cast<uintptr_t>(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)                      \
@@ -513,24 +498,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());