1 | /* |
2 | * QNum Module |
3 | * |
4 | * Copyright (C) 2009 Red Hat Inc. |
5 | * |
6 | * Authors: |
7 | * Luiz Capitulino <lcapitulino@redhat.com> |
8 | * Anthony Liguori <aliguori@us.ibm.com> |
9 | * Marc-André Lureau <marcandre.lureau@redhat.com> |
10 | * |
11 | * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. |
12 | * See the COPYING.LIB file in the top-level directory. |
13 | */ |
14 | |
15 | #ifndef QNUM_H |
16 | #define QNUM_H |
17 | |
18 | #include "qapi/qmp/qobject.h" |
19 | |
20 | typedef enum { |
21 | QNUM_I64, |
22 | QNUM_U64, |
23 | QNUM_DOUBLE |
24 | } QNumKind; |
25 | |
26 | /* |
27 | * QNum encapsulates how our dialect of JSON fills in the blanks left |
28 | * by the JSON specification (RFC 8259) regarding numbers. |
29 | * |
30 | * Conceptually, we treat number as an abstract type with three |
31 | * concrete subtypes: floating-point, signed integer, unsigned |
32 | * integer. QNum implements this as a discriminated union of double, |
33 | * int64_t, uint64_t. |
34 | * |
35 | * The JSON parser picks the subtype as follows. If the number has a |
36 | * decimal point or an exponent, it is floating-point. Else if it |
37 | * fits into int64_t, it's signed integer. Else if it fits into |
38 | * uint64_t, it's unsigned integer. Else it's floating-point. |
39 | * |
40 | * Any number can serve as double: qnum_get_double() converts under |
41 | * the hood. |
42 | * |
43 | * An integer can serve as signed / unsigned integer as long as it is |
44 | * in range: qnum_get_try_int() / qnum_get_try_uint() check range and |
45 | * convert under the hood. |
46 | */ |
47 | struct QNum { |
48 | struct QObjectBase_ base; |
49 | QNumKind kind; |
50 | union { |
51 | int64_t i64; |
52 | uint64_t u64; |
53 | double dbl; |
54 | } u; |
55 | }; |
56 | |
57 | QNum *qnum_from_int(int64_t value); |
58 | QNum *qnum_from_uint(uint64_t value); |
59 | QNum *qnum_from_double(double value); |
60 | |
61 | bool qnum_get_try_int(const QNum *qn, int64_t *val); |
62 | int64_t qnum_get_int(const QNum *qn); |
63 | |
64 | bool qnum_get_try_uint(const QNum *qn, uint64_t *val); |
65 | uint64_t qnum_get_uint(const QNum *qn); |
66 | |
67 | double qnum_get_double(QNum *qn); |
68 | |
69 | char *qnum_to_string(QNum *qn); |
70 | |
71 | bool qnum_is_equal(const QObject *x, const QObject *y); |
72 | void qnum_destroy_obj(QObject *obj); |
73 | |
74 | #endif /* QNUM_H */ |
75 | |