Commit f90cb284 authored by Markus Armbruster's avatar Markus Armbruster
Browse files

qobject: Explain how QNum works, and why



Suggested-by: default avatarMax Reitz <mreitz@redhat.com>
Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
Message-Id: <1503384739-17207-1-git-send-email-armbru@redhat.com>
Reviewed-by: default avatarMarc-André Lureau <marcandre.lureau@redhat.com>
[Comment typos fixed]
parent e4a426e7
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -23,6 +23,27 @@ typedef enum {
    QNUM_DOUBLE
} QNumKind;

/*
 * QNum encapsulates how our dialect of JSON fills in the blanks left
 * by the JSON specification (RFC 7159) regarding numbers.
 *
 * Conceptually, we treat number as an abstract type with three
 * concrete subtypes: floating-point, signed integer, unsigned
 * integer.  QNum implements this as a discriminated union of double,
 * int64_t, uint64_t.
 *
 * The JSON parser picks the subtype as follows.  If the number has a
 * decimal point or an exponent, it is floating-point.  Else if it
 * fits into int64_t, it's signed integer.  Else if it fits into
 * uint64_t, it's unsigned integer.  Else it's floating-point.
 *
 * Any number can serve as double: qnum_get_double() converts under
 * the hood.
 *
 * An integer can serve as signed / unsigned integer as long as it is
 * in range: qnum_get_try_int() / qnum_get_try_uint() check range and
 * convert under the hood.
 */
typedef struct QNum {
    QObject base;
    QNumKind kind;