QDict: Introduce new iteration API
It's composed of functions qdict_first() and qdict_next(), plus
functions to access QDictEntry values.
This API was suggested by Markus Armbruster <armbru@redhat.com> and
it offers full control over the iteration process.
The usage is simple, the following example prints all keys in 'qdict'
(it's hopefully better than any English description):
QDict *qdict;
const QDictEntry *ent;
[...]
for (ent = qdict_first(qdict); ent; ent = qdict_next(qdict, ent)) {
printf("%s ", qdict_entry_key(ent));
}
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
This commit is contained in:
parent
0d078b2ade
commit
f2b07f35d2
37
qdict.c
37
qdict.c
@ -345,6 +345,43 @@ void qdict_iter(const QDict *qdict,
|
||||
}
|
||||
}
|
||||
|
||||
static QDictEntry *qdict_next_entry(const QDict *qdict, int first_bucket)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = first_bucket; i < QDICT_BUCKET_MAX; i++) {
|
||||
if (!QLIST_EMPTY(&qdict->table[i])) {
|
||||
return QLIST_FIRST(&qdict->table[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* qdict_first(): Return first qdict entry for iteration.
|
||||
*/
|
||||
const QDictEntry *qdict_first(const QDict *qdict)
|
||||
{
|
||||
return qdict_next_entry(qdict, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* qdict_next(): Return next qdict entry in an iteration.
|
||||
*/
|
||||
const QDictEntry *qdict_next(const QDict *qdict, const QDictEntry *entry)
|
||||
{
|
||||
QDictEntry *ret;
|
||||
|
||||
ret = QLIST_NEXT(entry, next);
|
||||
if (!ret) {
|
||||
unsigned int bucket = tdb_hash(entry->key) % QDICT_BUCKET_MAX;
|
||||
ret = qdict_next_entry(qdict, bucket + 1);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* qentry_destroy(): Free all the memory allocated by a QDictEntry
|
||||
*/
|
||||
|
||||
2
qdict.h
2
qdict.h
@ -45,6 +45,8 @@ QDict *qobject_to_qdict(const QObject *obj);
|
||||
void qdict_iter(const QDict *qdict,
|
||||
void (*iter)(const char *key, QObject *obj, void *opaque),
|
||||
void *opaque);
|
||||
const QDictEntry *qdict_first(const QDict *qdict);
|
||||
const QDictEntry *qdict_next(const QDict *qdict, const QDictEntry *entry);
|
||||
|
||||
/* Helper to qdict_put_obj(), accepts any object */
|
||||
#define qdict_put(qdict, key, obj) \
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user