Bug 1403444 - Expand rbp_node_new. r?njn draft
authorMike Hommey <mh+mozilla@glandium.org>
Tue, 26 Sep 2017 16:00:27 +0900
changeset 671619 6ef90cad28abb601db73977fd46cdb47b90ca14f
parent 671618 cb743fbbac30af3929dbd7b9fcf9c7840bc49834
child 671620 668ba4c28a4e13ba8832b4ff210b2b49650bf6ca
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_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
@@ -131,24 +131,16 @@ public:
   {
     mRightAndColor = reinterpret_cast<T*>(
       (reinterpret_cast<uintptr_t>(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)
@@ -420,17 +412,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);                     \
       }                                                                        \
@@ -629,17 +623,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;