--- 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;