Skip to content

Commit 82fd59a

Browse files
Sir-Branchcfriedt
authored andcommitted
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 <[email protected]>
1 parent 5a39a73 commit 82fd59a

File tree

1 file changed

+63
-63
lines changed

1 file changed

+63
-63
lines changed

include/data/json.h

Lines changed: 63 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,54 @@ typedef int (*json_append_bytes_t)(const char *bytes, size_t len,
178178
}, \
179179
}
180180

181+
/**
182+
* @internal @brief Helper macro to declare an element descriptor
183+
*
184+
* @param struct_ Struct packing the values
185+
* @param len_field_ Field name in the struct for the number of elements
186+
* in the array
187+
* @param elem_type_ Element type, must be a primitive type
188+
* @param union_ Optional macro argument containing array or object descriptor
189+
*/
190+
#define Z_JSON_ELEMENT_DESCR(struct_, len_field_, elem_type_, union_) \
191+
(const struct json_obj_descr[]) \
192+
{ \
193+
{ \
194+
.align_shift = Z_ALIGN_SHIFT(struct_), \
195+
.type = elem_type_, \
196+
.offset = offsetof(struct_, len_field_), \
197+
union_ \
198+
} \
199+
}
200+
201+
/**
202+
* @internal @brief Helper macro to declare an array descriptor
203+
*
204+
* @param elem_descr_ Element descriptor, pointer to a descriptor array
205+
* @param elem_descr_len_ Number of elements in elem_descr_
206+
*/
207+
#define Z_JSON_DESCR_ARRAY(elem_descr_, elem_descr_len_) \
208+
{ \
209+
.array = { \
210+
.element_descr = elem_descr_, \
211+
.n_elements = elem_descr_len_, \
212+
}, \
213+
}
214+
215+
/**
216+
* @internal @brief Helper macro to declare an object descriptor
217+
*
218+
* @param elem_descr_ Element descriptor, pointer to a descriptor array
219+
* @param elem_descr_len_ Number of elements in elem_descr_
220+
*/
221+
#define Z_JSON_DESCR_OBJ(elem_descr_, elem_descr_len_) \
222+
{ \
223+
.object = { \
224+
.sub_descr = elem_descr_, \
225+
.sub_descr_len = elem_descr_len_, \
226+
}, \
227+
}
228+
181229
/**
182230
* @brief Helper macro to declare a descriptor for an array of primitives
183231
*
@@ -210,14 +258,8 @@ typedef int (*json_append_bytes_t)(const char *bytes, size_t len,
210258
.offset = offsetof(struct_, field_name_), \
211259
{ \
212260
.array = { \
213-
.element_descr = (struct json_obj_descr[]) { { \
214-
.align_shift = \
215-
Z_ALIGN_SHIFT(struct_), \
216-
.type = elem_type_, \
217-
.offset = \
218-
offsetof(struct_, \
219-
len_field_), \
220-
} }, \
261+
.element_descr = Z_JSON_ELEMENT_DESCR(struct_, len_field_, \
262+
elem_type_,), \
221263
.n_elements = (max_len_), \
222264
}, \
223265
}, \
@@ -267,21 +309,9 @@ typedef int (*json_append_bytes_t)(const char *bytes, size_t len,
267309
.offset = offsetof(struct_, field_name_), \
268310
{ \
269311
.array = { \
270-
.element_descr = (struct json_obj_descr[]) { { \
271-
.align_shift = \
272-
Z_ALIGN_SHIFT(struct_), \
273-
.type = JSON_TOK_OBJECT_START, \
274-
.offset = offsetof(struct_, \
275-
len_field_), \
276-
{ \
277-
.object = { \
278-
.sub_descr = \
279-
elem_descr_, \
280-
.sub_descr_len = \
281-
elem_descr_len_, \
282-
}, \
283-
}, \
284-
} }, \
312+
.element_descr = Z_JSON_ELEMENT_DESCR(struct_, len_field_, \
313+
JSON_TOK_OBJECT_START, \
314+
Z_JSON_DESCR_OBJ(elem_descr_, elem_descr_len_)), \
285315
.n_elements = (max_len_), \
286316
}, \
287317
}, \
@@ -340,24 +370,11 @@ typedef int (*json_append_bytes_t)(const char *bytes, size_t len,
340370
.offset = offsetof(struct_, field_name_), \
341371
{ \
342372
.array = { \
343-
.element_descr = (struct json_obj_descr[]) { { \
344-
.align_shift = \
345-
Z_ALIGN_SHIFT(struct_), \
346-
.type = JSON_TOK_ARRAY_START, \
347-
.offset = offsetof(struct_, \
348-
len_field_), \
349-
{ \
350-
.array = { \
351-
.element_descr = \
352-
elem_descr_, \
353-
.n_elements = \
354-
1 + \
355-
ZERO_OR_COMPILE_ERROR( \
356-
elem_descr_len_ == 1 \
357-
), \
358-
}, \
359-
}, \
360-
} }, \
373+
.element_descr = Z_JSON_ELEMENT_DESCR( \
374+
struct_, len_field_, JSON_TOK_ARRAY_START, \
375+
Z_JSON_DESCR_ARRAY( \
376+
elem_descr_, \
377+
1 + ZERO_OR_COMPILE_ERROR(elem_descr_len_ == 1))), \
361378
.n_elements = (max_len_), \
362379
}, \
363380
}, \
@@ -443,13 +460,8 @@ typedef int (*json_append_bytes_t)(const char *bytes, size_t len,
443460
.offset = offsetof(struct_, struct_field_name_), \
444461
{ \
445462
.array = { \
446-
.element_descr = (struct json_obj_descr[]) { { \
447-
.align_shift = \
448-
Z_ALIGN_SHIFT(struct_), \
449-
.type = elem_type_, \
450-
.offset = offsetof(struct_, \
451-
len_field_), \
452-
} }, \
463+
.element_descr = \
464+
Z_JSON_ELEMENT_DESCR(struct_, len_field_, elem_type_,), \
453465
.n_elements = (max_len_), \
454466
}, \
455467
}, \
@@ -507,21 +519,9 @@ typedef int (*json_append_bytes_t)(const char *bytes, size_t len,
507519
.offset = offsetof(struct_, struct_field_name_), \
508520
{ \
509521
.array = { \
510-
.element_descr = (struct json_obj_descr[]) { { \
511-
.align_shift = \
512-
Z_ALIGN_SHIFT(struct_), \
513-
.type = JSON_TOK_OBJECT_START, \
514-
.offset = offsetof(struct_, \
515-
len_field_), \
516-
{ \
517-
.object = { \
518-
.sub_descr = \
519-
elem_descr_, \
520-
.sub_descr_len = \
521-
elem_descr_len_, \
522-
}, \
523-
}, \
524-
} }, \
522+
.element_descr = Z_JSON_ELEMENT_DESCR(struct_, len_field_, \
523+
JSON_TOK_OBJECT_START, \
524+
Z_JSON_DESCR_OBJ(elem_descr_, elem_descr_len_)), \
525525
.n_elements = (max_len_), \
526526
}, \
527527
}, \

0 commit comments

Comments
 (0)