mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-21 13:34:40 +03:00
radix_tree: add radix_tree_values
To more easily adopt radix_tree over existing code base, add abstraction over 'radix_tree_iterate' which basically builds an array of all traversed values, and then it's just easy to go over all array elements. TODO: code should be converted to use radix_tree_iterate() directly as it's more efficient. Note: it can be possibly to rewrite recursive _iterate() usage to linear travesal, not sure whether it's worth the effort as conversion to 'radix_itree_iterator' is relatively simple.
This commit is contained in:
parent
1813d0d186
commit
3a9689652d
@ -19,3 +19,45 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
//----------------------------------------------------------------
|
//----------------------------------------------------------------
|
||||||
|
|
||||||
|
struct visitor {
|
||||||
|
struct radix_tree_iterator it;
|
||||||
|
unsigned pos, nr_entries;
|
||||||
|
union radix_value *values;
|
||||||
|
};
|
||||||
|
|
||||||
|
static bool _visitor(struct radix_tree_iterator *it,
|
||||||
|
const void *key, size_t keylen,
|
||||||
|
union radix_value v)
|
||||||
|
{
|
||||||
|
struct visitor *vt = container_of(it, struct visitor, it);
|
||||||
|
|
||||||
|
if (vt->pos >= vt->nr_entries)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
vt->values[vt->pos++] = v;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool radix_tree_values(struct radix_tree *rt, const void *key, size_t keylen,
|
||||||
|
union radix_value **values, unsigned *nr_values)
|
||||||
|
{
|
||||||
|
struct visitor vt = {
|
||||||
|
.it.visit = _visitor,
|
||||||
|
.nr_entries = rt->nr_entries,
|
||||||
|
.values = calloc(rt->nr_entries + 1, sizeof(union radix_value)),
|
||||||
|
};
|
||||||
|
|
||||||
|
if (vt.values) {
|
||||||
|
// build set of all values in current radix tree
|
||||||
|
radix_tree_iterate(rt, key, keylen, &vt.it);
|
||||||
|
*nr_values = vt.pos;
|
||||||
|
*values = vt.values;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------
|
||||||
|
@ -54,6 +54,12 @@ struct radix_tree_iterator {
|
|||||||
void radix_tree_iterate(struct radix_tree *rt, const void *key, size_t keylen,
|
void radix_tree_iterate(struct radix_tree *rt, const void *key, size_t keylen,
|
||||||
struct radix_tree_iterator *it);
|
struct radix_tree_iterator *it);
|
||||||
|
|
||||||
|
// Alternative traversing radix_tree.
|
||||||
|
// Builds whole set all radix_tree nr_values values.
|
||||||
|
// After use, free(values).
|
||||||
|
bool radix_tree_values(struct radix_tree *rt, const void *key, size_t keylen,
|
||||||
|
union radix_value **values, unsigned *nr_values);
|
||||||
|
|
||||||
// Checks that some constraints on the shape of the tree are
|
// Checks that some constraints on the shape of the tree are
|
||||||
// being held. For debug only.
|
// being held. For debug only.
|
||||||
bool radix_tree_is_well_formed(struct radix_tree *rt);
|
bool radix_tree_is_well_formed(struct radix_tree *rt);
|
||||||
|
Loading…
Reference in New Issue
Block a user