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_MESSAGE_ACCESSORS_H_ 9 #define UPB_MESSAGE_ACCESSORS_H_ 10 11 #include <stdint.h> 12 13 #include "upb/base/string_view.h" 14 #include "upb/mem/arena.h" 15 #include "upb/message/array.h" 16 #include "upb/message/internal/accessors.h" 17 #include "upb/message/map.h" 18 #include "upb/message/message.h" 19 #include "upb/message/tagged_ptr.h" 20 #include "upb/message/value.h" 21 #include "upb/mini_table/extension.h" 22 #include "upb/mini_table/field.h" 23 #include "upb/mini_table/message.h" 24 25 // Must be last. 26 #include "upb/port/def.inc" 27 28 #ifdef __cplusplus 29 extern "C" { 30 #endif 31 32 // Functions ending in BaseField() take a (upb_MiniTableField*) argument 33 // and work only on non-extension fields. 34 // 35 // Functions ending in Extension() take a (upb_MiniTableExtension*) argument 36 // and work only on extensions. 37 38 UPB_API_INLINE void upb_Message_Clear(upb_Message* msg, const upb_MiniTable* m); 39 40 UPB_API_INLINE void upb_Message_ClearBaseField(upb_Message* msg, 41 const upb_MiniTableField* f); 42 43 UPB_API_INLINE void upb_Message_ClearExtension(upb_Message* msg, 44 const upb_MiniTableExtension* e); 45 46 UPB_API_INLINE void upb_Message_ClearOneof(upb_Message* msg, 47 const upb_MiniTable* m, 48 const upb_MiniTableField* f); 49 50 UPB_API_INLINE bool upb_Message_HasBaseField(const upb_Message* msg, 51 const upb_MiniTableField* f); 52 53 UPB_API_INLINE bool upb_Message_HasExtension(const upb_Message* msg, 54 const upb_MiniTableExtension* e); 55 56 UPB_API_INLINE upb_MessageValue 57 upb_Message_GetField(const upb_Message* msg, const upb_MiniTableField* f, 58 upb_MessageValue default_val); 59 60 UPB_API_INLINE upb_TaggedMessagePtr upb_Message_GetTaggedMessagePtr( 61 const upb_Message* msg, const upb_MiniTableField* field, 62 upb_Message* default_val); 63 64 UPB_API_INLINE const upb_Array* upb_Message_GetArray( 65 const upb_Message* msg, const upb_MiniTableField* f); 66 67 UPB_API_INLINE bool upb_Message_GetBool(const upb_Message* msg, 68 const upb_MiniTableField* f, 69 bool default_val); 70 71 UPB_API_INLINE double upb_Message_GetDouble(const upb_Message* msg, 72 const upb_MiniTableField* field, 73 double default_val); 74 75 UPB_API_INLINE float upb_Message_GetFloat(const upb_Message* msg, 76 const upb_MiniTableField* f, 77 float default_val); 78 79 UPB_API_INLINE int32_t upb_Message_GetInt32(const upb_Message* msg, 80 const upb_MiniTableField* f, 81 int32_t default_val); 82 83 UPB_API_INLINE int64_t upb_Message_GetInt64(const upb_Message* msg, 84 const upb_MiniTableField* f, 85 int64_t default_val); 86 87 UPB_API_INLINE const upb_Map* upb_Message_GetMap(const upb_Message* msg, 88 const upb_MiniTableField* f); 89 90 UPB_API_INLINE const upb_Message* upb_Message_GetMessage( 91 const upb_Message* msg, const upb_MiniTableField* f); 92 93 UPB_API_INLINE upb_Array* upb_Message_GetMutableArray( 94 upb_Message* msg, const upb_MiniTableField* f); 95 96 UPB_API_INLINE upb_Map* upb_Message_GetMutableMap(upb_Message* msg, 97 const upb_MiniTableField* f); 98 99 UPB_API_INLINE upb_Message* upb_Message_GetMutableMessage( 100 upb_Message* msg, const upb_MiniTableField* f); 101 102 UPB_API_INLINE upb_Array* upb_Message_GetOrCreateMutableArray( 103 upb_Message* msg, const upb_MiniTableField* f, upb_Arena* arena); 104 105 UPB_API_INLINE upb_Map* upb_Message_GetOrCreateMutableMap( 106 upb_Message* msg, const upb_MiniTable* map_entry_mini_table, 107 const upb_MiniTableField* f, upb_Arena* arena); 108 109 UPB_API_INLINE upb_Message* upb_Message_GetOrCreateMutableMessage( 110 upb_Message* msg, const upb_MiniTable* mini_table, 111 const upb_MiniTableField* f, upb_Arena* arena); 112 113 UPB_API_INLINE upb_StringView 114 upb_Message_GetString(const upb_Message* msg, const upb_MiniTableField* field, 115 upb_StringView default_val); 116 117 UPB_API_INLINE uint32_t upb_Message_GetUInt32(const upb_Message* msg, 118 const upb_MiniTableField* f, 119 uint32_t default_val); 120 121 UPB_API_INLINE uint64_t upb_Message_GetUInt64(const upb_Message* msg, 122 const upb_MiniTableField* f, 123 uint64_t default_val); 124 125 UPB_API_INLINE void upb_Message_SetClosedEnum( 126 upb_Message* msg, const upb_MiniTable* msg_mini_table, 127 const upb_MiniTableField* f, int32_t value); 128 129 // BaseField Setters /////////////////////////////////////////////////////////// 130 131 UPB_API_INLINE void upb_Message_SetBaseField(upb_Message* msg, 132 const upb_MiniTableField* f, 133 const void* val); 134 135 UPB_API_INLINE void upb_Message_SetBaseFieldBool(struct upb_Message* msg, 136 const upb_MiniTableField* f, 137 bool value); 138 139 UPB_API_INLINE void upb_Message_SetBaseFieldDouble(struct upb_Message* msg, 140 const upb_MiniTableField* f, 141 double value); 142 143 UPB_API_INLINE void upb_Message_SetBaseFieldFloat(struct upb_Message* msg, 144 const upb_MiniTableField* f, 145 float value); 146 147 UPB_API_INLINE void upb_Message_SetBaseFieldInt32(struct upb_Message* msg, 148 const upb_MiniTableField* f, 149 int32_t value); 150 151 UPB_API_INLINE void upb_Message_SetBaseFieldInt64(struct upb_Message* msg, 152 const upb_MiniTableField* f, 153 int64_t value); 154 155 UPB_API_INLINE void upb_Message_SetBaseFieldMessage(struct upb_Message* msg, 156 const upb_MiniTableField* f, 157 upb_Message* value); 158 159 UPB_API_INLINE void upb_Message_SetBaseFieldString(struct upb_Message* msg, 160 const upb_MiniTableField* f, 161 upb_StringView value); 162 163 UPB_API_INLINE void upb_Message_SetBaseFieldUInt32(struct upb_Message* msg, 164 const upb_MiniTableField* f, 165 uint32_t value); 166 167 UPB_API_INLINE void upb_Message_SetBaseFieldUInt64(struct upb_Message* msg, 168 const upb_MiniTableField* f, 169 uint64_t value); 170 171 // Extension Setters /////////////////////////////////////////////////////////// 172 173 UPB_API_INLINE bool upb_Message_SetExtension(upb_Message* msg, 174 const upb_MiniTableExtension* e, 175 const void* value, upb_Arena* a); 176 177 UPB_API_INLINE bool upb_Message_SetExtensionBool( 178 struct upb_Message* msg, const upb_MiniTableExtension* e, bool value, 179 upb_Arena* a); 180 181 UPB_API_INLINE bool upb_Message_SetExtensionDouble( 182 struct upb_Message* msg, const upb_MiniTableExtension* e, double value, 183 upb_Arena* a); 184 185 UPB_API_INLINE bool upb_Message_SetExtensionFloat( 186 struct upb_Message* msg, const upb_MiniTableExtension* e, float value, 187 upb_Arena* a); 188 189 UPB_API_INLINE bool upb_Message_SetExtensionInt32( 190 struct upb_Message* msg, const upb_MiniTableExtension* e, int32_t value, 191 upb_Arena* a); 192 193 UPB_API_INLINE bool upb_Message_SetExtensionInt64( 194 struct upb_Message* msg, const upb_MiniTableExtension* e, int64_t value, 195 upb_Arena* a); 196 197 UPB_API_INLINE bool upb_Message_SetExtensionString( 198 struct upb_Message* msg, const upb_MiniTableExtension* e, 199 upb_StringView value, upb_Arena* a); 200 201 UPB_API_INLINE bool upb_Message_SetExtensionUInt32( 202 struct upb_Message* msg, const upb_MiniTableExtension* e, uint32_t value, 203 upb_Arena* a); 204 205 UPB_API_INLINE bool upb_Message_SetExtensionUInt64( 206 struct upb_Message* msg, const upb_MiniTableExtension* e, uint64_t value, 207 upb_Arena* a); 208 209 // Universal Setters /////////////////////////////////////////////////////////// 210 211 UPB_API_INLINE bool upb_Message_SetBool(upb_Message* msg, 212 const upb_MiniTableField* f, bool value, 213 upb_Arena* a); 214 215 UPB_API_INLINE bool upb_Message_SetDouble(upb_Message* msg, 216 const upb_MiniTableField* f, 217 double value, upb_Arena* a); 218 219 UPB_API_INLINE bool upb_Message_SetFloat(upb_Message* msg, 220 const upb_MiniTableField* f, 221 float value, upb_Arena* a); 222 223 UPB_API_INLINE bool upb_Message_SetInt32(upb_Message* msg, 224 const upb_MiniTableField* f, 225 int32_t value, upb_Arena* a); 226 227 UPB_API_INLINE bool upb_Message_SetInt64(upb_Message* msg, 228 const upb_MiniTableField* f, 229 int64_t value, upb_Arena* a); 230 231 // Unlike the other similarly-named setters, this function can only be 232 // called on base fields. Prefer upb_Message_SetBaseFieldMessage(). 233 UPB_API_INLINE void upb_Message_SetMessage(upb_Message* msg, 234 const upb_MiniTableField* f, 235 upb_Message* value); 236 237 UPB_API_INLINE bool upb_Message_SetString(upb_Message* msg, 238 const upb_MiniTableField* f, 239 upb_StringView value, upb_Arena* a); 240 241 UPB_API_INLINE bool upb_Message_SetUInt32(upb_Message* msg, 242 const upb_MiniTableField* f, 243 uint32_t value, upb_Arena* a); 244 245 UPB_API_INLINE bool upb_Message_SetUInt64(upb_Message* msg, 246 const upb_MiniTableField* f, 247 uint64_t value, upb_Arena* a); 248 249 //////////////////////////////////////////////////////////////////////////////// 250 251 UPB_API_INLINE void* upb_Message_ResizeArrayUninitialized( 252 upb_Message* msg, const upb_MiniTableField* f, size_t size, 253 upb_Arena* arena); 254 255 UPB_API_INLINE uint32_t upb_Message_WhichOneofFieldNumber( 256 const upb_Message* message, const upb_MiniTableField* oneof_field); 257 258 // For a field `f` which is in a oneof, return the field of that 259 // oneof that is actually set (or NULL if none). 260 UPB_API_INLINE const upb_MiniTableField* upb_Message_WhichOneof( 261 const upb_Message* msg, const upb_MiniTable* m, 262 const upb_MiniTableField* f); 263 264 // Updates a map entry given an entry message. 265 bool upb_Message_SetMapEntry(upb_Map* map, const upb_MiniTable* mini_table, 266 const upb_MiniTableField* field, 267 upb_Message* map_entry_message, upb_Arena* arena); 268 269 #ifdef __cplusplus 270 } /* extern "C" */ 271 #endif 272 273 #include "upb/port/undef.inc" 274 275 #endif // UPB_MESSAGE_ACCESSORS_H_ 276