// 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_MINI_TABLE_FIELD_H_ #define UPB_MINI_TABLE_FIELD_H_ #include "upb/mini_table/internal/field.h" #include "upb/mini_table/internal/message.h" #include "upb/mini_table/internal/sub.h" // Must be last. #include "upb/port/def.inc" #ifdef __cplusplus extern "C" { #endif typedef struct upb_MiniTableField upb_MiniTableField; UPB_API_INLINE upb_FieldType upb_MiniTableField_Type(const upb_MiniTableField* field) { if (field->mode & kUpb_LabelFlags_IsAlternate) { if (field->UPB_PRIVATE(descriptortype) == kUpb_FieldType_Int32) { return kUpb_FieldType_Enum; } else if (field->UPB_PRIVATE(descriptortype) == kUpb_FieldType_Bytes) { return kUpb_FieldType_String; } else { UPB_ASSERT(false); } } return (upb_FieldType)field->UPB_PRIVATE(descriptortype); } UPB_API_INLINE upb_CType upb_MiniTableField_CType(const upb_MiniTableField* f) { switch (upb_MiniTableField_Type(f)) { case kUpb_FieldType_Double: return kUpb_CType_Double; case kUpb_FieldType_Float: return kUpb_CType_Float; case kUpb_FieldType_Int64: case kUpb_FieldType_SInt64: case kUpb_FieldType_SFixed64: return kUpb_CType_Int64; case kUpb_FieldType_Int32: case kUpb_FieldType_SFixed32: case kUpb_FieldType_SInt32: return kUpb_CType_Int32; case kUpb_FieldType_UInt64: case kUpb_FieldType_Fixed64: return kUpb_CType_UInt64; case kUpb_FieldType_UInt32: case kUpb_FieldType_Fixed32: return kUpb_CType_UInt32; case kUpb_FieldType_Enum: return kUpb_CType_Enum; case kUpb_FieldType_Bool: return kUpb_CType_Bool; case kUpb_FieldType_String: return kUpb_CType_String; case kUpb_FieldType_Bytes: return kUpb_CType_Bytes; case kUpb_FieldType_Group: case kUpb_FieldType_Message: return kUpb_CType_Message; } UPB_UNREACHABLE(); } UPB_API_INLINE bool upb_MiniTableField_IsExtension( const upb_MiniTableField* field) { return field->mode & kUpb_LabelFlags_IsExtension; } UPB_API_INLINE bool upb_MiniTableField_IsClosedEnum( const upb_MiniTableField* field) { return field->UPB_PRIVATE(descriptortype) == kUpb_FieldType_Enum; } UPB_API_INLINE bool upb_MiniTableField_HasPresence( const upb_MiniTableField* field) { if (upb_MiniTableField_IsExtension(field)) { return !upb_IsRepeatedOrMap(field); } else { return field->presence != 0; } } #ifdef __cplusplus } /* extern "C" */ #endif #include "upb/port/undef.inc" #endif /* UPB_MINI_TABLE_FIELD_H_ */