WPILibC++ 2027.0.0-alpha-3
Loading...
Searching...
No Matches
field.h
Go to the documentation of this file.
1// Protocol Buffers - Google's data interchange format
2// Copyright 2023 Google LLC. All rights reserved.
3//
4// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file or at
6// https://developers.google.com/open-source/licenses/bsd
7
8#ifndef UPB_MINI_TABLE_INTERNAL_FIELD_H_
9#define UPB_MINI_TABLE_INTERNAL_FIELD_H_
10
11#include <stddef.h>
12#include <stdint.h>
13
16
17// Must be last.
18#include "upb/port/def.inc"
19
20// LINT.IfChange(struct_definition)
22 uint32_t UPB_ONLYBITS(number);
23 uint16_t UPB_ONLYBITS(offset);
24 int16_t presence; // If >0, hasbit_index. If <0, ~oneof_index
25
26 // Indexes into `upb_MiniTable.subs`
27 // Will be set to `kUpb_NoSub` if `descriptortype` != MESSAGE/GROUP/ENUM
28 uint16_t UPB_PRIVATE(submsg_index);
29
30 uint8_t UPB_PRIVATE(descriptortype);
31
32 // upb_FieldMode | upb_LabelFlags | (upb_FieldRep << kUpb_FieldRep_Shift)
33 uint8_t UPB_ONLYBITS(mode);
34};
35
36#define kUpb_NoSub ((uint16_t)-1)
37
43
44// Mask to isolate the upb_FieldMode from field.mode.
45#define kUpb_FieldMode_Mask 3
46
47// Extra flags on the mode field.
48typedef enum {
51 // Indicates that this descriptor type is an "alternate type":
52 // - for Int32, this indicates that the actual type is Enum (but was
53 // rewritten to Int32 because it is an open enum that requires no check).
54 // - for Bytes, this indicates that the actual type is String (but does
55 // not require any UTF-8 check).
58
59// Note: we sort by this number when calculating layout order.
70
71#define kUpb_FieldRep_Shift 6
72
73#ifdef __cplusplus
74extern "C" {
75#endif
76
79 return (upb_FieldMode)(f->UPB_ONLYBITS(mode) & kUpb_FieldMode_Mask);
80}
81
84 return (upb_FieldRep)(f->UPB_ONLYBITS(mode) >> kUpb_FieldRep_Shift);
85}
86
91
96
101
103 const struct upb_MiniTableField* f) {
104 return (f->UPB_ONLYBITS(mode) & kUpb_LabelFlags_IsAlternate) != 0;
105}
106
111
113 const struct upb_MiniTableField* f) {
114 return (f->UPB_ONLYBITS(mode) & kUpb_LabelFlags_IsPacked) != 0;
115}
116
119 const upb_FieldType type = (upb_FieldType)f->UPB_PRIVATE(descriptortype);
121 if (type == kUpb_FieldType_Int32) return kUpb_FieldType_Enum;
123 UPB_ASSERT(false);
124 }
125 return type;
126}
127
132
134 const struct upb_MiniTableField* f) {
135 return f->presence > 0;
136}
137
139 const struct upb_MiniTableField* f) {
141 const uint16_t index = f->presence;
142 return (char)(1 << (index % 8));
143}
144
146 const struct upb_MiniTableField* f) {
148 const uint16_t index = f->presence;
149 return index / 8;
150}
151
153 const struct upb_MiniTableField* f) {
154 return f->UPB_PRIVATE(descriptortype) == kUpb_FieldType_Enum;
155}
156
158 const struct upb_MiniTableField* f) {
159 return f->presence < 0;
160}
161
163 const struct upb_MiniTableField* f) {
164 return f->UPB_PRIVATE(descriptortype) == kUpb_FieldType_Message ||
165 f->UPB_PRIVATE(descriptortype) == kUpb_FieldType_Group;
166}
167
169 const struct upb_MiniTableField* f) {
172 } else {
173 return f->presence != 0;
174 }
175}
176
177UPB_API_INLINE uint32_t
179 return f->UPB_ONLYBITS(number);
180}
181
182UPB_INLINE uint16_t
184 return f->UPB_ONLYBITS(offset);
185}
186
188 const struct upb_MiniTableField* f) {
190 return ~(ptrdiff_t)f->presence;
191}
192
200
208
210 const struct upb_MiniTableField* f) {
211 const upb_FieldType field_type = upb_MiniTableField_Type(f);
212 return UPB_PRIVATE(_upb_FieldType_SizeLg2)(field_type);
213}
214
215// LINT.ThenChange(//depot/google3/third_party/upb/bits/typescript/mini_table_field.ts)
216
217#ifdef __cplusplus
218} /* extern "C" */
219#endif
220
221#include "upb/port/undef.inc"
222
223#endif /* UPB_MINI_TABLE_INTERNAL_FIELD_H_ */
#define UPB_API_INLINE
Definition def.inc:163
#define UPB_SIZE(size32, size64)
Definition def.inc:112
#define UPB_ASSUME(expr)
Definition def.inc:319
#define UPB_ASSERT(expr)
Definition def.inc:329
#define UPB_PRIVATE(x)
Definition def.inc:393
#define UPB_INLINE
Definition def.inc:144
upb_CType
Definition descriptor_constants.h:18
upb_FieldType
Definition descriptor_constants.h:40
@ kUpb_FieldType_Group
Definition descriptor_constants.h:50
@ kUpb_FieldType_String
Definition descriptor_constants.h:49
@ kUpb_FieldType_Enum
Definition descriptor_constants.h:54
@ kUpb_FieldType_Message
Definition descriptor_constants.h:51
@ kUpb_FieldType_Int32
Definition descriptor_constants.h:45
@ kUpb_FieldType_Bytes
Definition descriptor_constants.h:52
UPB_INLINE upb_CType upb_FieldType_CType(upb_FieldType field_type)
Definition descriptor_constants.h:68
UPB_API_INLINE upb_FieldType upb_MiniTableField_Type(const upb_MiniTableField *f)
UPB_API_INLINE uint32_t upb_MiniTableField_Number(const upb_MiniTableField *f)
UPB_API_INLINE bool upb_MiniTableField_IsScalar(const upb_MiniTableField *f)
UPB_API_INLINE bool upb_MiniTableField_IsSubMessage(const upb_MiniTableField *f)
UPB_API_INLINE bool upb_MiniTableField_IsInOneof(const upb_MiniTableField *f)
UPB_API_INLINE bool upb_MiniTableField_IsPacked(const upb_MiniTableField *f)
UPB_API_INLINE bool upb_MiniTableField_HasPresence(const upb_MiniTableField *f)
UPB_API_INLINE upb_CType upb_MiniTableField_CType(const upb_MiniTableField *f)
UPB_API_INLINE bool upb_MiniTableField_IsMap(const upb_MiniTableField *f)
UPB_API_INLINE bool upb_MiniTableField_IsClosedEnum(const upb_MiniTableField *f)
UPB_API_INLINE bool upb_MiniTableField_IsExtension(const upb_MiniTableField *f)
UPB_API_INLINE bool upb_MiniTableField_IsArray(const upb_MiniTableField *f)
UPB_INLINE bool UPB_PRIVATE _upb_MiniTableField_HasHasbit(const struct upb_MiniTableField *f)
Definition field.h:133
UPB_INLINE char UPB_PRIVATE _upb_MiniTableField_HasbitMask(const struct upb_MiniTableField *f)
Definition field.h:138
UPB_INLINE bool UPB_PRIVATE _upb_MiniTableField_IsAlternate(const struct upb_MiniTableField *f)
Definition field.h:102
upb_LabelFlags
Definition field.h:48
@ kUpb_LabelFlags_IsAlternate
Definition field.h:56
@ kUpb_LabelFlags_IsPacked
Definition field.h:49
@ kUpb_LabelFlags_IsExtension
Definition field.h:50
#define kUpb_FieldRep_Shift
Definition field.h:71
UPB_INLINE upb_FieldMode UPB_PRIVATE _upb_MiniTableField_Mode(const struct upb_MiniTableField *f)
Definition field.h:78
UPB_INLINE size_t UPB_PRIVATE _upb_MiniTableField_ElemSizeLg2(const struct upb_MiniTableField *f)
Definition field.h:209
UPB_INLINE size_t UPB_PRIVATE _upb_MiniTableField_OneofOffset(const struct upb_MiniTableField *f)
Definition field.h:187
#define kUpb_FieldMode_Mask
Definition field.h:45
UPB_INLINE void UPB_PRIVATE _upb_MiniTableField_CheckIsArray(const struct upb_MiniTableField *f)
Definition field.h:193
UPB_INLINE upb_FieldRep UPB_PRIVATE _upb_MiniTableField_GetRep(const struct upb_MiniTableField *f)
Definition field.h:83
UPB_INLINE uint16_t UPB_PRIVATE _upb_MiniTableField_HasbitOffset(const struct upb_MiniTableField *f)
Definition field.h:145
upb_FieldRep
Definition field.h:60
@ kUpb_FieldRep_1Byte
Definition field.h:61
@ kUpb_FieldRep_NativePointer
Definition field.h:66
@ kUpb_FieldRep_StringView
Definition field.h:63
@ kUpb_FieldRep_Max
Definition field.h:68
@ kUpb_FieldRep_8Byte
Definition field.h:64
@ kUpb_FieldRep_4Byte
Definition field.h:62
UPB_INLINE void UPB_PRIVATE _upb_MiniTableField_CheckIsMap(const struct upb_MiniTableField *f)
Definition field.h:201
UPB_INLINE uint16_t UPB_PRIVATE _upb_MiniTableField_Offset(const struct upb_MiniTableField *f)
Definition field.h:183
upb_FieldMode
Definition field.h:38
@ kUpb_FieldMode_Map
Definition field.h:39
@ kUpb_FieldMode_Array
Definition field.h:40
@ kUpb_FieldMode_Scalar
Definition field.h:41
UPB_INLINE int UPB_PRIVATE _upb_FieldType_SizeLg2(upb_FieldType field_type)
Definition size_log2.h:45
Definition field.h:21
uint8_t UPB_PRIVATE(descriptortype)
uint32_t UPB_ONLYBITS(number)
int16_t presence
Definition field.h:24
uint16_t UPB_PRIVATE(submsg_index)
uint8_t UPB_ONLYBITS(mode)
uint16_t UPB_ONLYBITS(offset)