Some minor append cleanup, mostly around follow conditions

This commit is contained in:
Christopher Haster
2023-01-07 02:04:57 -06:00
parent 6a5aae98fc
commit 21012dbb1b
+14 -12
View File
@@ -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));