GRU - Generic Reusable Utilities
Loading...
Searching...
No Matches
gru_variant.h
Go to the documentation of this file.
1/*
2 Copyright 2017 Otavio Rodolfo Piske
3
4 Licensed under the Apache License, Version 2.0 (the "License");
5 you may not use this file except in compliance with the License.
6 You may obtain a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS,
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 See the License for the specific language governing permissions and
14 limitations under the License.
15 */
16#ifndef GRU_VARIANT_H
17#define GRU_VARIANT_H
18
19#include <stdint.h>
20#include <stdbool.h>
21#include <string.h>
22#include <stdlib.h>
23#include <limits.h>
24
25#include <common/gru_alloc.h>
26
27#ifdef __cplusplus
28extern "C" {
29#endif
30
31
32typedef enum gru_variant_type_t_ {
38
39
43typedef struct gru_variant_t_ {
45 union {
46 uint64_t inumber;
47 long double fnumber;
48 char *string;
49 bool flag;
52
53
57#define GRU_VARIANT_STRING_INITIALIZER(x) { .type = GRU_STRING, .variant.string = (x) }
58
62#define GRU_VARIANT_STRING_DEFAULT_INITIALIZER GRU_VARIANT_STRING_INITIALIZER(NULL)
63
67#define GRU_VARIANT_INTEGER_INITIALIZER(x) { .type = GRU_INTEGER, .variant.inumber = (x) }
68
69
73#define GRU_VARIANT_INTEGER_DEFAULT_INITIALIZER GRU_VARIANT_INTEGER_INITIALIZER(0)
74
78#define GRU_VARIANT_DOUBLE_INITIALIZER(x) { .type = GRU_DOUBLE, .variant.fnumber = (x) }
79
80
84#define GRU_VARIANT_DOUBLE_DEFAULT_INITIALIZER GRU_VARIANT_DOUBLE_INITIALIZER(0.0)
85
89#define GRU_VARIANT_BOOLEAN_INITIALIZER(x) { .type = GRU_BOOLEAN, .variant.flag = (x) }
90
91
95#define GRU_VARIANT_BOOLEAN_DEFAULT_INITIALIZER GRU_VARIANT_BOOLEAN_INITIALIZER(false)
96
97
98
105gru_export bool gru_variant_set_string(gru_variant_t *variant, const char *str);
106
112gru_export void gru_variant_set_integer(gru_variant_t *variant, uint64_t number);
113
120
127
128
135gru_export bool gru_variant_equals_str(gru_variant_t *variant, const char *str);
136
137#ifdef __cplusplus
138}
139#endif
140
141#endif //GRU_VARIANT_H
#define gru_export
Definition: gru_portable.h:19
gru_variant_type_t_
Definition: gru_variant.h:32
@ GRU_BOOLEAN
Definition: gru_variant.h:36
@ GRU_DOUBLE
Definition: gru_variant.h:35
@ GRU_STRING
Definition: gru_variant.h:33
@ GRU_INTEGER
Definition: gru_variant.h:34
gru_export void gru_variant_set_integer(gru_variant_t *variant, uint64_t number)
Set the variant value to an integer.
Definition: gru_variant.c:34
struct gru_variant_t_ gru_variant_t
An abstract struct that can hold different types.
gru_export bool gru_variant_equals_str(gru_variant_t *variant, const char *str)
Simple equality check to test if the variant value matches a given string.
Definition: gru_variant.c:146
gru_export void gru_variant_clean(gru_variant_t *variant)
Release the memory used by a variant (if any used at all).
Definition: gru_variant.c:39
gru_export bool gru_variant_set_string(gru_variant_t *variant, const char *str)
Set the variant value to a string.
Definition: gru_variant.c:19
enum gru_variant_type_t_ gru_variant_type_t
gru_export gru_variant_t gru_variant_parse(const char *str)
Parses a string and sets it to the most appropriate type.
Definition: gru_variant.c:114
An abstract struct that can hold different types.
Definition: gru_variant.h:43
bool flag
Definition: gru_variant.h:49
union gru_variant_t_::@0 variant
char * string
Definition: gru_variant.h:48
long double fnumber
Definition: gru_variant.h:47
uint64_t inumber
Definition: gru_variant.h:46
gru_variant_type_t type
Definition: gru_variant.h:44