diff options
author | Marc-André Lureau <marcandre.lureau@redhat.com> | 2017-06-07 20:35:58 +0400 |
---|---|---|
committer | Markus Armbruster <armbru@redhat.com> | 2017-06-20 14:31:31 +0200 |
commit | 01b2ffcedd94ad7b42bc870e4c6936c87ad03429 (patch) | |
tree | 39bbadfbbaa229bfbda245840a256fe0132b2390 /include | |
parent | 58634047b7deeab36e4b07c4744e44d698975561 (diff) |
qapi: merge QInt and QFloat in QNum
We would like to use a same QObject type to represent numbers, whether
they are int, uint, or floats. Getters will allow some compatibility
between the various types if the number fits other representations.
Add a few more tests while at it.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20170607163635.17635-7-marcandre.lureau@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
[parse_stats_intervals() simplified a bit, comment in
test_visitor_in_int_overflow() tidied up, suppress bogus warnings]
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Diffstat (limited to 'include')
-rw-r--r-- | include/qapi/qmp/qdict.h | 3 | ||||
-rw-r--r-- | include/qapi/qmp/qfloat.h | 29 | ||||
-rw-r--r-- | include/qapi/qmp/qint.h | 28 | ||||
-rw-r--r-- | include/qapi/qmp/qlist.h | 3 | ||||
-rw-r--r-- | include/qapi/qmp/qnum.h | 46 | ||||
-rw-r--r-- | include/qapi/qmp/types.h | 3 | ||||
-rw-r--r-- | include/qapi/qobject-input-visitor.h | 6 | ||||
-rw-r--r-- | include/qapi/qobject-output-visitor.h | 8 |
8 files changed, 58 insertions, 68 deletions
diff --git a/include/qapi/qmp/qdict.h b/include/qapi/qmp/qdict.h index 188440a6a8..363e431106 100644 --- a/include/qapi/qmp/qdict.h +++ b/include/qapi/qmp/qdict.h @@ -15,6 +15,7 @@ #include "qapi/qmp/qobject.h" #include "qapi/qmp/qlist.h" +#include "qapi/qmp/qnum.h" #include "qemu/queue.h" #define QDICT_BUCKET_MAX 512 @@ -54,7 +55,7 @@ void qdict_destroy_obj(QObject *obj); /* Helpers for int, bool, and string */ #define qdict_put_int(qdict, key, value) \ - qdict_put(qdict, key, qint_from_int(value)) + qdict_put(qdict, key, qnum_from_int(value)) #define qdict_put_bool(qdict, key, value) \ qdict_put(qdict, key, qbool_from_bool(value)) #define qdict_put_str(qdict, key, value) \ diff --git a/include/qapi/qmp/qfloat.h b/include/qapi/qmp/qfloat.h deleted file mode 100644 index b5d15836b5..0000000000 --- a/include/qapi/qmp/qfloat.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * QFloat Module - * - * Copyright IBM, Corp. 2009 - * - * Authors: - * Anthony Liguori <aliguori@us.ibm.com> - * - * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. - * See the COPYING.LIB file in the top-level directory. - * - */ - -#ifndef QFLOAT_H -#define QFLOAT_H - -#include "qapi/qmp/qobject.h" - -typedef struct QFloat { - QObject base; - double value; -} QFloat; - -QFloat *qfloat_from_double(double value); -double qfloat_get_double(const QFloat *qi); -QFloat *qobject_to_qfloat(const QObject *obj); -void qfloat_destroy_obj(QObject *obj); - -#endif /* QFLOAT_H */ diff --git a/include/qapi/qmp/qint.h b/include/qapi/qmp/qint.h deleted file mode 100644 index 3aaff768dd..0000000000 --- a/include/qapi/qmp/qint.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * QInt Module - * - * Copyright (C) 2009 Red Hat Inc. - * - * Authors: - * Luiz Capitulino <lcapitulino@redhat.com> - * - * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. - * See the COPYING.LIB file in the top-level directory. - */ - -#ifndef QINT_H -#define QINT_H - -#include "qapi/qmp/qobject.h" - -typedef struct QInt { - QObject base; - int64_t value; -} QInt; - -QInt *qint_from_int(int64_t value); -int64_t qint_get_int(const QInt *qi); -QInt *qobject_to_qint(const QObject *obj); -void qint_destroy_obj(QObject *obj); - -#endif /* QINT_H */ diff --git a/include/qapi/qmp/qlist.h b/include/qapi/qmp/qlist.h index 5dc4ed9616..c4b5fdad9b 100644 --- a/include/qapi/qmp/qlist.h +++ b/include/qapi/qmp/qlist.h @@ -14,6 +14,7 @@ #define QLIST_H #include "qapi/qmp/qobject.h" +#include "qapi/qmp/qnum.h" #include "qemu/queue.h" typedef struct QListEntry { @@ -31,7 +32,7 @@ typedef struct QList { /* Helpers for int, bool, and string */ #define qlist_append_int(qlist, value) \ - qlist_append(qlist, qint_from_int(value)) + qlist_append(qlist, qnum_from_int(value)) #define qlist_append_bool(qlist, value) \ qlist_append(qlist, qbool_from_bool(value)) #define qlist_append_str(qlist, value) \ diff --git a/include/qapi/qmp/qnum.h b/include/qapi/qmp/qnum.h new file mode 100644 index 0000000000..e42b136141 --- /dev/null +++ b/include/qapi/qmp/qnum.h @@ -0,0 +1,46 @@ +/* + * QNum Module + * + * Copyright (C) 2009 Red Hat Inc. + * + * Authors: + * Luiz Capitulino <lcapitulino@redhat.com> + * Anthony Liguori <aliguori@us.ibm.com> + * Marc-André Lureau <marcandre.lureau@redhat.com> + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + */ + +#ifndef QNUM_H +#define QNUM_H + +#include "qapi/qmp/qobject.h" + +typedef enum { + QNUM_I64, + QNUM_DOUBLE +} QNumKind; + +typedef struct QNum { + QObject base; + QNumKind kind; + union { + int64_t i64; + double dbl; + } u; +} QNum; + +QNum *qnum_from_int(int64_t value); +QNum *qnum_from_double(double value); + +bool qnum_get_try_int(const QNum *qn, int64_t *val); +int64_t qnum_get_int(const QNum *qn); +double qnum_get_double(QNum *qn); + +char *qnum_to_string(QNum *qn); + +QNum *qobject_to_qnum(const QObject *obj); +void qnum_destroy_obj(QObject *obj); + +#endif /* QNUM_H */ diff --git a/include/qapi/qmp/types.h b/include/qapi/qmp/types.h index 27cfbd84e5..a4bc662bfb 100644 --- a/include/qapi/qmp/types.h +++ b/include/qapi/qmp/types.h @@ -14,8 +14,7 @@ #define QAPI_QMP_TYPES_H #include "qapi/qmp/qobject.h" -#include "qapi/qmp/qint.h" -#include "qapi/qmp/qfloat.h" +#include "qapi/qmp/qnum.h" #include "qapi/qmp/qbool.h" #include "qapi/qmp/qstring.h" #include "qapi/qmp/qdict.h" diff --git a/include/qapi/qobject-input-visitor.h b/include/qapi/qobject-input-visitor.h index b399285c43..daee18c6ac 100644 --- a/include/qapi/qobject-input-visitor.h +++ b/include/qapi/qobject-input-visitor.h @@ -30,9 +30,9 @@ typedef struct QObjectInputVisitor QObjectInputVisitor; * visit_type_FOO() creates an instance of QAPI type FOO. The visited * QObject must match FOO. QDict matches struct/union types, QList * matches list types, QString matches type 'str' and enumeration - * types, QInt matches integer types, QFloat matches type 'number', - * QBool matches type 'bool'. Type 'any' is matched by QObject. A - * QAPI alternate type is matched when one of its member types is. + * types, QNum matches integer and float types, QBool matches type + * 'bool'. Type 'any' is matched by QObject. A QAPI alternate type + * is matched when one of its member types is. * * visit_start_struct() ... visit_end_struct() visits a QDict and * creates a QAPI struct/union. Visits in between visit the diff --git a/include/qapi/qobject-output-visitor.h b/include/qapi/qobject-output-visitor.h index 9b990c318e..e5a3490812 100644 --- a/include/qapi/qobject-output-visitor.h +++ b/include/qapi/qobject-output-visitor.h @@ -28,10 +28,10 @@ typedef struct QObjectOutputVisitor QObjectOutputVisitor; * * visit_type_FOO() creates a QObject for QAPI type FOO. It creates a * QDict for struct/union types, a QList for list types, QString for - * type 'str' and enumeration types, QInt for integer types, QFloat - * for type 'number', QBool for type 'bool'. For type 'any', it - * increments the QObject's reference count. For QAPI alternate - * types, it creates the QObject for the member that is in use. + * type 'str' and enumeration types, QNum for integer and float + * types, QBool for type 'bool'. For type 'any', it increments the + * QObject's reference count. For QAPI alternate types, it creates + * the QObject for the member that is in use. * * visit_start_struct() ... visit_end_struct() visits a QAPI * struct/union and creates a QDict. Visits in between visit the |