Bug 1403444 - Expand rbp_node_new. r?njn draft
authorMike Hommey <mh+mozilla@glandium.org>
Tue, 26 Sep 2017 16:00:27 +0900
changeset 670925 d579e91b756b60ca5189671744eb7f95b9fe2b86
parent 670924 b5a37bce211143e98856cf252f8e52f414425977
child 670926 c59484565768a5f9812a14a17cc15040883b3976
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_node_new. 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
@@ -127,24 +127,16 @@ public:
   void SetColor(NodeColor aColor)
   {
     mRightAndColor = (mRightAndColor & uintptr_t(~1)) | aColor;
   }
 };
 
 #define rb_node_field(a_node, a_field) a_field(a_node)
 
-/* Node initializer. */
-#define rbp_node_new(a_type, a_field, a_tree, a_node)                          \
-  do {                                                                         \
-    rb_node_field((a_node), a_field).SetLeft(&(a_tree)->rbt_nil);              \
-    rb_node_field((a_node), a_field).SetRight(&(a_tree)->rbt_nil);             \
-    rb_node_field((a_node), a_field).SetColor(NodeColor::Red);                 \
-  } while (0)
-
 /* Tree operations. */
 #define rbp_first(a_type, a_field, a_tree, a_root, r_node)                     \
   do {                                                                         \
     for ((r_node) = (a_root);                                                  \
          rb_node_field((r_node), a_field).Left() != &(a_tree)->rbt_nil;        \
          (r_node) = rb_node_field((r_node), a_field).Left()) {                 \
     }                                                                          \
   } while (0)
@@ -416,17 +408,19 @@ public:
       if (rbp_i_cmp < 0) {                                                     \
         rbp_i_c = rb_node_field(rbp_i_c, a_field).Left();                      \
       } else {                                                                 \
         MOZ_ASSERT(rbp_i_cmp > 0);                                             \
         rbp_i_c = rb_node_field(rbp_i_c, a_field).Right();                     \
       }                                                                        \
     }                                                                          \
     /* rbp_i_p now refers to the node under which to insert.          */       \
-    rbp_node_new(a_type, a_field, a_tree, (a_node));                           \
+    rb_node_field(a_node, a_field).SetLeft(&(a_tree)->rbt_nil);                \
+    rb_node_field(a_node, a_field).SetRight(&(a_tree)->rbt_nil);               \
+    rb_node_field(a_node, a_field).SetColor(NodeColor::Red);                   \
     if (rbp_i_cmp > 0) {                                                       \
       rb_node_field(rbp_i_p, a_field).SetRight((a_node));                      \
       rbp_lean_left(a_type, a_field, rbp_i_p, rbp_i_t);                        \
       if (rb_node_field(rbp_i_g, a_field).Left() == rbp_i_p) {                 \
         rb_node_field(rbp_i_g, a_field).SetLeft(rbp_i_t);                      \
       } else if (rb_node_field(rbp_i_g, a_field).Right() == rbp_i_p) {         \
         rb_node_field(rbp_i_g, a_field).SetRight(rbp_i_t);                     \
       }                                                                        \
@@ -625,17 +619,18 @@ template<typename T, typename Trait>
 struct RedBlackTree
 {
   T* rbt_root;
   T rbt_nil;
 
   void Init()
   {
     rbt_root = &rbt_nil;
-    rbp_node_new(T, Trait::GetTreeNode, this, &rbt_nil);
+    rb_node_field(&rbt_nil, Trait::GetTreeNode).SetLeft(&rbt_nil);
+    rb_node_field(&rbt_nil, Trait::GetTreeNode).SetRight(&rbt_nil);
     rb_node_field(&rbt_nil, Trait::GetTreeNode).SetColor(NodeColor::Black);
   }
 
   T* First()
   {
     T* ret;
     rbp_first(T, Trait::GetTreeNode, this, rbt_root, (ret));
     return (ret == &rbt_nil) ? nullptr : ret;