Bug 1403444 - Abstract red-black-tree link field reference with a new macro. r?njn draft
authorMike Hommey <mh+mozilla@glandium.org>
Mon, 25 Sep 2017 07:03:37 +0900
changeset 671608 cb1204dc92c1109b5e9b6478c3b5a5da57af2911
parent 671607 1785a3635aa47f363613a394fb700087ca00065a
child 671609 9ad31c791faa7791a5d7dc3c937f426e3b8bc25f
push id81993
push userbmo:mh+mozilla@glandium.org
push dateThu, 28 Sep 2017 04:40:59 +0000
reviewersnjn
bugs1403444
milestone58.0a1
Bug 1403444 - Abstract red-black-tree link field reference with a new macro. r?njn While we're going in the opposite direction, moving away from macros, upcoming intermediate steps are going to "manually" expand macros, but later steps will require changing how the link field reference is done, and having it in a single location then will be more convenient.
memory/build/rb.h
--- a/memory/build/rb.h
+++ b/memory/build/rb.h
@@ -129,34 +129,40 @@ public:
 /* Root structure. */
 template <typename T>
 struct RedBlackTree
 {
   T* rbt_root;
   T rbt_nil;
 };
 
+#define rb_node_field(a_node, a_field) (a_node)->a_field
+
 /* Left accessors. */
-#define rbp_left_get(a_type, a_field, a_node) (a_node)->a_field.Left()
+#define rbp_left_get(a_type, a_field, a_node)                                  \
+  rb_node_field(a_node, a_field).Left()
 #define rbp_left_set(a_type, a_field, a_node, a_left)                          \
-  (a_node)->a_field.SetLeft(a_left)
+  rb_node_field(a_node, a_field).SetLeft(a_left)
 
 /* Right accessors. */
-#define rbp_right_get(a_type, a_field, a_node) (a_node)->a_field.Right()
+#define rbp_right_get(a_type, a_field, a_node)                                 \
+  rb_node_field(a_node, a_field).Right()
 #define rbp_right_set(a_type, a_field, a_node, a_right)                        \
-  (a_node)->a_field.SetRight(a_right)
+  rb_node_field(a_node, a_field).SetRight(a_right)
 
 /* Color accessors. */
-#define rbp_red_get(a_type, a_field, a_node) (a_node)->a_field.IsRed()
+#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)                          \
-  (a_node)->a_field.SetColor(a_red ? NodeColor::Red : NodeColor::Black)
+  rb_node_field(a_node, a_field)                                               \
+    .SetColor(a_red ? NodeColor::Red : NodeColor::Black)
 #define rbp_red_set(a_type, a_field, a_node)                                   \
-  (a_node)->a_field.SetColor(NodeColor::Red)
+  rb_node_field(a_node, a_field).SetColor(NodeColor::Red)
 #define rbp_black_set(a_type, a_field, a_node)                                 \
-  (a_node)->a_field.SetColor(NodeColor::Black)
+  rb_node_field(a_node, a_field).SetColor(NodeColor::Black)
 
 /* Node initializer. */
 #define rbp_node_new(a_type, a_field, a_tree, a_node)                          \
   do {                                                                         \
     rbp_left_set(a_type, a_field, (a_node), &(a_tree)->rbt_nil);               \
     rbp_right_set(a_type, a_field, (a_node), &(a_tree)->rbt_nil);              \
     rbp_red_set(a_type, a_field, (a_node));                                    \
   } while (0)