Added separate lfsr_btree_lookupnext_/lfsr_btree_lookupnext
- lfsr_btree_lookupnext_ => gives you the underlying rbyd/rid, intended for btree-internal use. - lfsr_btree_lookupnext => does not give you underlying rbyd/rid, used for general purpose lookups/iteration. This is for consistency with other *_lookupnext functions, and discourages use of the leaf rbyd/rid. These are sensitive to internal btree state.
This commit is contained in:
@@ -3044,8 +3044,7 @@ static lfs_ssize_t lfsr_btree_fromdisk(lfs_t *lfs, lfsr_btree_t *btree,
|
||||
|
||||
// B-tree operations
|
||||
|
||||
// TODO should there be a different lfsr_btree_lookupnext without rbyd_/rid_?
|
||||
static int lfsr_btree_lookupnext(lfs_t *lfs,
|
||||
static int lfsr_btree_lookupnext_(lfs_t *lfs,
|
||||
const lfsr_btree_t *btree, lfs_size_t bid,
|
||||
lfs_size_t *bid_, lfsr_rbyd_t *rbyd_, lfs_ssize_t *rid_,
|
||||
lfsr_tag_t *tag_, lfs_size_t *weight_,
|
||||
@@ -3181,13 +3180,22 @@ static int lfsr_btree_lookupnext(lfs_t *lfs,
|
||||
}
|
||||
}
|
||||
|
||||
static int lfsr_btree_lookupnext(lfs_t *lfs,
|
||||
const lfsr_btree_t *btree, lfs_size_t bid,
|
||||
lfs_size_t *bid_, lfsr_tag_t *tag_, lfs_size_t *weight_,
|
||||
lfsr_data_t *data_, bool validate) {
|
||||
return lfsr_btree_lookupnext_(lfs, btree, bid,
|
||||
bid_, NULL, NULL, tag_, weight_, data_,
|
||||
validate);
|
||||
}
|
||||
|
||||
static int lfsr_btree_lookup(lfs_t *lfs,
|
||||
const lfsr_btree_t *btree, lfs_size_t bid,
|
||||
lfsr_tag_t *tag_, lfs_size_t *weight_,
|
||||
lfsr_data_t *data_, bool validate) {
|
||||
lfs_size_t bid_;
|
||||
int err = lfsr_btree_lookupnext(lfs, btree, bid,
|
||||
&bid_, NULL, NULL, tag_, weight_, data_,
|
||||
&bid_, tag_, weight_, data_,
|
||||
validate);
|
||||
if (err) {
|
||||
return err;
|
||||
@@ -4077,7 +4085,7 @@ static int lfsr_btree_push(lfs_t *lfs, lfsr_btree_t *btree,
|
||||
lfsr_rbyd_t rbyd = btree->root;
|
||||
lfs_ssize_t rid = -1;
|
||||
lfs_size_t rweight = 0;
|
||||
int err = lfsr_btree_lookupnext(lfs, btree, bid_,
|
||||
int err = lfsr_btree_lookupnext_(lfs, btree, bid_,
|
||||
NULL, &rbyd, &rid, NULL, &rweight, NULL,
|
||||
false);
|
||||
if (err && err != LFS_ERR_NOENT) {
|
||||
@@ -4146,7 +4154,7 @@ static int lfsr_btree_update(lfs_t *lfs, lfsr_btree_t *btree,
|
||||
lfsr_tag_t rtag;
|
||||
lfs_ssize_t rid;
|
||||
lfs_size_t rweight;
|
||||
int err = lfsr_btree_lookupnext(lfs, btree, bid,
|
||||
int err = lfsr_btree_lookupnext_(lfs, btree, bid,
|
||||
NULL, &rbyd, &rid, &rtag, &rweight, NULL,
|
||||
false);
|
||||
if (err) {
|
||||
@@ -4201,7 +4209,7 @@ static int lfsr_btree_pop(lfs_t *lfs, lfsr_btree_t *btree, lfs_size_t bid) {
|
||||
lfsr_tag_t rtag;
|
||||
lfs_ssize_t rid;
|
||||
lfs_size_t rweight;
|
||||
int err = lfsr_btree_lookupnext(lfs, btree, bid,
|
||||
int err = lfsr_btree_lookupnext_(lfs, btree, bid,
|
||||
NULL, &rbyd, &rid, &rtag, &rweight, NULL,
|
||||
false);
|
||||
if (err) {
|
||||
@@ -4317,7 +4325,7 @@ static int lfsr_btree_split(lfs_t *lfs, lfsr_btree_t *btree,
|
||||
lfsr_rbyd_t rbyd;
|
||||
lfs_ssize_t rid;
|
||||
lfs_size_t rweight;
|
||||
int err = lfsr_btree_lookupnext(lfs, btree, bid,
|
||||
int err = lfsr_btree_lookupnext_(lfs, btree, bid,
|
||||
NULL, &rbyd, &rid, NULL, &rweight, NULL,
|
||||
false);
|
||||
if (err) {
|
||||
|
||||
+17
-34
@@ -570,8 +570,7 @@ code = '''
|
||||
lfsr_data_t data_;
|
||||
for (lfs_size_t i = 0; i < n; i++) {
|
||||
lfsr_btree_lookupnext(&lfs, &btree, id_+1,
|
||||
&id_, NULL, NULL, &tag_, &weight_,
|
||||
&data_, VALIDATE) => 0;
|
||||
&id_, &tag_, &weight_, &data_, VALIDATE) => 0;
|
||||
assert(id_ == i*W+W-1);
|
||||
assert(tag_ == LFSR_TAG_INLINED);
|
||||
assert(weight_ == W);
|
||||
@@ -580,8 +579,7 @@ code = '''
|
||||
assert(memcmp(buffer, &alphas[i % 26], 1) == 0);
|
||||
}
|
||||
lfsr_btree_lookupnext(&lfs, &btree, id_+1,
|
||||
&id_, NULL, NULL, &tag_, &weight_,
|
||||
&data_, VALIDATE) => LFS_ERR_NOENT;
|
||||
&id_, &tag_, &weight_, &data_, VALIDATE) => LFS_ERR_NOENT;
|
||||
'''
|
||||
|
||||
[cases.test_btree_push_sparse_fuzz]
|
||||
@@ -721,8 +719,7 @@ code = '''
|
||||
}
|
||||
|
||||
lfsr_btree_lookupnext(&lfs, &btree, id_+1,
|
||||
&id_, NULL, NULL, &tag_, &weight_,
|
||||
&data_, VALIDATE) => 0;
|
||||
&id_, &tag_, &weight_, &data_, VALIDATE) => 0;
|
||||
assert(id_ == weighted_id+sim_weights[i]-1);
|
||||
assert(tag_ == LFSR_TAG_INLINED);
|
||||
assert(weight_ == sim_weights[i]);
|
||||
@@ -731,8 +728,7 @@ code = '''
|
||||
assert(memcmp(buffer, &sim[i], 1) == 0);
|
||||
}
|
||||
lfsr_btree_lookupnext(&lfs, &btree, id_+1,
|
||||
&id_, NULL, NULL, &tag_, &weight_,
|
||||
&data_, VALIDATE) => LFS_ERR_NOENT;
|
||||
&id_, &tag_, &weight_, &data_, VALIDATE) => LFS_ERR_NOENT;
|
||||
|
||||
// clean up sim
|
||||
free(sim);
|
||||
@@ -1168,8 +1164,7 @@ code = '''
|
||||
lfsr_data_t data_;
|
||||
for (lfs_size_t i = 0; i < N; i++) {
|
||||
lfsr_btree_lookupnext(&lfs, &btree, id_+1,
|
||||
&id_, NULL, NULL, &tag_, &weight_,
|
||||
&data_, VALIDATE) => 0;
|
||||
&id_, &tag_, &weight_, &data_, VALIDATE) => 0;
|
||||
assert(id_ == i*W+W-1);
|
||||
assert(tag_ == LFSR_TAG_INLINED);
|
||||
assert(weight_ == W);
|
||||
@@ -1178,8 +1173,7 @@ code = '''
|
||||
assert(memcmp(buffer, &uppers[i % 26], 1) == 0);
|
||||
}
|
||||
lfsr_btree_lookupnext(&lfs, &btree, id_+1,
|
||||
&id_, NULL, NULL, &tag_, &weight_,
|
||||
&data_, VALIDATE) => LFS_ERR_NOENT;
|
||||
&id_, &tag_, &weight_, &data_, VALIDATE) => LFS_ERR_NOENT;
|
||||
'''
|
||||
|
||||
[cases.test_btree_update_sparse_fuzz]
|
||||
@@ -1330,8 +1324,7 @@ code = '''
|
||||
}
|
||||
|
||||
lfsr_btree_lookupnext(&lfs, &btree, id_+1,
|
||||
&id_, NULL, NULL, &tag_, &weight_,
|
||||
&data_, VALIDATE) => 0;
|
||||
&id_, &tag_, &weight_, &data_, VALIDATE) => 0;
|
||||
assert(id_ == weighted_id+sim_weights[i]-1);
|
||||
assert(tag_ == LFSR_TAG_INLINED);
|
||||
assert(weight_ == sim_weights[i]);
|
||||
@@ -1340,8 +1333,7 @@ code = '''
|
||||
assert(memcmp(buffer, &sim[i], 1) == 0);
|
||||
}
|
||||
lfsr_btree_lookupnext(&lfs, &btree, id_+1,
|
||||
&id_, NULL, NULL, &tag_, &weight_,
|
||||
&data_, VALIDATE) => LFS_ERR_NOENT;
|
||||
&id_, &tag_, &weight_, &data_, VALIDATE) => LFS_ERR_NOENT;
|
||||
|
||||
// clean up sim
|
||||
free(sim);
|
||||
@@ -2052,8 +2044,7 @@ code = '''
|
||||
lfsr_data_t data_;
|
||||
for (lfs_size_t i = 0; i < REMAINING; i++) {
|
||||
lfsr_btree_lookupnext(&lfs, &btree, id_+1,
|
||||
&id_, NULL, NULL, &tag_, &weight_,
|
||||
&data_, VALIDATE) => 0;
|
||||
&id_, &tag_, &weight_, &data_, VALIDATE) => 0;
|
||||
assert(id_ == i*W+W-1);
|
||||
assert(tag_ == LFSR_TAG_INLINED);
|
||||
assert(weight_ == W);
|
||||
@@ -2063,8 +2054,7 @@ code = '''
|
||||
}
|
||||
|
||||
lfsr_btree_lookupnext(&lfs, &btree, id_+1,
|
||||
&id_, NULL, NULL, &tag_, &weight_,
|
||||
&data_, VALIDATE) => 0;
|
||||
&id_, &tag_, &weight_, &data_, VALIDATE) => 0;
|
||||
assert(id_ == REMAINING*W+W-1);
|
||||
assert(tag_ == LFSR_TAG_INLINED);
|
||||
assert(weight_ == W);
|
||||
@@ -2073,8 +2063,7 @@ code = '''
|
||||
assert(memcmp(buffer, "R", 1) == 0);
|
||||
|
||||
lfsr_btree_lookupnext(&lfs, &btree, id_+1,
|
||||
&id_, NULL, NULL, &tag_, &weight_,
|
||||
&data_, VALIDATE) => LFS_ERR_NOENT;
|
||||
&id_, &tag_, &weight_, &data_, VALIDATE) => LFS_ERR_NOENT;
|
||||
'''
|
||||
|
||||
[cases.test_btree_pop_sparse_fuzz]
|
||||
@@ -2238,8 +2227,7 @@ code = '''
|
||||
}
|
||||
|
||||
lfsr_btree_lookupnext(&lfs, &btree, id_+1,
|
||||
&id_, NULL, NULL, &tag_, &weight_,
|
||||
&data_, VALIDATE) => 0;
|
||||
&id_, &tag_, &weight_, &data_, VALIDATE) => 0;
|
||||
assert(id_ == weighted_id+sim_weights[i]-1);
|
||||
assert(tag_ == LFSR_TAG_INLINED);
|
||||
assert(weight_ == sim_weights[i]);
|
||||
@@ -2248,8 +2236,7 @@ code = '''
|
||||
assert(memcmp(buffer, &sim[i], 1) == 0);
|
||||
}
|
||||
lfsr_btree_lookupnext(&lfs, &btree, id_+1,
|
||||
&id_, NULL, NULL, &tag_, &weight_,
|
||||
&data_, VALIDATE) => LFS_ERR_NOENT;
|
||||
&id_, &tag_, &weight_, &data_, VALIDATE) => LFS_ERR_NOENT;
|
||||
|
||||
// clean up sim
|
||||
free(sim);
|
||||
@@ -2628,8 +2615,7 @@ code = '''
|
||||
}
|
||||
|
||||
lfsr_btree_lookupnext(&lfs, &btree, id_+1,
|
||||
&id_, NULL, NULL, &tag_, &weight_,
|
||||
&data_, VALIDATE) => 0;
|
||||
&id_, &tag_, &weight_, &data_, VALIDATE) => 0;
|
||||
assert(id_ == weighted_id+sim_weights[i]-1);
|
||||
assert(tag_ == LFSR_TAG_INLINED);
|
||||
assert(weight_ == sim_weights[i]);
|
||||
@@ -2638,8 +2624,7 @@ code = '''
|
||||
assert(memcmp(buffer, &sim[i], 1) == 0);
|
||||
}
|
||||
lfsr_btree_lookupnext(&lfs, &btree, id_+1,
|
||||
&id_, NULL, NULL, &tag_, &weight_,
|
||||
&data_, VALIDATE) => LFS_ERR_NOENT;
|
||||
&id_, &tag_, &weight_, &data_, VALIDATE) => LFS_ERR_NOENT;
|
||||
|
||||
// clean up sim
|
||||
free(sim);
|
||||
@@ -2951,8 +2936,7 @@ code = '''
|
||||
}
|
||||
|
||||
lfsr_btree_lookupnext(&lfs, &btree, id_+1,
|
||||
&id_, NULL, NULL, &tag_, &weight_,
|
||||
&data_, VALIDATE) => 0;
|
||||
&id_, &tag_, &weight_, &data_, VALIDATE) => 0;
|
||||
assert(id_ == weighted_id+sim_weights[i]-1);
|
||||
assert(tag_ == LFSR_TAG_INLINED);
|
||||
assert(weight_ == sim_weights[i]);
|
||||
@@ -2961,8 +2945,7 @@ code = '''
|
||||
assert(memcmp(buffer, &sim[i], 1) == 0);
|
||||
}
|
||||
lfsr_btree_lookupnext(&lfs, &btree, id_+1,
|
||||
&id_, NULL, NULL, &tag_, &weight_,
|
||||
&data_, VALIDATE) => LFS_ERR_NOENT;
|
||||
&id_, &tag_, &weight_, &data_, VALIDATE) => LFS_ERR_NOENT;
|
||||
|
||||
// clean up sim
|
||||
free(sim);
|
||||
|
||||
Reference in New Issue
Block a user