[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 04/13] QDict: Introduce new iteration API
From: |
Luiz Capitulino |
Subject: |
[Qemu-devel] [PATCH 04/13] QDict: Introduce new iteration API |
Date: |
Tue, 22 Jun 2010 14:40:42 -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.1.359.gd0b8d
- [Qemu-devel] [PATCH v2 00/13]: QMP: Replace client argument checker, Luiz Capitulino, 2010/06/22
- [Qemu-devel] [PATCH 01/13] QDict: Rename 'err_value', Luiz Capitulino, 2010/06/22
- [Qemu-devel] [PATCH 03/13] QDict: Introduce functions to retrieve QDictEntry values, Luiz Capitulino, 2010/06/22
- [Qemu-devel] [PATCH 02/13] QDict: Small terminology change, Luiz Capitulino, 2010/06/22
- [Qemu-devel] [PATCH 05/13] check-qdict: Introduce test for the new iteration API, Luiz Capitulino, 2010/06/22
- [Qemu-devel] [PATCH 04/13] QDict: Introduce new iteration API,
Luiz Capitulino <=
- [Qemu-devel] [PATCH 11/13] QError: Introduce QERR_QMP_UNEXPECTED_INPUT_OBJECT_MEMBER, Luiz Capitulino, 2010/06/22
- [Qemu-devel] [PATCH 10/13] QMP: Drop old client argument checker, Luiz Capitulino, 2010/06/22
- [Qemu-devel] [PATCH 08/13] QMP: New argument checker (first part), Luiz Capitulino, 2010/06/22
- [Qemu-devel] [PATCH 07/13] Monitor: handle optional '-' arg as a bool, Luiz Capitulino, 2010/06/22
[Qemu-devel] [PATCH 13/13] QMP: Drop old input object checking, Luiz Capitulino, 2010/06/22
[Qemu-devel] [PATCH 09/13] QMP: New argument checker (second part), Luiz Capitulino, 2010/06/22