On 2017-11-14 15:57, Markus Armbruster wrote: > Max Reitz <mre...@redhat.com> writes: > >> Signed-off-by: Max Reitz <mre...@redhat.com> >> --- >> include/qapi/qmp/qdict.h | 1 + >> qobject/qdict.c | 10 ++++++++++ >> 2 files changed, 11 insertions(+) >> >> diff --git a/include/qapi/qmp/qdict.h b/include/qapi/qmp/qdict.h >> index fc218e7be6..c65ebfc748 100644 >> --- a/include/qapi/qmp/qdict.h >> +++ b/include/qapi/qmp/qdict.h >> @@ -76,6 +76,7 @@ int64_t qdict_get_try_int(const QDict *qdict, const char >> *key, >> int64_t def_value); >> bool qdict_get_try_bool(const QDict *qdict, const char *key, bool >> def_value); >> const char *qdict_get_try_str(const QDict *qdict, const char *key); >> +bool qdict_is_qnull(const QDict *qdict, const char *key); >> >> void qdict_copy_default(QDict *dst, QDict *src, const char *key); >> void qdict_set_default_str(QDict *dst, const char *key, const char *val); >> diff --git a/qobject/qdict.c b/qobject/qdict.c >> index e8f15f1132..a032ea629a 100644 >> --- a/qobject/qdict.c >> +++ b/qobject/qdict.c >> @@ -294,6 +294,16 @@ const char *qdict_get_try_str(const QDict *qdict, const >> char *key) >> } >> >> /** >> + * qdict_is_qnull(): Return true if the value for 'key' is QNull >> + */ >> +bool qdict_is_qnull(const QDict *qdict, const char *key) >> +{ >> + QObject *value = qdict_get(qdict, key); >> + >> + return value && value->type == QTYPE_QNULL; >> +} >> + >> +/** >> * qdict_iter(): Iterate over all the dictionary's stored values. >> * >> * This function allows the user to provide an iterator, which will be > > As far as I can tell, the new helper function is going to be used just > once, by bdrv_open_inherit() in PATCH 2: > > qdict_is_qnull(options, "backing") > > I dislike abstracting from just one concrete instance. > > Perhaps a more general helper could be more generally useful. Something > like: > > qobject_is(qdict_get(options, "backing", QTYPE_QNULL)) > > There are numerous instances of > > !obj || qobject_type(obj) == T > > in the tree, which could then be replaced by > > qobject_is(obj, T) > > An alternative helper: macro qobject_dynamic_cast(obj, T) that returns > (T *)obj if obj is a T, else null. Leads to something like > > qobject_dynamic_cast(qdict_get(options, "backing", QNull))
If you think that's good, then that's good -- you know the QAPI code better then me, after all. To explain myself: I thought it would be the natural extension of the qdict_get_try_*() functions for the QNull type. Max
signature.asc
Description: OpenPGP digital signature