From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:45581) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RvwBl-0003ak-2Q for qemu-devel@nongnu.org; Fri, 10 Feb 2012 14:31:22 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RvwBk-00088o-0u for qemu-devel@nongnu.org; Fri, 10 Feb 2012 14:31:20 -0500 Received: from mx1.redhat.com ([209.132.183.28]:13290) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RvwBj-00088g-Kj for qemu-devel@nongnu.org; Fri, 10 Feb 2012 14:31:19 -0500 From: Luiz Capitulino Date: Fri, 10 Feb 2012 17:31:03 -0200 Message-Id: <1328902266-25308-4-git-send-email-lcapitulino@redhat.com> In-Reply-To: <1328902266-25308-1-git-send-email-lcapitulino@redhat.com> References: <1328902266-25308-1-git-send-email-lcapitulino@redhat.com> Subject: [Qemu-devel] [PATCH 3/6] QDict: Introduce qdict_copy() List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: aliguori@us.ibm.com, quintela@redhat.com Signed-off-by: Luiz Capitulino --- check-qdict.c | 29 +++++++++++++++++++++++++++++ qdict.c | 18 ++++++++++++++++++ qdict.h | 1 + 3 files changed, 48 insertions(+), 0 deletions(-) diff --git a/check-qdict.c b/check-qdict.c index fc0d276..12c73ab 100644 --- a/check-qdict.c +++ b/check-qdict.c @@ -227,6 +227,34 @@ static void qdict_iterapi_test(void) QDECREF(tests_dict); } +static void qdict_copy_test(void) +{ + QDict *tests_dict = qdict_new(); + const QDictEntry *ent; + QDict *new; + int i; + + for (i = 0; i < 1024; i++) { + char key[32]; + + snprintf(key, sizeof(key), "key%d", i); + qdict_put(tests_dict, key, qint_from_int(i)); + } + + new = qdict_copy(tests_dict); + + g_assert(qdict_size(new) == qdict_size(tests_dict)); + for (ent = qdict_first(tests_dict); ent; ent = qdict_next(tests_dict, ent)){ + const char *key = qdict_entry_key(ent); + + g_assert(qdict_haskey(new, key) == 1); + g_assert(qdict_get_int(new, key) == qdict_get_int(tests_dict, key)); + } + + QDECREF(new); + QDECREF(tests_dict); +} + /* * Errors test-cases */ @@ -365,6 +393,7 @@ int main(int argc, char **argv) g_test_add_func("/public/del", qdict_del_test); g_test_add_func("/public/to_qdict", qobject_to_qdict_test); g_test_add_func("/public/iterapi", qdict_iterapi_test); + g_test_add_func("/public/copy", qdict_copy_test); g_test_add_func("/errors/put_exists", qdict_put_exists_test); g_test_add_func("/errors/get_not_exists", qdict_get_not_exists_test); diff --git a/qdict.c b/qdict.c index 4bf308b..dc9141f 100644 --- a/qdict.c +++ b/qdict.c @@ -401,6 +401,24 @@ const QDictEntry *qdict_next(const QDict *qdict, const QDictEntry *entry) } /** + * qdict_copy(): Build a new dictionary from an existing one. + */ +QDict *qdict_copy(const QDict *from) +{ + const QDictEntry *ent; + QDict *new; + + new = qdict_new(); + + for (ent = qdict_first(from); ent; ent = qdict_next(from, ent)) { + qdict_put_obj(new, qdict_entry_key(ent), qdict_entry_value(ent)); + qobject_incref(qdict_entry_value(ent)); + } + + return new; +} + +/** * qentry_destroy(): Free all the memory allocated by a QDictEntry */ static void qentry_destroy(QDictEntry *e) diff --git a/qdict.h b/qdict.h index 929d8d2..9976a18 100644 --- a/qdict.h +++ b/qdict.h @@ -36,6 +36,7 @@ typedef struct QDict { QDict *qdict_new(void); const char *qdict_entry_key(const QDictEntry *entry); QObject *qdict_entry_value(const QDictEntry *entry); +QDict *qdict_copy(const QDict *from); size_t qdict_size(const QDict *qdict); void qdict_put_obj(QDict *qdict, const char *key, QObject *value); void qdict_del(QDict *qdict, const char *key); -- 1.7.9.111.gf3fb0.dirty