mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-22 17:35:59 +03:00
3a9689652d
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.
64 lines
1.7 KiB
C
64 lines
1.7 KiB
C
// Copyright (C) 2018 Red Hat, Inc. All rights reserved.
|
|
//
|
|
// This file is part of LVM2.
|
|
//
|
|
// This copyrighted material is made available to anyone wishing to use,
|
|
// modify, copy, or redistribute it subject to the terms and conditions
|
|
// of the GNU Lesser General Public License v.2.1.
|
|
//
|
|
// You should have received a copy of the GNU Lesser General Public License
|
|
// along with this program; if not, write to the Free Software Foundation,
|
|
// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
//----------------------------------------------------------------
|
|
|
|
#ifdef SIMPLE_RADIX_TREE
|
|
#include "base/data-struct/radix-tree-simple.c"
|
|
#else
|
|
#include "base/data-struct/radix-tree-adaptive.c"
|
|
#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;
|
|
}
|
|
|
|
//----------------------------------------------------------------
|