[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 12/23] QDict: Introduce new iteration API
From: |
Luiz Capitulino |
Subject: |
[Qemu-devel] [PATCH 12/23] QDict: Introduce new iteration API |
Date: |
Thu, 1 Jul 2010 16:21:40 -0300 |
It's composed of functions qdict_first() and qdict_next(), plus
functions to access QDictEntry values.
This API was suggested by Markus Armbruster <address@hidden> 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 <address@hidden>
---
qdict.c | 37 +++++++++++++++++++++++++++++++++++++
qdict.h | 2 ++
2 files changed, 39 insertions(+), 0 deletions(-)
diff --git a/qdict.c b/qdict.c
index c467763..a28a0a9 100644
--- a/qdict.c
+++ b/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
*/
diff --git a/qdict.h b/qdict.h
index 0c8de3c..0e7a43f 100644
--- a/qdict.h
+++ b/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) \
--
1.7.2.rc0
- [Qemu-devel] [PATCH 04/23] QMP: Teach basic capability negotiation to python example, (continued)
- [Qemu-devel] [PATCH 04/23] QMP: Teach basic capability negotiation to python example, Luiz Capitulino, 2010/07/01
- [Qemu-devel] [PATCH 05/23] QMP: Fix python helper /wrt long return strings, Luiz Capitulino, 2010/07/01
- [Qemu-devel] [PATCH 06/23] net: delete QemuOpts when net_client_init() fails., Luiz Capitulino, 2010/07/01
- [Qemu-devel] [PATCH 07/23] QMP: Fix error reporting in the async API, Luiz Capitulino, 2010/07/01
- [Qemu-devel] [PATCH 09/23] QDict: Rename 'err_value', Luiz Capitulino, 2010/07/01
- [Qemu-devel] [PATCH 08/23] QError: Enhance QERR_DEVICE_NOT_ACTIVE's user desc, Luiz Capitulino, 2010/07/01
- [Qemu-devel] [PATCH 11/23] QDict: Introduce functions to retrieve QDictEntry values, Luiz Capitulino, 2010/07/01
- [Qemu-devel] [PATCH 10/23] QDict: Small terminology change, Luiz Capitulino, 2010/07/01
- [Qemu-devel] [PATCH 13/23] check-qdict: Introduce test for the new iteration API, Luiz Capitulino, 2010/07/01
- [Qemu-devel] [PATCH 14/23] QDict: Introduce qdict_get_try_bool(), Luiz Capitulino, 2010/07/01
- [Qemu-devel] [PATCH 12/23] QDict: Introduce new iteration API,
Luiz Capitulino <=
- [Qemu-devel] [PATCH 15/23] Monitor: handle optional '-' arg as a bool, Luiz Capitulino, 2010/07/01
- [Qemu-devel] [PATCH 16/23] QMP: New argument checker (first part), Luiz Capitulino, 2010/07/01
- [Qemu-devel] [PATCH 17/23] QMP: New argument checker (second part), Luiz Capitulino, 2010/07/01
- [Qemu-devel] [PATCH 18/23] QMP: Drop old client argument checker, Luiz Capitulino, 2010/07/01
- [Qemu-devel] [PATCH 19/23] QError: Introduce QERR_QMP_EXTRA_MEMBER, Luiz Capitulino, 2010/07/01
- [Qemu-devel] [PATCH 20/23] QMP: Introduce qmp_check_input_obj(), Luiz Capitulino, 2010/07/01
- [Qemu-devel] [PATCH 21/23] QMP: Drop old input object checking, Luiz Capitulino, 2010/07/01
- [Qemu-devel] [PATCH 22/23] QMP: handle_qmp_command(): Small cleanup, Luiz Capitulino, 2010/07/01
- [Qemu-devel] [PATCH 23/23] monitor: Allow to exclude commands from QMP, Luiz Capitulino, 2010/07/01
- Re: [Qemu-devel] [PATCH 00/23][PULL]: QMP/Monitor queue, Anthony Liguori, 2010/07/06