blob: 976963e6c567e5970371c4b0d7838c4b60e66017 [file] [log] [blame]
// 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_ */