Protocol Buffers - Google's data interchange format (grpc依赖)
https://developers.google.com/protocol-buffers/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
2.6 KiB
89 lines
2.6 KiB
/* |
|
** Functions for use by generated code. These are not public and users must |
|
** not call them directly. |
|
*/ |
|
|
|
#ifndef UPB_GENERATED_UTIL_H_ |
|
#define UPB_GENERATED_UTIL_H_ |
|
|
|
#include <stdint.h> |
|
#include "upb/msg.h" |
|
|
|
#include "upb/port_def.inc" |
|
|
|
#define PTR_AT(msg, ofs, type) (type*)((const char*)msg + ofs) |
|
|
|
UPB_INLINE const void *_upb_array_accessor(const void *msg, size_t ofs, |
|
size_t *size) { |
|
const upb_array *arr = *PTR_AT(msg, ofs, const upb_array*); |
|
if (arr) { |
|
if (size) *size = arr->len; |
|
return _upb_array_constptr(arr); |
|
} else { |
|
if (size) *size = 0; |
|
return NULL; |
|
} |
|
} |
|
|
|
UPB_INLINE void *_upb_array_mutable_accessor(void *msg, size_t ofs, |
|
size_t *size) { |
|
upb_array *arr = *PTR_AT(msg, ofs, upb_array*); |
|
if (arr) { |
|
if (size) *size = arr->len; |
|
return _upb_array_ptr(arr); |
|
} else { |
|
if (size) *size = 0; |
|
return NULL; |
|
} |
|
} |
|
|
|
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 = PTR_AT(msg, ofs, upb_array*); |
|
upb_array *arr = *arr_ptr; |
|
if (!arr || arr->size < size) { |
|
return _upb_array_resize_fallback(arr_ptr, size, type, arena); |
|
} |
|
arr->len = size; |
|
return _upb_array_ptr(arr); |
|
} |
|
|
|
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 = PTR_AT(msg, ofs, upb_array*); |
|
upb_array *arr = *arr_ptr; |
|
void* ptr; |
|
if (!arr || arr->len == arr->size) { |
|
return _upb_array_append_fallback(arr_ptr, value, type, arena); |
|
} |
|
ptr = _upb_array_ptr(arr); |
|
memcpy(PTR_AT(ptr, arr->len * elem_size, char), value, elem_size); |
|
arr->len++; |
|
return true; |
|
} |
|
|
|
UPB_INLINE bool _upb_has_field(const void *msg, size_t idx) { |
|
return (*PTR_AT(msg, idx / 8, const char) & (1 << (idx % 8))) != 0; |
|
} |
|
|
|
UPB_INLINE bool _upb_sethas(const void *msg, size_t idx) { |
|
return (*PTR_AT(msg, idx / 8, char)) |= (char)(1 << (idx % 8)); |
|
} |
|
|
|
UPB_INLINE bool _upb_clearhas(const void *msg, size_t idx) { |
|
return (*PTR_AT(msg, idx / 8, char)) &= (char)(~(1 << (idx % 8))); |
|
} |
|
|
|
UPB_INLINE bool _upb_has_oneof_field(const void *msg, size_t case_ofs, int32_t num) { |
|
return *PTR_AT(msg, case_ofs, int32_t) == num; |
|
} |
|
|
|
#undef PTR_AT |
|
|
|
#include "upb/port_undef.inc" |
|
|
|
#endif /* UPB_GENERATED_UTIL_H_ */
|
|
|