From bc916f1d0f8655c957b3de3b74370241605121ef Mon Sep 17 00:00:00 2001 From: Joshua Haberman Date: Sun, 23 Dec 2018 17:26:23 -0800 Subject: Added "add" accessors for repeated fields. --- upb/generated_util.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'upb/generated_util.h') diff --git a/upb/generated_util.h b/upb/generated_util.h index 9c5e189..5d6ccb4 100644 --- a/upb/generated_util.h +++ b/upb/generated_util.h @@ -42,6 +42,7 @@ UPB_INLINE void *_upb_array_resize_accessor(void *msg, size_t ofs, size_t size, upb_fieldtype_t type, upb_arena *arena) { upb_array *arr = *PTR_AT(msg, ofs, upb_array*); + if (!arr) { arr = upb_array_new(type, arena); if (!arr) return NULL; @@ -60,10 +61,25 @@ UPB_INLINE void *_upb_array_resize_accessor(void *msg, size_t ofs, size_t size, } arr->size = new_size; } + arr->len = size; return arr->data; } +UPB_INLINE bool _upb_array_append_accessor(void *msg, size_t ofs, + size_t elem_size, + upb_fieldtype_t type, + const void *value, + upb_arena *arena) { + upb_array *arr = *PTR_AT(msg, ofs, upb_array*); + size_t i = arr ? arr->len : 1; + void *data = + _upb_array_resize_accessor(msg, ofs, i + 1, elem_size, type, arena); + if (!data) return false; + memcpy(PTR_AT(data, i * elem_size, char), value, elem_size); + return true; +} + UPB_INLINE bool _upb_has_field(const void *msg, size_t idx) { return (*PTR_AT(msg, idx / 8, const char) & (idx % 8)) != 0; } -- cgit v1.2.3