00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef GRU_VARIANT_H
00017 #define GRU_VARIANT_H
00018
00019 #include <stdint.h>
00020 #include <stdbool.h>
00021 #include <string.h>
00022 #include <stdlib.h>
00023 #include <limits.h>
00024
00025 #include <common/gru_alloc.h>
00026
00027 #ifdef __cplusplus
00028 extern "C" {
00029 #endif
00030
00031
00032 typedef enum gru_variant_type_t_ {
00033 GRU_STRING,
00034 GRU_INTEGER,
00035 GRU_DOUBLE,
00036 GRU_BOOLEAN,
00037 } gru_variant_type_t;
00038
00039
00043 typedef struct gru_variant_t_ {
00044 gru_variant_type_t type;
00045 union {
00046 uint64_t inumber;
00047 long double fnumber;
00048 char *string;
00049 bool flag;
00050 } variant;
00051 } gru_variant_t;
00052
00053
00057 #define GRU_VARIANT_STRING_INITIALIZER(x) { .type = GRU_STRING, .variant.string = (x) }
00058
00062 #define GRU_VARIANT_STRING_DEFAULT_INITIALIZER GRU_VARIANT_STRING_INITIALIZER(NULL)
00063
00067 #define GRU_VARIANT_INTEGER_INITIALIZER(x) { .type = GRU_INTEGER, .variant.inumber = (x) }
00068
00069
00073 #define GRU_VARIANT_INTEGER_DEFAULT_INITIALIZER GRU_VARIANT_INTEGER_INITIALIZER(0)
00074
00078 #define GRU_VARIANT_DOUBLE_INITIALIZER(x) { .type = GRU_DOUBLE, .variant.fnumber = (x) }
00079
00080
00084 #define GRU_VARIANT_DOUBLE_DEFAULT_INITIALIZER GRU_VARIANT_DOUBLE_INITIALIZER(0.0)
00085
00089 #define GRU_VARIANT_BOOLEAN_INITIALIZER(x) { .type = GRU_BOOLEAN, .variant.flag = (x) }
00090
00091
00095 #define GRU_VARIANT_BOOLEAN_DEFAULT_INITIALIZER GRU_VARIANT_BOOLEAN_INITIALIZER(false)
00096
00097
00098
00105 gru_export bool gru_variant_set_string(gru_variant_t *variant, const char *str);
00106
00112 gru_export void gru_variant_set_integer(gru_variant_t *variant, uint64_t number);
00113
00119 gru_export void gru_variant_clean(gru_variant_t *variant);
00120
00126 gru_export gru_variant_t gru_variant_parse(const char *str);
00127
00128
00135 gru_export bool gru_variant_equals_str(gru_variant_t *variant, const char *str);
00136
00137 #ifdef __cplusplus
00138 }
00139 #endif
00140
00141 #endif //GRU_VARIANT_H