From patchwork Fri Feb 10 19:31:03 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luiz Capitulino X-Patchwork-Id: 140712 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id B2541B6F13 for ; Sat, 11 Feb 2012 06:31:43 +1100 (EST) Received: from localhost ([::1]:56951 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RvwBz-0003r2-Eu for incoming@patchwork.ozlabs.org; Fri, 10 Feb 2012 14:31:35 -0500 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 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q1AJVIeP022032 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 10 Feb 2012 14:31:19 -0500 Received: from localhost (ovpn-116-65.ams2.redhat.com [10.36.116.65]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q1AJVHJY028150; Fri, 10 Feb 2012 14:31:18 -0500 From: Luiz Capitulino To: qemu-devel@nongnu.org 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> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 209.132.183.28 Cc: aliguori@us.ibm.com, quintela@redhat.com Subject: [Qemu-devel] [PATCH 3/6] QDict: Introduce qdict_copy() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org 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);