--- 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 { \