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