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…
Reference in New Issue
Block a user