Bug 1403444 - Allow First and Last to take a start node, and use that in Next and Prev. r?njn
--- a/memory/build/rb.h
+++ b/memory/build/rb.h
@@ -510,36 +510,35 @@ struct RedBlackTree
void Init()
{
rbt_root = &rbt_nil;
Trait::GetTreeNode(&rbt_nil).SetLeft(&rbt_nil);
Trait::GetTreeNode(&rbt_nil).SetRight(&rbt_nil);
Trait::GetTreeNode(&rbt_nil).SetColor(NodeColor::Black);
}
- T* First()
+ T* First(T* aStart = nullptr)
{
T* ret;
- rbp_first(T, Trait::GetTreeNode, this, rbt_root, (ret));
+ rbp_first(T, Trait::GetTreeNode, this, (aStart ? aStart : rbt_root), (ret));
return (ret == &rbt_nil) ? nullptr : ret;
}
- T* Last()
+ T* Last(T* aStart = nullptr)
{
T* ret;
- rbp_last(T, Trait::GetTreeNode, this, rbt_root, ret);
+ rbp_last(T, Trait::GetTreeNode, this, (aStart ? aStart : rbt_root), ret);
return (ret == &rbt_nil) ? nullptr : ret;
}
T* Next(T* aNode)
{
T* ret;
if (Trait::GetTreeNode(aNode).Right() != &rbt_nil) {
- rbp_first(
- T, Trait::GetTreeNode, this, Trait::GetTreeNode(aNode).Right(), (ret));
+ ret = First(Trait::GetTreeNode(aNode).Right());
} else {
T* rbp_n_t = rbt_root;
MOZ_ASSERT(rbp_n_t != &rbt_nil);
ret = &rbt_nil;
while (true) {
int rbp_n_cmp = Trait::Compare(aNode, rbp_n_t);
if (rbp_n_cmp < 0) {
ret = rbp_n_t;
@@ -554,18 +553,17 @@ struct RedBlackTree
}
return (ret == &rbt_nil) ? nullptr : ret;
}
T* Prev(T* aNode)
{
T* ret;
if (Trait::GetTreeNode(aNode).Left() != &rbt_nil) {
- rbp_last(
- T, Trait::GetTreeNode, this, Trait::GetTreeNode(aNode).Left(), (ret));
+ ret = Last(Trait::GetTreeNode(aNode).Left());
} else {
T* rbp_p_t = rbt_root;
MOZ_ASSERT(rbp_p_t != &rbt_nil);
ret = &rbt_nil;
while (true) {
int rbp_p_cmp = Trait::Compare(aNode, rbp_p_t);
if (rbp_p_cmp < 0) {
rbp_p_t = Trait::GetTreeNode(rbp_p_t).Left();