qobject: Eliminate qdict_iter(), use qdict_first(), qdict_next()
qdict_iter() has just three uses and no test coverage. Replace by qdict_first(), qdict_next() for more concise code and less type punning. Signed-off-by: Markus Armbruster <armbru@redhat.com> Message-Id: <20200415083048.14339-5-armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
parent
2f2ec11179
commit
7b1cd1c65a
|
@ -40,9 +40,6 @@ void qdict_del(QDict *qdict, const char *key);
|
||||||
int qdict_haskey(const QDict *qdict, const char *key);
|
int qdict_haskey(const QDict *qdict, const char *key);
|
||||||
QObject *qdict_get(const QDict *qdict, const char *key);
|
QObject *qdict_get(const QDict *qdict, const char *key);
|
||||||
bool qdict_is_equal(const QObject *x, const QObject *y);
|
bool qdict_is_equal(const QObject *x, const QObject *y);
|
||||||
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_first(const QDict *qdict);
|
||||||
const QDictEntry *qdict_next(const QDict *qdict, const QDictEntry *entry);
|
const QDictEntry *qdict_next(const QDict *qdict, const QDictEntry *entry);
|
||||||
void qdict_destroy_obj(QObject *obj);
|
void qdict_destroy_obj(QObject *obj);
|
||||||
|
|
|
@ -203,31 +203,32 @@ static const char *qobject_input_get_keyval(QObjectInputVisitor *qiv,
|
||||||
return qstring_get_str(qstr);
|
return qstring_get_str(qstr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void qdict_add_key(const char *key, QObject *obj, void *opaque)
|
|
||||||
{
|
|
||||||
GHashTable *h = opaque;
|
|
||||||
g_hash_table_insert(h, (gpointer) key, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const QListEntry *qobject_input_push(QObjectInputVisitor *qiv,
|
static const QListEntry *qobject_input_push(QObjectInputVisitor *qiv,
|
||||||
const char *name,
|
const char *name,
|
||||||
QObject *obj, void *qapi)
|
QObject *obj, void *qapi)
|
||||||
{
|
{
|
||||||
GHashTable *h;
|
GHashTable *h;
|
||||||
StackObject *tos = g_new0(StackObject, 1);
|
StackObject *tos = g_new0(StackObject, 1);
|
||||||
|
QDict *qdict = qobject_to(QDict, obj);
|
||||||
|
QList *qlist = qobject_to(QList, obj);
|
||||||
|
const QDictEntry *entry;
|
||||||
|
|
||||||
assert(obj);
|
assert(obj);
|
||||||
tos->name = name;
|
tos->name = name;
|
||||||
tos->obj = obj;
|
tos->obj = obj;
|
||||||
tos->qapi = qapi;
|
tos->qapi = qapi;
|
||||||
|
|
||||||
if (qobject_type(obj) == QTYPE_QDICT) {
|
if (qdict) {
|
||||||
h = g_hash_table_new(g_str_hash, g_str_equal);
|
h = g_hash_table_new(g_str_hash, g_str_equal);
|
||||||
qdict_iter(qobject_to(QDict, obj), qdict_add_key, h);
|
for (entry = qdict_first(qdict);
|
||||||
|
entry;
|
||||||
|
entry = qdict_next(qdict, entry)) {
|
||||||
|
g_hash_table_insert(h, (void *)qdict_entry_key(entry), NULL);
|
||||||
|
}
|
||||||
tos->h = h;
|
tos->h = h;
|
||||||
} else {
|
} else {
|
||||||
assert(qobject_type(obj) == QTYPE_QLIST);
|
assert(qlist);
|
||||||
tos->entry = qlist_first(qobject_to(QList, obj));
|
tos->entry = qlist_first(qlist);
|
||||||
tos->index = -1;
|
tos->index = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -298,25 +298,6 @@ const char *qdict_get_try_str(const QDict *qdict, const char *key)
|
||||||
return qstr ? qstring_get_str(qstr) : NULL;
|
return qstr ? qstring_get_str(qstr) : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* qdict_iter(): Iterate over all the dictionary's stored values.
|
|
||||||
*
|
|
||||||
* This function allows the user to provide an iterator, which will be
|
|
||||||
* called for each stored value in the dictionary.
|
|
||||||
*/
|
|
||||||
void qdict_iter(const QDict *qdict,
|
|
||||||
void (*iter)(const char *key, QObject *obj, void *opaque),
|
|
||||||
void *opaque)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
QDictEntry *entry;
|
|
||||||
|
|
||||||
for (i = 0; i < QDICT_BUCKET_MAX; i++) {
|
|
||||||
QLIST_FOREACH(entry, &qdict->table[i], next)
|
|
||||||
iter(entry->key, entry->value, opaque);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static QDictEntry *qdict_next_entry(const QDict *qdict, int first_bucket)
|
static QDictEntry *qdict_next_entry(const QDict *qdict, int first_bucket)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
|
@ -149,14 +149,6 @@ QDict *qdict_from_jsonf_nofail(const char *string, ...)
|
||||||
return qdict;
|
return qdict;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct ToJsonIterState
|
|
||||||
{
|
|
||||||
int indent;
|
|
||||||
int pretty;
|
|
||||||
int count;
|
|
||||||
QString *str;
|
|
||||||
} ToJsonIterState;
|
|
||||||
|
|
||||||
static void to_json(const QObject *obj, QString *str, int pretty, int indent);
|
static void to_json(const QObject *obj, QString *str, int pretty, int indent);
|
||||||
|
|
||||||
static void json_pretty_newline(QString *str, bool pretty, int indent)
|
static void json_pretty_newline(QString *str, bool pretty, int indent)
|
||||||
|
@ -171,26 +163,6 @@ static void json_pretty_newline(QString *str, bool pretty, int indent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void to_json_dict_iter(const char *key, QObject *obj, void *opaque)
|
|
||||||
{
|
|
||||||
ToJsonIterState *s = opaque;
|
|
||||||
QString *qkey;
|
|
||||||
|
|
||||||
if (s->count) {
|
|
||||||
qstring_append(s->str, s->pretty ? "," : ", ");
|
|
||||||
}
|
|
||||||
|
|
||||||
json_pretty_newline(s->str, s->pretty, s->indent);
|
|
||||||
|
|
||||||
qkey = qstring_from_str(key);
|
|
||||||
to_json(QOBJECT(qkey), s->str, s->pretty, s->indent);
|
|
||||||
qobject_unref(qkey);
|
|
||||||
|
|
||||||
qstring_append(s->str, ": ");
|
|
||||||
to_json(obj, s->str, s->pretty, s->indent);
|
|
||||||
s->count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void to_json(const QObject *obj, QString *str, int pretty, int indent)
|
static void to_json(const QObject *obj, QString *str, int pretty, int indent)
|
||||||
{
|
{
|
||||||
switch (qobject_type(obj)) {
|
switch (qobject_type(obj)) {
|
||||||
|
@ -261,15 +233,29 @@ static void to_json(const QObject *obj, QString *str, int pretty, int indent)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case QTYPE_QDICT: {
|
case QTYPE_QDICT: {
|
||||||
ToJsonIterState s;
|
|
||||||
QDict *val = qobject_to(QDict, obj);
|
QDict *val = qobject_to(QDict, obj);
|
||||||
|
const char *comma = pretty ? "," : ", ";
|
||||||
|
const char *sep = "";
|
||||||
|
const QDictEntry *entry;
|
||||||
|
QString *qkey;
|
||||||
|
|
||||||
s.count = 0;
|
|
||||||
s.str = str;
|
|
||||||
s.indent = indent + 1;
|
|
||||||
s.pretty = pretty;
|
|
||||||
qstring_append(str, "{");
|
qstring_append(str, "{");
|
||||||
qdict_iter(val, to_json_dict_iter, &s);
|
|
||||||
|
for (entry = qdict_first(val);
|
||||||
|
entry;
|
||||||
|
entry = qdict_next(val, entry)) {
|
||||||
|
qstring_append(str, sep);
|
||||||
|
json_pretty_newline(str, pretty, indent + 1);
|
||||||
|
|
||||||
|
qkey = qstring_from_str(qdict_entry_key(entry));
|
||||||
|
to_json(QOBJECT(qkey), str, pretty, indent + 1);
|
||||||
|
qobject_unref(qkey);
|
||||||
|
|
||||||
|
qstring_append(str, ": ");
|
||||||
|
to_json(qdict_entry_value(entry), str, pretty, indent + 1);
|
||||||
|
sep = comma;
|
||||||
|
}
|
||||||
|
|
||||||
json_pretty_newline(str, pretty, indent);
|
json_pretty_newline(str, pretty, indent);
|
||||||
qstring_append(str, "}");
|
qstring_append(str, "}");
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -1013,6 +1013,7 @@ QemuOpts *qemu_opts_from_qdict(QemuOptsList *list, const QDict *qdict,
|
||||||
OptsFromQDictState state;
|
OptsFromQDictState state;
|
||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
QemuOpts *opts;
|
QemuOpts *opts;
|
||||||
|
const QDictEntry *entry;
|
||||||
|
|
||||||
opts = qemu_opts_create(list, qdict_get_try_str(qdict, "id"), 1,
|
opts = qemu_opts_create(list, qdict_get_try_str(qdict, "id"), 1,
|
||||||
&local_err);
|
&local_err);
|
||||||
|
@ -1025,7 +1026,14 @@ QemuOpts *qemu_opts_from_qdict(QemuOptsList *list, const QDict *qdict,
|
||||||
|
|
||||||
state.errp = &local_err;
|
state.errp = &local_err;
|
||||||
state.opts = opts;
|
state.opts = opts;
|
||||||
qdict_iter(qdict, qemu_opts_from_qdict_1, &state);
|
|
||||||
|
for (entry = qdict_first(qdict);
|
||||||
|
entry;
|
||||||
|
entry = qdict_next(qdict, entry)) {
|
||||||
|
qemu_opts_from_qdict_1(qdict_entry_key(entry),
|
||||||
|
qdict_entry_value(entry),
|
||||||
|
&state);
|
||||||
|
}
|
||||||
if (local_err) {
|
if (local_err) {
|
||||||
error_propagate(errp, local_err);
|
error_propagate(errp, local_err);
|
||||||
qemu_opts_del(opts);
|
qemu_opts_del(opts);
|
||||||
|
|
Loading…
Reference in New Issue