Bug 1403444 - Trivially expand rbp_red_get. r?njn draft
authorMike Hommey <mh+mozilla@glandium.org>
Mon, 25 Sep 2017 10:02:48 +0900
changeset 671611 b11fd6180bc2ecd29d32fa92ece0cc7f8f70174a
parent 671610 d291a09d7e2ebd9b06a9b8ce7d3178ba806f0bc0
child 671612 9be666f05cc7956e365cfa8616d0a09b4bc0de75
push id81993
push userbmo:mh+mozilla@glandium.org
push dateThu, 28 Sep 2017 04:40:59 +0000
reviewersnjn
bugs1403444
milestone58.0a1
Bug 1403444 - Trivially expand rbp_red_get. r?njn
memory/build/rb.h
--- a/memory/build/rb.h
+++ b/memory/build/rb.h
@@ -140,18 +140,16 @@ struct RedBlackTree
 #define rbp_left_set(a_type, a_field, a_node, a_left)                          \
   rb_node_field(a_node, a_field).SetLeft(a_left)
 
 /* Right accessors. */
 #define rbp_right_set(a_type, a_field, a_node, a_right)                        \
   rb_node_field(a_node, a_field).SetRight(a_right)
 
 /* Color accessors. */
-#define rbp_red_get(a_type, a_field, a_node)                                   \
-  rb_node_field(a_node, a_field).IsRed()
 #define rbp_color_set(a_type, a_field, a_node, a_red)                          \
   rb_node_field(a_node, a_field)                                               \
     .SetColor(a_red ? NodeColor::Red : NodeColor::Black)
 #define rbp_red_set(a_type, a_field, a_node)                                   \
   rb_node_field(a_node, a_field).SetColor(NodeColor::Red)
 #define rbp_black_set(a_type, a_field, a_node)                                 \
   rb_node_field(a_node, a_field).SetColor(NodeColor::Black)
 
@@ -332,43 +330,43 @@ struct RedBlackTree
       a_type, a_field, (a_node), rb_node_field((r_node), a_field).Right());    \
     rbp_right_set(a_type, a_field, (r_node), (a_node));                        \
   } while (0)
 
 #define rbp_lean_left(a_type, a_field, a_node, r_node)                         \
   do {                                                                         \
     bool rbp_ll_red;                                                           \
     rbp_rotate_left(a_type, a_field, (a_node), (r_node));                      \
-    rbp_ll_red = rbp_red_get(a_type, a_field, (a_node));                       \
+    rbp_ll_red = rb_node_field((a_node), a_field).IsRed();                     \
     rbp_color_set(a_type, a_field, (r_node), rbp_ll_red);                      \
     rbp_red_set(a_type, a_field, (a_node));                                    \
   } while (0)
 
 #define rbp_lean_right(a_type, a_field, a_node, r_node)                        \
   do {                                                                         \
     bool rbp_lr_red;                                                           \
     rbp_rotate_right(a_type, a_field, (a_node), (r_node));                     \
-    rbp_lr_red = rbp_red_get(a_type, a_field, (a_node));                       \
+    rbp_lr_red = rb_node_field((a_node), a_field).IsRed();                     \
     rbp_color_set(a_type, a_field, (r_node), rbp_lr_red);                      \
     rbp_red_set(a_type, a_field, (a_node));                                    \
   } while (0)
 
 #define rbp_move_red_left(a_type, a_field, a_node, r_node)                     \
   do {                                                                         \
     a_type *rbp_mrl_t, *rbp_mrl_u;                                             \
     rbp_mrl_t = rb_node_field((a_node), a_field).Left();                       \
     rbp_red_set(a_type, a_field, rbp_mrl_t);                                   \
     rbp_mrl_t = rb_node_field((a_node), a_field).Right();                      \
     rbp_mrl_u = rb_node_field(rbp_mrl_t, a_field).Left();                      \
-    if (rbp_red_get(a_type, a_field, rbp_mrl_u)) {                             \
+    if (rb_node_field(rbp_mrl_u, a_field).IsRed()) {                           \
       rbp_rotate_right(a_type, a_field, rbp_mrl_t, rbp_mrl_u);                 \
       rbp_right_set(a_type, a_field, (a_node), rbp_mrl_u);                     \
       rbp_rotate_left(a_type, a_field, (a_node), (r_node));                    \
       rbp_mrl_t = rb_node_field((a_node), a_field).Right();                    \
-      if (rbp_red_get(a_type, a_field, rbp_mrl_t)) {                           \
+      if (rb_node_field(rbp_mrl_t, a_field).IsRed()) {                         \
         rbp_black_set(a_type, a_field, rbp_mrl_t);                             \
         rbp_red_set(a_type, a_field, (a_node));                                \
         rbp_rotate_left(a_type, a_field, (a_node), rbp_mrl_t);                 \
         rbp_left_set(a_type, a_field, (r_node), rbp_mrl_t);                    \
       } else {                                                                 \
         rbp_black_set(a_type, a_field, (a_node));                              \
       }                                                                        \
     } else {                                                                   \
@@ -376,42 +374,46 @@ struct RedBlackTree
       rbp_rotate_left(a_type, a_field, (a_node), (r_node));                    \
     }                                                                          \
   } while (0)
 
 #define rbp_move_red_right(a_type, a_field, a_node, r_node)                    \
   do {                                                                         \
     a_type* rbp_mrr_t;                                                         \
     rbp_mrr_t = rb_node_field((a_node), a_field).Left();                       \
-    if (rbp_red_get(a_type, a_field, rbp_mrr_t)) {                             \
+    if (rb_node_field(rbp_mrr_t, a_field).IsRed()) {                           \
       a_type *rbp_mrr_u, *rbp_mrr_v;                                           \
       rbp_mrr_u = rb_node_field(rbp_mrr_t, a_field).Right();                   \
       rbp_mrr_v = rb_node_field(rbp_mrr_u, a_field).Left();                    \
-      if (rbp_red_get(a_type, a_field, rbp_mrr_v)) {                           \
-        rbp_color_set(                                                         \
-          a_type, a_field, rbp_mrr_u, rbp_red_get(a_type, a_field, (a_node))); \
+      if (rb_node_field(rbp_mrr_v, a_field).IsRed()) {                         \
+        rbp_color_set(a_type,                                                  \
+                      a_field,                                                 \
+                      rbp_mrr_u,                                               \
+                      rb_node_field((a_node), a_field).IsRed());               \
         rbp_black_set(a_type, a_field, rbp_mrr_v);                             \
         rbp_rotate_left(a_type, a_field, rbp_mrr_t, rbp_mrr_u);                \
         rbp_left_set(a_type, a_field, (a_node), rbp_mrr_u);                    \
         rbp_rotate_right(a_type, a_field, (a_node), (r_node));                 \
         rbp_rotate_left(a_type, a_field, (a_node), rbp_mrr_t);                 \
         rbp_right_set(a_type, a_field, (r_node), rbp_mrr_t);                   \
       } else {                                                                 \
-        rbp_color_set(                                                         \
-          a_type, a_field, rbp_mrr_t, rbp_red_get(a_type, a_field, (a_node))); \
+        rbp_color_set(a_type,                                                  \
+                      a_field,                                                 \
+                      rbp_mrr_t,                                               \
+                      rb_node_field((a_node), a_field).IsRed());               \
         rbp_red_set(a_type, a_field, rbp_mrr_u);                               \
         rbp_rotate_right(a_type, a_field, (a_node), (r_node));                 \
         rbp_rotate_left(a_type, a_field, (a_node), rbp_mrr_t);                 \
         rbp_right_set(a_type, a_field, (r_node), rbp_mrr_t);                   \
       }                                                                        \
       rbp_red_set(a_type, a_field, (a_node));                                  \
     } else {                                                                   \
       rbp_red_set(a_type, a_field, rbp_mrr_t);                                 \
       rbp_mrr_t = rb_node_field(rbp_mrr_t, a_field).Left();                    \
-      if (rbp_red_get(a_type, a_field, rbp_mrr_t)) {                           \
+      if (rb_node_field(rbp_mrr_t, a_field).IsRed()) {                         \
         rbp_black_set(a_type, a_field, rbp_mrr_t);                             \
         rbp_rotate_right(a_type, a_field, (a_node), (r_node));                 \
         rbp_rotate_left(a_type, a_field, (a_node), rbp_mrr_t);                 \
         rbp_right_set(a_type, a_field, (r_node), rbp_mrr_t);                   \
       } else {                                                                 \
         rbp_rotate_left(a_type, a_field, (a_node), (r_node));                  \
       }                                                                        \
     }                                                                          \
@@ -430,18 +432,18 @@ struct RedBlackTree
     rbp_i_c = (a_tree)->rbt_root;                                              \
     /* Iteratively search down the tree for the insertion point,      */       \
     /* splitting 4-nodes as they are encountered.  At the end of each */       \
     /* iteration, rbp_i_g->rbp_i_p->rbp_i_c is a 3-level path down    */       \
     /* the tree, assuming a sufficiently deep tree.                   */       \
     while (rbp_i_c != &(a_tree)->rbt_nil) {                                    \
       rbp_i_t = rb_node_field(rbp_i_c, a_field).Left();                        \
       rbp_i_u = rb_node_field(rbp_i_t, a_field).Left();                        \
-      if (rbp_red_get(a_type, a_field, rbp_i_t) &&                             \
-          rbp_red_get(a_type, a_field, rbp_i_u)) {                             \
+      if (rb_node_field(rbp_i_t, a_field).IsRed() &&                           \
+          rb_node_field(rbp_i_u, a_field).IsRed()) {                           \
         /* rbp_i_c is the top of a logical 4-node, so split it.   */           \
         /* This iteration does not move down the tree, due to the */           \
         /* disruptiveness of node splitting.                      */           \
         /*                                                        */           \
         /* Rotate right.                                          */           \
         rbp_rotate_right(a_type, a_field, rbp_i_c, rbp_i_t);                   \
         /* Pass red links up one level.                           */           \
         rbp_i_u = rb_node_field(rbp_i_t, a_field).Left();                      \
@@ -516,18 +518,18 @@ struct RedBlackTree
     /* 4-nodes in order to maintain the invariant that the current    */       \
     /* node is not a 2-node.  This allows simple deletion once a leaf */       \
     /* is reached.  Handle the root specially though, since there may */       \
     /* be no way to convert it from a 2-node to a 3-node.             */       \
     rbp_r_cmp = (a_cmp)((a_node), rbp_r_c);                                    \
     if (rbp_r_cmp < 0) {                                                       \
       rbp_r_t = rb_node_field(rbp_r_c, a_field).Left();                        \
       rbp_r_u = rb_node_field(rbp_r_t, a_field).Left();                        \
-      if (rbp_red_get(a_type, a_field, rbp_r_t) == false &&                    \
-          rbp_red_get(a_type, a_field, rbp_r_u) == false) {                    \
+      if (rb_node_field(rbp_r_t, a_field).IsRed() == false &&                  \
+          rb_node_field(rbp_r_u, a_field).IsRed() == false) {                  \
         /* Apply standard transform to prepare for left move.     */           \
         rbp_move_red_left(a_type, a_field, rbp_r_c, rbp_r_t);                  \
         rbp_black_set(a_type, a_field, rbp_r_t);                               \
         rbp_left_set(a_type, a_field, rbp_r_p, rbp_r_t);                       \
         rbp_r_c = rbp_r_t;                                                     \
       } else {                                                                 \
         /* Move left.                                             */           \
         rbp_r_p = rbp_r_c;                                                     \
@@ -550,30 +552,30 @@ struct RedBlackTree
           /* instead swap it with its successor and delete the  */             \
           /* successor.  Record enough information to do the    */             \
           /* swap later.  rbp_r_xp is the a_node's parent.      */             \
           rbp_r_xp = rbp_r_p;                                                  \
           rbp_r_cmp = 1; /* Note that deletion is incomplete.   */             \
         }                                                                      \
       }                                                                        \
       if (rbp_r_cmp == 1) {                                                    \
-        if (rbp_red_get(                                                       \
-              a_type,                                                          \
-              a_field,                                                         \
+        if (rb_node_field(                                                     \
               rb_node_field(rb_node_field(rbp_r_c, a_field).Right(), a_field)  \
-                .Left()) == false) {                                           \
+                .Left(),                                                       \
+              a_field)                                                         \
+              .IsRed() == false) {                                             \
           rbp_r_t = rb_node_field(rbp_r_c, a_field).Left();                    \
-          if (rbp_red_get(a_type, a_field, rbp_r_t)) {                         \
+          if (rb_node_field(rbp_r_t, a_field).IsRed()) {                       \
             /* Standard transform.                            */               \
             rbp_move_red_right(a_type, a_field, rbp_r_c, rbp_r_t);             \
           } else {                                                             \
             /* Root-specific transform.                       */               \
             rbp_red_set(a_type, a_field, rbp_r_c);                             \
             rbp_r_u = rb_node_field(rbp_r_t, a_field).Left();                  \
-            if (rbp_red_get(a_type, a_field, rbp_r_u)) {                       \
+            if (rb_node_field(rbp_r_u, a_field).IsRed()) {                     \
               rbp_black_set(a_type, a_field, rbp_r_u);                         \
               rbp_rotate_right(a_type, a_field, rbp_r_c, rbp_r_t);             \
               rbp_rotate_left(a_type, a_field, rbp_r_c, rbp_r_u);              \
               rbp_right_set(a_type, a_field, rbp_r_t, rbp_r_u);                \
             } else {                                                           \
               rbp_red_set(a_type, a_field, rbp_r_t);                           \
               rbp_rotate_left(a_type, a_field, rbp_r_c, rbp_r_t);              \
             }                                                                  \
@@ -610,28 +612,28 @@ struct RedBlackTree
                          rb_node_field((a_node), a_field).Left());             \
             rbp_right_set(a_type,                                              \
                           a_field,                                             \
                           rbp_r_c,                                             \
                           rb_node_field((a_node), a_field).Right());           \
             rbp_color_set(a_type,                                              \
                           a_field,                                             \
                           rbp_r_c,                                             \
-                          rbp_red_get(a_type, a_field, (a_node)));             \
+                          rb_node_field((a_node), a_field).IsRed());           \
             if (rb_node_field(rbp_r_p, a_field).Left() == rbp_r_c) {           \
               rbp_left_set(a_type, a_field, rbp_r_p, &(a_tree)->rbt_nil);      \
             } else {                                                           \
               MOZ_ASSERT(rb_node_field(rbp_r_p, a_field).Right() == rbp_r_c);  \
               rbp_right_set(a_type, a_field, rbp_r_p, &(a_tree)->rbt_nil);     \
             }                                                                  \
             break;                                                             \
           }                                                                    \
           rbp_r_u = rb_node_field(rbp_r_t, a_field).Left();                    \
-          if (rbp_red_get(a_type, a_field, rbp_r_t) == false &&                \
-              rbp_red_get(a_type, a_field, rbp_r_u) == false) {                \
+          if (rb_node_field(rbp_r_t, a_field).IsRed() == false &&              \
+              rb_node_field(rbp_r_u, a_field).IsRed() == false) {              \
             rbp_move_red_left(a_type, a_field, rbp_r_c, rbp_r_t);              \
             if (rb_node_field(rbp_r_p, a_field).Left() == rbp_r_c) {           \
               rbp_left_set(a_type, a_field, rbp_r_p, rbp_r_t);                 \
             } else {                                                           \
               rbp_right_set(a_type, a_field, rbp_r_p, rbp_r_t);                \
             }                                                                  \
             rbp_r_c = rbp_r_t;                                                 \
           } else {                                                             \
@@ -665,17 +667,17 @@ struct RedBlackTree
               /* and delete the successor.  Record enough   */                 \
               /* information to do the swap later.          */                 \
               /* rbp_r_xp is a_node's parent.               */                 \
               rbp_r_xp = rbp_r_p;                                              \
             }                                                                  \
           }                                                                    \
           rbp_r_t = rb_node_field(rbp_r_c, a_field).Right();                   \
           rbp_r_u = rb_node_field(rbp_r_t, a_field).Left();                    \
-          if (rbp_red_get(a_type, a_field, rbp_r_u) == false) {                \
+          if (rb_node_field(rbp_r_u, a_field).IsRed() == false) {              \
             rbp_move_red_right(a_type, a_field, rbp_r_c, rbp_r_t);             \
             if (rb_node_field(rbp_r_p, a_field).Left() == rbp_r_c) {           \
               rbp_left_set(a_type, a_field, rbp_r_p, rbp_r_t);                 \
             } else {                                                           \
               rbp_right_set(a_type, a_field, rbp_r_p, rbp_r_t);                \
             }                                                                  \
             rbp_r_c = rbp_r_t;                                                 \
           } else {                                                             \