| // Protocol Buffers - Google's data interchange format |
| // Copyright 2023 Google LLC. All rights reserved. |
| // |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file or at |
| // https://developers.google.com/open-source/licenses/bsd |
| |
| #ifndef UPB_REFLECTION_DEF_TYPE_H_ |
| #define UPB_REFLECTION_DEF_TYPE_H_ |
| |
| #include "upb/hash/common.h" |
| |
| // Must be last. |
| #include "upb/port/def.inc" |
| |
| // Inside a symtab we store tagged pointers to specific def types. |
| typedef enum { |
| UPB_DEFTYPE_MASK = 7, |
| |
| // Only inside symtab table. |
| UPB_DEFTYPE_EXT = 0, |
| UPB_DEFTYPE_MSG = 1, |
| UPB_DEFTYPE_ENUM = 2, |
| UPB_DEFTYPE_ENUMVAL = 3, |
| UPB_DEFTYPE_SERVICE = 4, |
| |
| // Only inside message table. |
| UPB_DEFTYPE_FIELD = 0, |
| UPB_DEFTYPE_ONEOF = 1, |
| } upb_deftype_t; |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| // Our 3-bit pointer tagging requires all pointers to be multiples of 8. |
| // The arena will always yield 8-byte-aligned addresses, however we put |
| // the defs into arrays. For each element in the array to be 8-byte-aligned, |
| // the sizes of each def type must also be a multiple of 8. |
| // |
| // If any of these asserts fail, we need to add or remove padding on 32-bit |
| // machines (64-bit machines will have 8-byte alignment already due to |
| // pointers, which all of these structs have). |
| UPB_INLINE void _upb_DefType_CheckPadding(size_t size) { |
| UPB_ASSERT((size & UPB_DEFTYPE_MASK) == 0); |
| } |
| |
| upb_deftype_t _upb_DefType_Type(upb_value v); |
| |
| upb_value _upb_DefType_Pack(const void* ptr, upb_deftype_t type); |
| |
| const void* _upb_DefType_Unpack(upb_value v, upb_deftype_t type); |
| |
| #ifdef __cplusplus |
| } /* extern "C" */ |
| #endif |
| |
| #include "upb/port/undef.inc" |
| |
| #endif /* UPB_REFLECTION_DEF_TYPE_H_ */ |