msg.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /*
  2. ** Data structures for message tables, used for parsing and serialization.
  3. ** This are much lighter-weight than full reflection, but they are do not
  4. ** have enough information to convert to text format, JSON, etc.
  5. **
  6. ** The definitions in this file are internal to upb.
  7. **/
  8. #ifndef UPB_MSG_H_
  9. #define UPB_MSG_H_
  10. #include <stdint.h>
  11. #include <string.h>
  12. #include "upb/upb.h"
  13. #ifdef __cplusplus
  14. extern "C" {
  15. #endif
  16. typedef void upb_msg;
  17. /** upb_msglayout *************************************************************/
  18. /* upb_msglayout represents the memory layout of a given upb_msgdef. The
  19. * members are public so generated code can initialize them, but users MUST NOT
  20. * read or write any of its members. */
  21. typedef struct {
  22. uint32_t number;
  23. uint16_t offset;
  24. int16_t presence; /* If >0, hasbit_index+1. If <0, oneof_index+1. */
  25. uint16_t submsg_index; /* undefined if descriptortype != MESSAGE or GROUP. */
  26. uint8_t descriptortype;
  27. uint8_t label;
  28. } upb_msglayout_field;
  29. typedef struct upb_msglayout {
  30. const struct upb_msglayout *const* submsgs;
  31. const upb_msglayout_field *fields;
  32. /* Must be aligned to sizeof(void*). Doesn't include internal members like
  33. * unknown fields, extension dict, pointer to msglayout, etc. */
  34. uint16_t size;
  35. uint16_t field_count;
  36. bool extendable;
  37. } upb_msglayout;
  38. /** Message internal representation *******************************************/
  39. /* Our internal representation for repeated fields. */
  40. typedef struct {
  41. void *data; /* Each element is element_size. */
  42. size_t len; /* Measured in elements. */
  43. size_t size; /* Measured in elements. */
  44. } upb_array;
  45. upb_msg *upb_msg_new(const upb_msglayout *l, upb_arena *a);
  46. upb_msg *upb_msg_new(const upb_msglayout *l, upb_arena *a);
  47. void upb_msg_addunknown(upb_msg *msg, const char *data, size_t len,
  48. upb_arena *arena);
  49. const char *upb_msg_getunknown(const upb_msg *msg, size_t *len);
  50. upb_array *upb_array_new(upb_arena *a);
  51. #ifdef __cplusplus
  52. } /* extern "C" */
  53. #endif
  54. #endif /* UPB_MSG_H_ */