json: Added element descriptor macro and C++ support progress
Added element descriptor macro with internal helper macros for arrays and objects. Improved support for C++ by switching to const struct in element descr Signed-off-by: Ramiro Merello <rmerello@itba.edu.ar>
This commit is contained in:
parent
5a39a73c4e
commit
82fd59a94b
1 changed files with 63 additions and 63 deletions
|
@ -178,6 +178,54 @@ typedef int (*json_append_bytes_t)(const char *bytes, size_t len,
|
||||||
}, \
|
}, \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @internal @brief Helper macro to declare an element descriptor
|
||||||
|
*
|
||||||
|
* @param struct_ Struct packing the values
|
||||||
|
* @param len_field_ Field name in the struct for the number of elements
|
||||||
|
* in the array
|
||||||
|
* @param elem_type_ Element type, must be a primitive type
|
||||||
|
* @param union_ Optional macro argument containing array or object descriptor
|
||||||
|
*/
|
||||||
|
#define Z_JSON_ELEMENT_DESCR(struct_, len_field_, elem_type_, union_) \
|
||||||
|
(const struct json_obj_descr[]) \
|
||||||
|
{ \
|
||||||
|
{ \
|
||||||
|
.align_shift = Z_ALIGN_SHIFT(struct_), \
|
||||||
|
.type = elem_type_, \
|
||||||
|
.offset = offsetof(struct_, len_field_), \
|
||||||
|
union_ \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @internal @brief Helper macro to declare an array descriptor
|
||||||
|
*
|
||||||
|
* @param elem_descr_ Element descriptor, pointer to a descriptor array
|
||||||
|
* @param elem_descr_len_ Number of elements in elem_descr_
|
||||||
|
*/
|
||||||
|
#define Z_JSON_DESCR_ARRAY(elem_descr_, elem_descr_len_) \
|
||||||
|
{ \
|
||||||
|
.array = { \
|
||||||
|
.element_descr = elem_descr_, \
|
||||||
|
.n_elements = elem_descr_len_, \
|
||||||
|
}, \
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @internal @brief Helper macro to declare an object descriptor
|
||||||
|
*
|
||||||
|
* @param elem_descr_ Element descriptor, pointer to a descriptor array
|
||||||
|
* @param elem_descr_len_ Number of elements in elem_descr_
|
||||||
|
*/
|
||||||
|
#define Z_JSON_DESCR_OBJ(elem_descr_, elem_descr_len_) \
|
||||||
|
{ \
|
||||||
|
.object = { \
|
||||||
|
.sub_descr = elem_descr_, \
|
||||||
|
.sub_descr_len = elem_descr_len_, \
|
||||||
|
}, \
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Helper macro to declare a descriptor for an array of primitives
|
* @brief Helper macro to declare a descriptor for an array of primitives
|
||||||
*
|
*
|
||||||
|
@ -210,14 +258,8 @@ typedef int (*json_append_bytes_t)(const char *bytes, size_t len,
|
||||||
.offset = offsetof(struct_, field_name_), \
|
.offset = offsetof(struct_, field_name_), \
|
||||||
{ \
|
{ \
|
||||||
.array = { \
|
.array = { \
|
||||||
.element_descr = (struct json_obj_descr[]) { { \
|
.element_descr = Z_JSON_ELEMENT_DESCR(struct_, len_field_, \
|
||||||
.align_shift = \
|
elem_type_,), \
|
||||||
Z_ALIGN_SHIFT(struct_), \
|
|
||||||
.type = elem_type_, \
|
|
||||||
.offset = \
|
|
||||||
offsetof(struct_, \
|
|
||||||
len_field_), \
|
|
||||||
} }, \
|
|
||||||
.n_elements = (max_len_), \
|
.n_elements = (max_len_), \
|
||||||
}, \
|
}, \
|
||||||
}, \
|
}, \
|
||||||
|
@ -267,21 +309,9 @@ typedef int (*json_append_bytes_t)(const char *bytes, size_t len,
|
||||||
.offset = offsetof(struct_, field_name_), \
|
.offset = offsetof(struct_, field_name_), \
|
||||||
{ \
|
{ \
|
||||||
.array = { \
|
.array = { \
|
||||||
.element_descr = (struct json_obj_descr[]) { { \
|
.element_descr = Z_JSON_ELEMENT_DESCR(struct_, len_field_, \
|
||||||
.align_shift = \
|
JSON_TOK_OBJECT_START, \
|
||||||
Z_ALIGN_SHIFT(struct_), \
|
Z_JSON_DESCR_OBJ(elem_descr_, elem_descr_len_)), \
|
||||||
.type = JSON_TOK_OBJECT_START, \
|
|
||||||
.offset = offsetof(struct_, \
|
|
||||||
len_field_), \
|
|
||||||
{ \
|
|
||||||
.object = { \
|
|
||||||
.sub_descr = \
|
|
||||||
elem_descr_, \
|
|
||||||
.sub_descr_len = \
|
|
||||||
elem_descr_len_, \
|
|
||||||
}, \
|
|
||||||
}, \
|
|
||||||
} }, \
|
|
||||||
.n_elements = (max_len_), \
|
.n_elements = (max_len_), \
|
||||||
}, \
|
}, \
|
||||||
}, \
|
}, \
|
||||||
|
@ -340,24 +370,11 @@ typedef int (*json_append_bytes_t)(const char *bytes, size_t len,
|
||||||
.offset = offsetof(struct_, field_name_), \
|
.offset = offsetof(struct_, field_name_), \
|
||||||
{ \
|
{ \
|
||||||
.array = { \
|
.array = { \
|
||||||
.element_descr = (struct json_obj_descr[]) { { \
|
.element_descr = Z_JSON_ELEMENT_DESCR( \
|
||||||
.align_shift = \
|
struct_, len_field_, JSON_TOK_ARRAY_START, \
|
||||||
Z_ALIGN_SHIFT(struct_), \
|
Z_JSON_DESCR_ARRAY( \
|
||||||
.type = JSON_TOK_ARRAY_START, \
|
elem_descr_, \
|
||||||
.offset = offsetof(struct_, \
|
1 + ZERO_OR_COMPILE_ERROR(elem_descr_len_ == 1))), \
|
||||||
len_field_), \
|
|
||||||
{ \
|
|
||||||
.array = { \
|
|
||||||
.element_descr = \
|
|
||||||
elem_descr_, \
|
|
||||||
.n_elements = \
|
|
||||||
1 + \
|
|
||||||
ZERO_OR_COMPILE_ERROR( \
|
|
||||||
elem_descr_len_ == 1 \
|
|
||||||
), \
|
|
||||||
}, \
|
|
||||||
}, \
|
|
||||||
} }, \
|
|
||||||
.n_elements = (max_len_), \
|
.n_elements = (max_len_), \
|
||||||
}, \
|
}, \
|
||||||
}, \
|
}, \
|
||||||
|
@ -443,13 +460,8 @@ typedef int (*json_append_bytes_t)(const char *bytes, size_t len,
|
||||||
.offset = offsetof(struct_, struct_field_name_), \
|
.offset = offsetof(struct_, struct_field_name_), \
|
||||||
{ \
|
{ \
|
||||||
.array = { \
|
.array = { \
|
||||||
.element_descr = (struct json_obj_descr[]) { { \
|
.element_descr = \
|
||||||
.align_shift = \
|
Z_JSON_ELEMENT_DESCR(struct_, len_field_, elem_type_,), \
|
||||||
Z_ALIGN_SHIFT(struct_), \
|
|
||||||
.type = elem_type_, \
|
|
||||||
.offset = offsetof(struct_, \
|
|
||||||
len_field_), \
|
|
||||||
} }, \
|
|
||||||
.n_elements = (max_len_), \
|
.n_elements = (max_len_), \
|
||||||
}, \
|
}, \
|
||||||
}, \
|
}, \
|
||||||
|
@ -507,21 +519,9 @@ typedef int (*json_append_bytes_t)(const char *bytes, size_t len,
|
||||||
.offset = offsetof(struct_, struct_field_name_), \
|
.offset = offsetof(struct_, struct_field_name_), \
|
||||||
{ \
|
{ \
|
||||||
.array = { \
|
.array = { \
|
||||||
.element_descr = (struct json_obj_descr[]) { { \
|
.element_descr = Z_JSON_ELEMENT_DESCR(struct_, len_field_, \
|
||||||
.align_shift = \
|
JSON_TOK_OBJECT_START, \
|
||||||
Z_ALIGN_SHIFT(struct_), \
|
Z_JSON_DESCR_OBJ(elem_descr_, elem_descr_len_)), \
|
||||||
.type = JSON_TOK_OBJECT_START, \
|
|
||||||
.offset = offsetof(struct_, \
|
|
||||||
len_field_), \
|
|
||||||
{ \
|
|
||||||
.object = { \
|
|
||||||
.sub_descr = \
|
|
||||||
elem_descr_, \
|
|
||||||
.sub_descr_len = \
|
|
||||||
elem_descr_len_, \
|
|
||||||
}, \
|
|
||||||
}, \
|
|
||||||
} }, \
|
|
||||||
.n_elements = (max_len_), \
|
.n_elements = (max_len_), \
|
||||||
}, \
|
}, \
|
||||||
}, \
|
}, \
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue