Some minor append cleanup, mostly around follow conditions
This commit is contained in:
@@ -610,9 +610,9 @@ static inline bool lfs_rtag_follow_(lfs_rtag_t alt,
|
|||||||
lfs_rtag_t lower, lfs_rtag_t upper, lfs_rtag_t tag) {
|
lfs_rtag_t lower, lfs_rtag_t upper, lfs_rtag_t tag) {
|
||||||
// TODO should we expect weight as an argument here?
|
// TODO should we expect weight as an argument here?
|
||||||
if (lfs_rtag_isgt(alt)) {
|
if (lfs_rtag_isgt(alt)) {
|
||||||
return lfs_rtag_weight_(tag) >= upper - lfs_rtag_weight_(alt);
|
return tag >= upper - lfs_rtag_weight_(alt);
|
||||||
} else {
|
} else {
|
||||||
return lfs_rtag_weight_(tag) < lower + lfs_rtag_weight_(alt);
|
return tag < lower + lfs_rtag_weight_(alt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1581,8 +1581,11 @@ static int lfs_rbyd_append(lfs_t *lfs, lfs_rbyd_t *rbyd_,
|
|||||||
lfs_rtag_t branch_ = lower_branch + delta;
|
lfs_rtag_t branch_ = lower_branch + delta;
|
||||||
|
|
||||||
// do bounds want to take different paths? begin cutting
|
// do bounds want to take different paths? begin cutting
|
||||||
if (!diverged && lfs_rtag_follow_(alt, lower_lower, lower_upper, lower_tag_)
|
if (!diverged
|
||||||
!= lfs_rtag_follow_(alt, lower_lower, lower_upper, upper_tag_)) {
|
&& lfs_rtag_follow_(alt,
|
||||||
|
lower_lower, lower_upper, lower_tag_)
|
||||||
|
!= lfs_rtag_follow_(alt,
|
||||||
|
lower_lower, lower_upper, upper_tag_)) {
|
||||||
diverged = true;
|
diverged = true;
|
||||||
upper_branch = lower_branch;
|
upper_branch = lower_branch;
|
||||||
upper_lower = lower_lower;
|
upper_lower = lower_lower;
|
||||||
@@ -1648,7 +1651,8 @@ static int lfs_rbyd_append(lfs_t *lfs, lfs_rbyd_t *rbyd_,
|
|||||||
// | | <b | <b |
|
// | | <b | <b |
|
||||||
// | | .-'| | .-'| |
|
// | | .-'| | .-'| |
|
||||||
// 1 2 3 4 1 2 3 4 1
|
// 1 2 3 4 1 2 3 4 1
|
||||||
if (lfs_rtag_follow_(alt, lower_lower, lower_upper, lower_tag_)) {
|
if (lfs_rtag_follow_(alt,
|
||||||
|
lower_lower, lower_upper, lower_tag_)) {
|
||||||
lfs_swap(&alt, &p_alts[0]);
|
lfs_swap(&alt, &p_alts[0]);
|
||||||
lfs_swap(&jump, &branch_);
|
lfs_swap(&jump, &branch_);
|
||||||
lfs_swap(&jump, &p_jumps[0]);
|
lfs_swap(&jump, &p_jumps[0]);
|
||||||
@@ -1691,23 +1695,22 @@ static int lfs_rbyd_append(lfs_t *lfs, lfs_rbyd_t *rbyd_,
|
|||||||
// .-'| => .-'|
|
// .-'| => .-'|
|
||||||
// 1 2 1 2 1
|
// 1 2 1 2 1
|
||||||
if (lfs_rtag_isblack(alt)
|
if (lfs_rtag_isblack(alt)
|
||||||
&& lfs_rtag_follow_(alt, lower_lower, lower_upper, lower_tag_)) {
|
&& lfs_rtag_follow_(alt,
|
||||||
|
lower_lower, lower_upper, lower_tag_)) {
|
||||||
alt = lfs_rtag_flip_(alt, lower_lower, lower_upper);
|
alt = lfs_rtag_flip_(alt, lower_lower, lower_upper);
|
||||||
lfs_swap(&jump, &branch_);
|
lfs_swap(&jump, &branch_);
|
||||||
}
|
}
|
||||||
|
|
||||||
// should've taken red alt? needs a flip
|
// should've taken red alt? needs a flip
|
||||||
// TODO should we just get rid of follows and prefer explicit comparisons?
|
|
||||||
// <r >r
|
// <r >r
|
||||||
// .----'| .-'|
|
// .----'| .-'|
|
||||||
// | <b => | >b
|
// | <b => | >b
|
||||||
// | .-'| .--|-'|
|
// | .-'| .--|-'|
|
||||||
// 1 2 3 1 2 3 1
|
// 1 2 3 1 2 3 1
|
||||||
if (p_alts[0]
|
if (p_alts[0]
|
||||||
&& ((lfs_rtag_islt(p_alts[0])
|
&& lfs_rtag_follow_(
|
||||||
&& lower_tag_ < lower_lower)
|
p_alts[0] - lfs_rtag_weight_(p_alts[0]),
|
||||||
|| (lfs_rtag_isgt(p_alts[0])
|
lower_lower, lower_upper, lower_tag_)) {
|
||||||
&& lower_tag_ >= lower_upper))) {
|
|
||||||
LFS_ASSERT(lfs_rtag_isred(p_alts[0]));
|
LFS_ASSERT(lfs_rtag_isred(p_alts[0]));
|
||||||
LFS_ASSERT(lfs_rtag_isblack(alt));
|
LFS_ASSERT(lfs_rtag_isblack(alt));
|
||||||
|
|
||||||
@@ -1737,7 +1740,6 @@ static int lfs_rbyd_append(lfs_t *lfs, lfs_rbyd_t *rbyd_,
|
|||||||
lower_branch = branch_;
|
lower_branch = branch_;
|
||||||
|
|
||||||
// found end of tree?
|
// found end of tree?
|
||||||
// TODO just break? the gotos above are smelly
|
|
||||||
} else {
|
} else {
|
||||||
// update the tag id
|
// update the tag id
|
||||||
lower_tag_ = lfs_rtag_setid(alt, lfs_rtag_id(lower_upper-1));
|
lower_tag_ = lfs_rtag_setid(alt, lfs_rtag_id(lower_upper-1));
|
||||||
|
|||||||
Reference in New Issue
Block a user