All of lore.kernel.org
 help / color / mirror / Atom feed
From: Max Reitz <mreitz@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Kevin Wolf" <kwolf@redhat.com>,
	"Benoît Canet" <benoit@irqsave.net>,
	"Stefan Hajnoczi" <stefanha@redhat.com>,
	"Max Reitz" <mreitz@redhat.com>
Subject: [Qemu-devel] [PATCH v3 01/12] qdict: Add qdict_join()
Date: Thu, 10 Apr 2014 20:43:32 +0200	[thread overview]
Message-ID: <1397155423-29713-2-git-send-email-mreitz@redhat.com> (raw)
In-Reply-To: <1397155423-29713-1-git-send-email-mreitz@redhat.com>

This function joins two QDicts by absorbing one into the other.

Signed-off-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Benoit Canet <benoit@irqsave.net>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 include/qapi/qmp/qdict.h |  3 +++
 qobject/qdict.c          | 32 ++++++++++++++++++++++++++++++++
 2 files changed, 35 insertions(+)

diff --git a/include/qapi/qmp/qdict.h b/include/qapi/qmp/qdict.h
index 1ddf97b..d68f4eb 100644
--- a/include/qapi/qmp/qdict.h
+++ b/include/qapi/qmp/qdict.h
@@ -16,6 +16,7 @@
 #include "qapi/qmp/qobject.h"
 #include "qapi/qmp/qlist.h"
 #include "qemu/queue.h"
+#include <stdbool.h>
 #include <stdint.h>
 
 #define QDICT_BUCKET_MAX 512
@@ -70,4 +71,6 @@ void qdict_flatten(QDict *qdict);
 void qdict_extract_subqdict(QDict *src, QDict **dst, const char *start);
 void qdict_array_split(QDict *src, QList **dst);
 
+void qdict_join(QDict *dest, QDict *src, bool overwrite);
+
 #endif /* QDICT_H */
diff --git a/qobject/qdict.c b/qobject/qdict.c
index 42ec4c0..ea239f0 100644
--- a/qobject/qdict.c
+++ b/qobject/qdict.c
@@ -665,3 +665,35 @@ void qdict_array_split(QDict *src, QList **dst)
         qlist_append_obj(*dst, subqobj ?: QOBJECT(subqdict));
     }
 }
+
+/**
+ * qdict_join(): Absorb the src QDict into the dest QDict, that is, move all
+ * elements from src to dest.
+ *
+ * If an element from src has a key already present in dest, it will not be
+ * moved unless overwrite is true.
+ *
+ * If overwrite is true, the conflicting values in dest will be discarded and
+ * replaced by the corresponding values from src.
+ *
+ * Therefore, with overwrite being true, the src QDict will always be empty when
+ * this function returns. If overwrite is false, the src QDict will be empty
+ * iff there were no conflicts.
+ */
+void qdict_join(QDict *dest, QDict *src, bool overwrite)
+{
+    const QDictEntry *entry, *next;
+
+    entry = qdict_first(src);
+    while (entry) {
+        next = qdict_next(src, entry);
+
+        if (overwrite || !qdict_haskey(dest, entry->key)) {
+            qobject_incref(entry->value);
+            qdict_put_obj(dest, entry->key, entry->value);
+            qdict_del(src, entry->key);
+        }
+
+        entry = next;
+    }
+}
-- 
1.9.1

  reply	other threads:[~2014-04-10 18:44 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-04-10 18:43 [Qemu-devel] [PATCH v3 00/12] block/json: Add JSON protocol driver Max Reitz
2014-04-10 18:43 ` Max Reitz [this message]
2014-04-10 18:43 ` [Qemu-devel] [PATCH v3 02/12] check-qdict: Add test for qdict_join() Max Reitz
2014-04-10 18:43 ` [Qemu-devel] [PATCH v3 03/12] block: Add "has_single_child" field for drivers Max Reitz
2014-04-10 18:43 ` [Qemu-devel] [PATCH v3 04/12] block/json: Add JSON protocol driver Max Reitz
2014-04-10 18:43 ` [Qemu-devel] [PATCH v3 05/12] block/json: Add functions for cache control Max Reitz
2014-04-10 18:57   ` Benoît Canet
2014-04-10 18:43 ` [Qemu-devel] [PATCH v3 06/12] block/json: Add functions for writing zeroes etc Max Reitz
2014-04-10 18:43 ` [Qemu-devel] [PATCH v3 07/12] block/json: Add bdrv_co_get_block_status() Max Reitz
2014-04-10 18:58   ` Benoît Canet
2014-04-10 19:00     ` Max Reitz
2014-04-10 18:43 ` [Qemu-devel] [PATCH v3 08/12] block/json: Add ioctl etc Max Reitz
2014-04-10 18:43 ` [Qemu-devel] [PATCH v3 09/12] block/json: Add bdrv_get_specific_info() Max Reitz
2014-04-10 18:43 ` [Qemu-devel] [PATCH v3 10/12] block/raw_bsd: " Max Reitz
2014-04-10 18:43 ` [Qemu-devel] [PATCH v3 11/12] block/qapi: Ignore filters on top for format name Max Reitz
2014-04-10 18:43 ` [Qemu-devel] [PATCH v3 12/12] iotests: Add test for the JSON protocol Max Reitz
2014-05-05 16:19 ` [Qemu-devel] [PATCH v3 00/12] block/json: Add JSON protocol driver Max Reitz
2014-05-06  8:10   ` Stefan Hajnoczi
2014-05-06 17:51     ` Max Reitz
2014-05-07  7:29       ` Stefan Hajnoczi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1397155423-29713-2-git-send-email-mreitz@redhat.com \
    --to=mreitz@redhat.com \
    --cc=benoit@irqsave.net \
    --cc=kwolf@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.