Bug 1403444 - Expand rb_new, rb_first, rb_last, rb_next and rb_prev. r?njn draft
authorMike Hommey <mh+mozilla@glandium.org>
Tue, 26 Sep 2017 15:47:50 +0900
changeset 670924 b5a37bce211143e98856cf252f8e52f414425977
parent 670923 1a36d9db84195e54716692968d4e69d8ca29db75
child 670925 d579e91b756b60ca5189671744eb7f95b9fe2b86
push id81767
push userbmo:mh+mozilla@glandium.org
push dateWed, 27 Sep 2017 06:43:40 +0000
reviewersnjn
bugs1403444
milestone58.0a1
Bug 1403444 - Expand rb_new, rb_first, rb_last, rb_next and rb_prev. 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
@@ -135,24 +135,16 @@ public:
 /* 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 initializer. */
-#define rb_new(a_type, a_field, a_tree)                                        \
-  do {                                                                         \
-    (a_tree)->rbt_root = &(a_tree)->rbt_nil;                                   \
-    rbp_node_new(a_type, a_field, a_tree, &(a_tree)->rbt_nil);                 \
-    rb_node_field(&(a_tree)->rbt_nil, a_field).SetColor(NodeColor::Black);     \
-  } 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)
@@ -214,48 +206,16 @@ public:
         } else {                                                               \
           break;                                                               \
         }                                                                      \
         MOZ_ASSERT(rbp_p_t != &(a_tree)->rbt_nil);                             \
       }                                                                        \
     }                                                                          \
   } while (0)
 
-#define rb_first(a_type, a_field, a_tree, r_node)                              \
-  do {                                                                         \
-    rbp_first(a_type, a_field, a_tree, (a_tree)->rbt_root, (r_node));          \
-    if ((r_node) == &(a_tree)->rbt_nil) {                                      \
-      (r_node) = nullptr;                                                      \
-    }                                                                          \
-  } while (0)
-
-#define rb_last(a_type, a_field, a_tree, r_node)                               \
-  do {                                                                         \
-    rbp_last(a_type, a_field, a_tree, (a_tree)->rbt_root, r_node);             \
-    if ((r_node) == &(a_tree)->rbt_nil) {                                      \
-      (r_node) = nullptr;                                                      \
-    }                                                                          \
-  } while (0)
-
-#define rb_next(a_type, a_field, a_cmp, a_tree, a_node, r_node)                \
-  do {                                                                         \
-    rbp_next(a_type, a_field, a_cmp, a_tree, (a_node), (r_node));              \
-    if ((r_node) == &(a_tree)->rbt_nil) {                                      \
-      (r_node) = nullptr;                                                      \
-    }                                                                          \
-  } while (0)
-
-#define rb_prev(a_type, a_field, a_cmp, a_tree, a_node, r_node)                \
-  do {                                                                         \
-    rbp_prev(a_type, a_field, a_cmp, a_tree, (a_node), (r_node));              \
-    if ((r_node) == &(a_tree)->rbt_nil) {                                      \
-      (r_node) = nullptr;                                                      \
-    }                                                                          \
-  } while (0)
-
 #define rb_search(a_type, a_field, a_cmp, a_tree, a_key, r_node)               \
   do {                                                                         \
     int rbp_se_cmp;                                                            \
     (r_node) = (a_tree)->rbt_root;                                             \
     while ((r_node) != &(a_tree)->rbt_nil &&                                   \
            (rbp_se_cmp = (a_cmp)((a_key), (r_node))) != 0) {                   \
       if (rbp_se_cmp < 0) {                                                    \
         (r_node) = rb_node_field((r_node), a_field).Left();                    \
@@ -664,45 +624,47 @@ public:
 template<typename T, typename Trait>
 struct RedBlackTree
 {
   T* rbt_root;
   T rbt_nil;
 
   void Init()
   {
-    rb_new(T, Trait::GetTreeNode, this);
+    rbt_root = &rbt_nil;
+    rbp_node_new(T, Trait::GetTreeNode, this, &rbt_nil);
+    rb_node_field(&rbt_nil, Trait::GetTreeNode).SetColor(NodeColor::Black);
   }
 
   T* First()
   {
     T* ret;
-    rb_first(T, Trait::GetTreeNode, this, ret);
-    return ret;
+    rbp_first(T, Trait::GetTreeNode, this, rbt_root, (ret));
+    return (ret == &rbt_nil) ? nullptr : ret;
   }
 
   T* Last()
   {
     T* ret;
-    rb_last(T, Trait::GetTreeNode, this, ret);
-    return ret;
+    rbp_last(T, Trait::GetTreeNode, this, rbt_root, ret);
+    return (ret == &rbt_nil) ? nullptr : ret;
   }
 
   T* Next(T* aNode)
   {
     T* ret;
-    rb_next(T, Trait::GetTreeNode, Trait::Compare, this, aNode, ret);
-    return ret;
+    rbp_next(T, Trait::GetTreeNode, Trait::Compare, this, (aNode), (ret));
+    return (ret == &rbt_nil) ? nullptr : ret;
   }
 
   T* Prev(T* aNode)
   {
     T* ret;
-    rb_prev(T, Trait::GetTreeNode, Trait::Compare, this, aNode, ret);
-    return ret;
+    rbp_prev(T, Trait::GetTreeNode, Trait::Compare, this, (aNode), (ret));
+    return (ret == &rbt_nil) ? nullptr : ret;
   }
 
   T* Search(T* aKey)
   {
     T* ret;
     rb_search(T, Trait::GetTreeNode, Trait::Compare, this, aKey, ret);
     return ret;
   }