OLD | NEW |
| (Empty) |
1 // Amalgamated source file | |
2 /* | |
3 ** Defs are upb's internal representation of the constructs that can appear | |
4 ** in a .proto file: | |
5 ** | |
6 ** - upb::MessageDef (upb_msgdef): describes a "message" construct. | |
7 ** - upb::FieldDef (upb_fielddef): describes a message field. | |
8 ** - upb::EnumDef (upb_enumdef): describes an enum. | |
9 ** - upb::OneofDef (upb_oneofdef): describes a oneof. | |
10 ** - upb::Def (upb_def): base class of all the others. | |
11 ** | |
12 ** TODO: definitions of services. | |
13 ** | |
14 ** Like upb_refcounted objects, defs are mutable only until frozen, and are | |
15 ** only thread-safe once frozen. | |
16 ** | |
17 ** This is a mixed C/C++ interface that offers a full API to both languages. | |
18 ** See the top-level README for more information. | |
19 */ | |
20 | |
21 #ifndef UPB_DEF_H_ | |
22 #define UPB_DEF_H_ | |
23 | |
24 /* | |
25 ** upb::RefCounted (upb_refcounted) | |
26 ** | |
27 ** A refcounting scheme that supports circular refs. It accomplishes this by | |
28 ** partitioning the set of objects into groups such that no cycle spans groups; | |
29 ** we can then reference-count the group as a whole and ignore refs within the | |
30 ** group. When objects are mutable, these groups are computed very | |
31 ** conservatively; we group any objects that have ever had a link between them. | |
32 ** When objects are frozen, we compute strongly-connected components which | |
33 ** allows us to be precise and only group objects that are actually cyclic. | |
34 ** | |
35 ** This is a mixed C/C++ interface that offers a full API to both languages. | |
36 ** See the top-level README for more information. | |
37 */ | |
38 | |
39 #ifndef UPB_REFCOUNTED_H_ | |
40 #define UPB_REFCOUNTED_H_ | |
41 | |
42 /* | |
43 ** upb_table | |
44 ** | |
45 ** This header is INTERNAL-ONLY! Its interfaces are not public or stable! | |
46 ** This file defines very fast int->upb_value (inttable) and string->upb_value | |
47 ** (strtable) hash tables. | |
48 ** | |
49 ** The table uses chained scatter with Brent's variation (inspired by the Lua | |
50 ** implementation of hash tables). The hash function for strings is Austin | |
51 ** Appleby's "MurmurHash." | |
52 ** | |
53 ** The inttable uses uintptr_t as its key, which guarantees it can be used to | |
54 ** store pointers or integers of at least 32 bits (upb isn't really useful on | |
55 ** systems where sizeof(void*) < 4). | |
56 ** | |
57 ** The table must be homogenous (all values of the same type). In debug | |
58 ** mode, we check this on insert and lookup. | |
59 */ | |
60 | |
61 #ifndef UPB_TABLE_H_ | |
62 #define UPB_TABLE_H_ | |
63 | |
64 #include <assert.h> | |
65 #include <stdint.h> | |
66 #include <string.h> | |
67 /* | |
68 ** This file contains shared definitions that are widely used across upb. | |
69 ** | |
70 ** This is a mixed C/C++ interface that offers a full API to both languages. | |
71 ** See the top-level README for more information. | |
72 */ | |
73 | |
74 #ifndef UPB_H_ | |
75 #define UPB_H_ | |
76 | |
77 #include <assert.h> | |
78 #include <stdarg.h> | |
79 #include <stdbool.h> | |
80 #include <stddef.h> | |
81 | |
82 /* UPB_INLINE: inline if possible, emit standalone code if required. */ | |
83 #ifdef __cplusplus | |
84 #define UPB_INLINE inline | |
85 #elif defined (__GNUC__) | |
86 #define UPB_INLINE static __inline__ | |
87 #else | |
88 #define UPB_INLINE static | |
89 #endif | |
90 | |
91 /* Define UPB_BIG_ENDIAN manually if you're on big endian and your compiler | |
92 * doesn't provide these preprocessor symbols. */ | |
93 #if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) | |
94 #define UPB_BIG_ENDIAN | |
95 #endif | |
96 | |
97 /* Macros for function attributes on compilers that support them. */ | |
98 #ifdef __GNUC__ | |
99 #define UPB_FORCEINLINE __inline__ __attribute__((always_inline)) | |
100 #define UPB_NOINLINE __attribute__((noinline)) | |
101 #define UPB_NORETURN __attribute__((__noreturn__)) | |
102 #else /* !defined(__GNUC__) */ | |
103 #define UPB_FORCEINLINE | |
104 #define UPB_NOINLINE | |
105 #define UPB_NORETURN | |
106 #endif | |
107 | |
108 /* A few hacky workarounds for functions not in C89. | |
109 * For internal use only! | |
110 * TODO(haberman): fix these by including our own implementations, or finding | |
111 * another workaround. | |
112 */ | |
113 #ifdef __GNUC__ | |
114 #define _upb_snprintf __builtin_snprintf | |
115 #define _upb_vsnprintf __builtin_vsnprintf | |
116 #define _upb_va_copy(a, b) __va_copy(a, b) | |
117 #elif __STDC_VERSION__ >= 199901L | |
118 /* C99 versions. */ | |
119 #define _upb_snprintf snprintf | |
120 #define _upb_vsnprintf vsnprintf | |
121 #define _upb_va_copy(a, b) va_copy(a, b) | |
122 #else | |
123 #error Need implementations of [v]snprintf and va_copy | |
124 #endif | |
125 | |
126 | |
127 #if ((defined(__cplusplus) && __cplusplus >= 201103L) || \ | |
128 defined(__GXX_EXPERIMENTAL_CXX0X__)) && !defined(UPB_NO_CXX11) | |
129 #define UPB_CXX11 | |
130 #endif | |
131 | |
132 /* UPB_DISALLOW_COPY_AND_ASSIGN() | |
133 * UPB_DISALLOW_POD_OPS() | |
134 * | |
135 * Declare these in the "private" section of a C++ class to forbid copy/assign | |
136 * or all POD ops (construct, destruct, copy, assign) on that class. */ | |
137 #ifdef UPB_CXX11 | |
138 #include <type_traits> | |
139 #define UPB_DISALLOW_COPY_AND_ASSIGN(class_name) \ | |
140 class_name(const class_name&) = delete; \ | |
141 void operator=(const class_name&) = delete; | |
142 #define UPB_DISALLOW_POD_OPS(class_name, full_class_name) \ | |
143 class_name() = delete; \ | |
144 ~class_name() = delete; \ | |
145 UPB_DISALLOW_COPY_AND_ASSIGN(class_name) | |
146 #define UPB_ASSERT_STDLAYOUT(type) \ | |
147 static_assert(std::is_standard_layout<type>::value, \ | |
148 #type " must be standard layout"); | |
149 #else /* !defined(UPB_CXX11) */ | |
150 #define UPB_DISALLOW_COPY_AND_ASSIGN(class_name) \ | |
151 class_name(const class_name&); \ | |
152 void operator=(const class_name&); | |
153 #define UPB_DISALLOW_POD_OPS(class_name, full_class_name) \ | |
154 class_name(); \ | |
155 ~class_name(); \ | |
156 UPB_DISALLOW_COPY_AND_ASSIGN(class_name) | |
157 #define UPB_ASSERT_STDLAYOUT(type) | |
158 #endif | |
159 | |
160 /* UPB_DECLARE_TYPE() | |
161 * UPB_DECLARE_DERIVED_TYPE() | |
162 * UPB_DECLARE_DERIVED_TYPE2() | |
163 * | |
164 * Macros for declaring C and C++ types both, including inheritance. | |
165 * The inheritance doesn't use real C++ inheritance, to stay compatible with C. | |
166 * | |
167 * These macros also provide upcasts: | |
168 * - in C: types-specific functions (ie. upb_foo_upcast(foo)) | |
169 * - in C++: upb::upcast(foo) along with implicit conversions | |
170 * | |
171 * Downcasts are not provided, but upb/def.h defines downcasts for upb::Def. */ | |
172 | |
173 #define UPB_C_UPCASTS(ty, base) \ | |
174 UPB_INLINE base *ty ## _upcast_mutable(ty *p) { return (base*)p; } \ | |
175 UPB_INLINE const base *ty ## _upcast(const ty *p) { return (const base*)p; } | |
176 | |
177 #define UPB_C_UPCASTS2(ty, base, base2) \ | |
178 UPB_C_UPCASTS(ty, base) \ | |
179 UPB_INLINE base2 *ty ## _upcast2_mutable(ty *p) { return (base2*)p; } \ | |
180 UPB_INLINE const base2 *ty ## _upcast2(const ty *p) { return (const base2*)p;
} | |
181 | |
182 #ifdef __cplusplus | |
183 | |
184 #define UPB_BEGIN_EXTERN_C extern "C" { | |
185 #define UPB_END_EXTERN_C } | |
186 #define UPB_PRIVATE_FOR_CPP private: | |
187 #define UPB_DECLARE_TYPE(cppname, cname) typedef cppname cname; | |
188 | |
189 #define UPB_DECLARE_DERIVED_TYPE(cppname, cppbase, cname, cbase) \ | |
190 UPB_DECLARE_TYPE(cppname, cname) \ | |
191 UPB_C_UPCASTS(cname, cbase) \ | |
192 namespace upb { \ | |
193 template <> \ | |
194 class Pointer<cppname> : public PointerBase<cppname, cppbase> { \ | |
195 public: \ | |
196 explicit Pointer(cppname* ptr) : PointerBase(ptr) {} \ | |
197 }; \ | |
198 template <> \ | |
199 class Pointer<const cppname> \ | |
200 : public PointerBase<const cppname, const cppbase> { \ | |
201 public: \ | |
202 explicit Pointer(const cppname* ptr) : PointerBase(ptr) {} \ | |
203 }; \ | |
204 } | |
205 | |
206 #define UPB_DECLARE_DERIVED_TYPE2(cppname, cppbase, cppbase2, cname, cbase, \ | |
207 cbase2) \ | |
208 UPB_DECLARE_TYPE(cppname, cname) \ | |
209 UPB_C_UPCASTS2(cname, cbase, cbase2) \ | |
210 namespace upb { \ | |
211 template <> \ | |
212 class Pointer<cppname> : public PointerBase2<cppname, cppbase, cppbase2> { \ | |
213 public: \ | |
214 explicit Pointer(cppname* ptr) : PointerBase2(ptr) {} \ | |
215 }; \ | |
216 template <> \ | |
217 class Pointer<const cppname> \ | |
218 : public PointerBase2<const cppname, const cppbase, const cppbase2> { \ | |
219 public: \ | |
220 explicit Pointer(const cppname* ptr) : PointerBase2(ptr) {} \ | |
221 }; \ | |
222 } | |
223 | |
224 #else /* !defined(__cplusplus) */ | |
225 | |
226 #define UPB_BEGIN_EXTERN_C | |
227 #define UPB_END_EXTERN_C | |
228 #define UPB_PRIVATE_FOR_CPP | |
229 #define UPB_DECLARE_TYPE(cppname, cname) \ | |
230 struct cname; \ | |
231 typedef struct cname cname; | |
232 #define UPB_DECLARE_DERIVED_TYPE(cppname, cppbase, cname, cbase) \ | |
233 UPB_DECLARE_TYPE(cppname, cname) \ | |
234 UPB_C_UPCASTS(cname, cbase) | |
235 #define UPB_DECLARE_DERIVED_TYPE2(cppname, cppbase, cppbase2, \ | |
236 cname, cbase, cbase2) \ | |
237 UPB_DECLARE_TYPE(cppname, cname) \ | |
238 UPB_C_UPCASTS2(cname, cbase, cbase2) | |
239 | |
240 #endif /* defined(__cplusplus) */ | |
241 | |
242 #define UPB_MAX(x, y) ((x) > (y) ? (x) : (y)) | |
243 #define UPB_MIN(x, y) ((x) < (y) ? (x) : (y)) | |
244 | |
245 #define UPB_UNUSED(var) (void)var | |
246 | |
247 /* For asserting something about a variable when the variable is not used for | |
248 * anything else. This prevents "unused variable" warnings when compiling in | |
249 * debug mode. */ | |
250 #define UPB_ASSERT_VAR(var, predicate) UPB_UNUSED(var); assert(predicate) | |
251 | |
252 /* Generic function type. */ | |
253 typedef void upb_func(); | |
254 | |
255 /* C++ Casts ******************************************************************/ | |
256 | |
257 #ifdef __cplusplus | |
258 | |
259 namespace upb { | |
260 | |
261 template <class T> class Pointer; | |
262 | |
263 /* Casts to a subclass. The caller must know that cast is correct; an | |
264 * incorrect cast will throw an assertion failure in debug mode. | |
265 * | |
266 * Example: | |
267 * upb::Def* def = GetDef(); | |
268 * // Assert-fails if this was not actually a MessageDef. | |
269 * upb::MessgeDef* md = upb::down_cast<upb::MessageDef>(def); | |
270 * | |
271 * Note that downcasts are only defined for some types (at the moment you can | |
272 * only downcast from a upb::Def to a specific Def type). */ | |
273 template<class To, class From> To down_cast(From* f); | |
274 | |
275 /* Casts to a subclass. If the class does not actually match the given To type, | |
276 * returns NULL. | |
277 * | |
278 * Example: | |
279 * upb::Def* def = GetDef(); | |
280 * // md will be NULL if this was not actually a MessageDef. | |
281 * upb::MessgeDef* md = upb::down_cast<upb::MessageDef>(def); | |
282 * | |
283 * Note that dynamic casts are only defined for some types (at the moment you | |
284 * can only downcast from a upb::Def to a specific Def type).. */ | |
285 template<class To, class From> To dyn_cast(From* f); | |
286 | |
287 /* Casts to any base class, or the type itself (ie. can be a no-op). | |
288 * | |
289 * Example: | |
290 * upb::MessageDef* md = GetDef(); | |
291 * // This will fail to compile if this wasn't actually a base class. | |
292 * upb::Def* def = upb::upcast(md); | |
293 */ | |
294 template <class T> inline Pointer<T> upcast(T *f) { return Pointer<T>(f); } | |
295 | |
296 /* Attempt upcast to specific base class. | |
297 * | |
298 * Example: | |
299 * upb::MessageDef* md = GetDef(); | |
300 * upb::upcast_to<upb::Def>(md)->MethodOnDef(); | |
301 */ | |
302 template <class T, class F> inline T* upcast_to(F *f) { | |
303 return static_cast<T*>(upcast(f)); | |
304 } | |
305 | |
306 /* PointerBase<T>: implementation detail of upb::upcast(). | |
307 * It is implicitly convertable to pointers to the Base class(es). | |
308 */ | |
309 template <class T, class Base> | |
310 class PointerBase { | |
311 public: | |
312 explicit PointerBase(T* ptr) : ptr_(ptr) {} | |
313 operator T*() { return ptr_; } | |
314 operator Base*() { return (Base*)ptr_; } | |
315 | |
316 private: | |
317 T* ptr_; | |
318 }; | |
319 | |
320 template <class T, class Base, class Base2> | |
321 class PointerBase2 : public PointerBase<T, Base> { | |
322 public: | |
323 explicit PointerBase2(T* ptr) : PointerBase<T, Base>(ptr) {} | |
324 operator Base2*() { return Pointer<Base>(*this); } | |
325 }; | |
326 | |
327 } | |
328 | |
329 #endif | |
330 | |
331 | |
332 /* upb::reffed_ptr ************************************************************/ | |
333 | |
334 #ifdef __cplusplus | |
335 | |
336 #include <algorithm> /* For std::swap(). */ | |
337 | |
338 namespace upb { | |
339 | |
340 /* Provides RAII semantics for upb refcounted objects. Each reffed_ptr owns a | |
341 * ref on whatever object it points to (if any). */ | |
342 template <class T> class reffed_ptr { | |
343 public: | |
344 reffed_ptr() : ptr_(NULL) {} | |
345 | |
346 /* If ref_donor is NULL, takes a new ref, otherwise adopts from ref_donor. */ | |
347 template <class U> | |
348 reffed_ptr(U* val, const void* ref_donor = NULL) | |
349 : ptr_(upb::upcast(val)) { | |
350 if (ref_donor) { | |
351 assert(ptr_); | |
352 ptr_->DonateRef(ref_donor, this); | |
353 } else if (ptr_) { | |
354 ptr_->Ref(this); | |
355 } | |
356 } | |
357 | |
358 template <class U> | |
359 reffed_ptr(const reffed_ptr<U>& other) | |
360 : ptr_(upb::upcast(other.get())) { | |
361 if (ptr_) ptr_->Ref(this); | |
362 } | |
363 | |
364 ~reffed_ptr() { if (ptr_) ptr_->Unref(this); } | |
365 | |
366 template <class U> | |
367 reffed_ptr& operator=(const reffed_ptr<U>& other) { | |
368 reset(other.get()); | |
369 return *this; | |
370 } | |
371 | |
372 reffed_ptr& operator=(const reffed_ptr& other) { | |
373 reset(other.get()); | |
374 return *this; | |
375 } | |
376 | |
377 /* TODO(haberman): add C++11 move construction/assignment for greater | |
378 * efficiency. */ | |
379 | |
380 void swap(reffed_ptr& other) { | |
381 if (ptr_ == other.ptr_) { | |
382 return; | |
383 } | |
384 | |
385 if (ptr_) ptr_->DonateRef(this, &other); | |
386 if (other.ptr_) other.ptr_->DonateRef(&other, this); | |
387 std::swap(ptr_, other.ptr_); | |
388 } | |
389 | |
390 T& operator*() const { | |
391 assert(ptr_); | |
392 return *ptr_; | |
393 } | |
394 | |
395 T* operator->() const { | |
396 assert(ptr_); | |
397 return ptr_; | |
398 } | |
399 | |
400 T* get() const { return ptr_; } | |
401 | |
402 /* If ref_donor is NULL, takes a new ref, otherwise adopts from ref_donor. */ | |
403 template <class U> | |
404 void reset(U* ptr = NULL, const void* ref_donor = NULL) { | |
405 reffed_ptr(ptr, ref_donor).swap(*this); | |
406 } | |
407 | |
408 template <class U> | |
409 reffed_ptr<U> down_cast() { | |
410 return reffed_ptr<U>(upb::down_cast<U*>(get())); | |
411 } | |
412 | |
413 template <class U> | |
414 reffed_ptr<U> dyn_cast() { | |
415 return reffed_ptr<U>(upb::dyn_cast<U*>(get())); | |
416 } | |
417 | |
418 /* Plain release() is unsafe; if we were the only owner, it would leak the | |
419 * object. Instead we provide this: */ | |
420 T* ReleaseTo(const void* new_owner) { | |
421 T* ret = NULL; | |
422 ptr_->DonateRef(this, new_owner); | |
423 std::swap(ret, ptr_); | |
424 return ret; | |
425 } | |
426 | |
427 private: | |
428 T* ptr_; | |
429 }; | |
430 | |
431 } /* namespace upb */ | |
432 | |
433 #endif /* __cplusplus */ | |
434 | |
435 | |
436 /* upb::Status ****************************************************************/ | |
437 | |
438 #ifdef __cplusplus | |
439 namespace upb { | |
440 class ErrorSpace; | |
441 class Status; | |
442 } | |
443 #endif | |
444 | |
445 UPB_DECLARE_TYPE(upb::ErrorSpace, upb_errorspace) | |
446 UPB_DECLARE_TYPE(upb::Status, upb_status) | |
447 | |
448 /* The maximum length of an error message before it will get truncated. */ | |
449 #define UPB_STATUS_MAX_MESSAGE 128 | |
450 | |
451 /* An error callback function is used to report errors from some component. | |
452 * The function can return "true" to indicate that the component should try | |
453 * to recover and proceed, but this is not always possible. */ | |
454 typedef bool upb_errcb_t(void *closure, const upb_status* status); | |
455 | |
456 #ifdef __cplusplus | |
457 class upb::ErrorSpace { | |
458 #else | |
459 struct upb_errorspace { | |
460 #endif | |
461 const char *name; | |
462 /* Should the error message in the status object according to this code. */ | |
463 void (*set_message)(upb_status* status, int code); | |
464 }; | |
465 | |
466 #ifdef __cplusplus | |
467 | |
468 /* Object representing a success or failure status. | |
469 * It owns no resources and allocates no memory, so it should work | |
470 * even in OOM situations. */ | |
471 | |
472 class upb::Status { | |
473 public: | |
474 Status(); | |
475 | |
476 /* Returns true if there is no error. */ | |
477 bool ok() const; | |
478 | |
479 /* Optional error space and code, useful if the caller wants to | |
480 * programmatically check the specific kind of error. */ | |
481 ErrorSpace* error_space(); | |
482 int code() const; | |
483 | |
484 const char *error_message() const; | |
485 | |
486 /* The error message will be truncated if it is longer than | |
487 * UPB_STATUS_MAX_MESSAGE-4. */ | |
488 void SetErrorMessage(const char* msg); | |
489 void SetFormattedErrorMessage(const char* fmt, ...); | |
490 | |
491 /* If there is no error message already, this will use the ErrorSpace to | |
492 * populate the error message for this code. The caller can still call | |
493 * SetErrorMessage() to give a more specific message. */ | |
494 void SetErrorCode(ErrorSpace* space, int code); | |
495 | |
496 /* Resets the status to a successful state with no message. */ | |
497 void Clear(); | |
498 | |
499 void CopyFrom(const Status& other); | |
500 | |
501 private: | |
502 UPB_DISALLOW_COPY_AND_ASSIGN(Status) | |
503 #else | |
504 struct upb_status { | |
505 #endif | |
506 bool ok_; | |
507 | |
508 /* Specific status code defined by some error space (optional). */ | |
509 int code_; | |
510 upb_errorspace *error_space_; | |
511 | |
512 /* Error message; NULL-terminated. */ | |
513 char msg[UPB_STATUS_MAX_MESSAGE]; | |
514 }; | |
515 | |
516 #define UPB_STATUS_INIT {true, 0, NULL, {0}} | |
517 | |
518 #ifdef __cplusplus | |
519 extern "C" { | |
520 #endif | |
521 | |
522 /* The returned string is invalidated by any other call into the status. */ | |
523 const char *upb_status_errmsg(const upb_status *status); | |
524 bool upb_ok(const upb_status *status); | |
525 upb_errorspace *upb_status_errspace(const upb_status *status); | |
526 int upb_status_errcode(const upb_status *status); | |
527 | |
528 /* Any of the functions that write to a status object allow status to be NULL, | |
529 * to support use cases where the function's caller does not care about the | |
530 * status message. */ | |
531 void upb_status_clear(upb_status *status); | |
532 void upb_status_seterrmsg(upb_status *status, const char *msg); | |
533 void upb_status_seterrf(upb_status *status, const char *fmt, ...); | |
534 void upb_status_vseterrf(upb_status *status, const char *fmt, va_list args); | |
535 void upb_status_seterrcode(upb_status *status, upb_errorspace *space, int code); | |
536 void upb_status_copy(upb_status *to, const upb_status *from); | |
537 | |
538 #ifdef __cplusplus | |
539 } /* extern "C" */ | |
540 | |
541 namespace upb { | |
542 | |
543 /* C++ Wrappers */ | |
544 inline Status::Status() { Clear(); } | |
545 inline bool Status::ok() const { return upb_ok(this); } | |
546 inline const char* Status::error_message() const { | |
547 return upb_status_errmsg(this); | |
548 } | |
549 inline void Status::SetErrorMessage(const char* msg) { | |
550 upb_status_seterrmsg(this, msg); | |
551 } | |
552 inline void Status::SetFormattedErrorMessage(const char* fmt, ...) { | |
553 va_list args; | |
554 va_start(args, fmt); | |
555 upb_status_vseterrf(this, fmt, args); | |
556 va_end(args); | |
557 } | |
558 inline void Status::SetErrorCode(ErrorSpace* space, int code) { | |
559 upb_status_seterrcode(this, space, code); | |
560 } | |
561 inline void Status::Clear() { upb_status_clear(this); } | |
562 inline void Status::CopyFrom(const Status& other) { | |
563 upb_status_copy(this, &other); | |
564 } | |
565 | |
566 } /* namespace upb */ | |
567 | |
568 #endif | |
569 | |
570 #endif /* UPB_H_ */ | |
571 | |
572 #ifdef __cplusplus | |
573 extern "C" { | |
574 #endif | |
575 | |
576 | |
577 /* upb_value ******************************************************************/ | |
578 | |
579 /* A tagged union (stored untagged inside the table) so that we can check that | |
580 * clients calling table accessors are correctly typed without having to have | |
581 * an explosion of accessors. */ | |
582 typedef enum { | |
583 UPB_CTYPE_INT32 = 1, | |
584 UPB_CTYPE_INT64 = 2, | |
585 UPB_CTYPE_UINT32 = 3, | |
586 UPB_CTYPE_UINT64 = 4, | |
587 UPB_CTYPE_BOOL = 5, | |
588 UPB_CTYPE_CSTR = 6, | |
589 UPB_CTYPE_PTR = 7, | |
590 UPB_CTYPE_CONSTPTR = 8, | |
591 UPB_CTYPE_FPTR = 9 | |
592 } upb_ctype_t; | |
593 | |
594 typedef struct { | |
595 uint64_t val; | |
596 #ifndef NDEBUG | |
597 /* In debug mode we carry the value type around also so we can check accesses | |
598 * to be sure the right member is being read. */ | |
599 upb_ctype_t ctype; | |
600 #endif | |
601 } upb_value; | |
602 | |
603 #ifdef NDEBUG | |
604 #define SET_TYPE(dest, val) UPB_UNUSED(val) | |
605 #else | |
606 #define SET_TYPE(dest, val) dest = val | |
607 #endif | |
608 | |
609 /* Like strdup(), which isn't always available since it's not ANSI C. */ | |
610 char *upb_strdup(const char *s); | |
611 /* Variant that works with a length-delimited rather than NULL-delimited string, | |
612 * as supported by strtable. */ | |
613 char *upb_strdup2(const char *s, size_t len); | |
614 | |
615 UPB_INLINE void _upb_value_setval(upb_value *v, uint64_t val, | |
616 upb_ctype_t ctype) { | |
617 v->val = val; | |
618 SET_TYPE(v->ctype, ctype); | |
619 } | |
620 | |
621 UPB_INLINE upb_value _upb_value_val(uint64_t val, upb_ctype_t ctype) { | |
622 upb_value ret; | |
623 _upb_value_setval(&ret, val, ctype); | |
624 return ret; | |
625 } | |
626 | |
627 /* For each value ctype, define the following set of functions: | |
628 * | |
629 * // Get/set an int32 from a upb_value. | |
630 * int32_t upb_value_getint32(upb_value val); | |
631 * void upb_value_setint32(upb_value *val, int32_t cval); | |
632 * | |
633 * // Construct a new upb_value from an int32. | |
634 * upb_value upb_value_int32(int32_t val); */ | |
635 #define FUNCS(name, membername, type_t, converter, proto_type) \ | |
636 UPB_INLINE void upb_value_set ## name(upb_value *val, type_t cval) { \ | |
637 val->val = (converter)cval; \ | |
638 SET_TYPE(val->ctype, proto_type); \ | |
639 } \ | |
640 UPB_INLINE upb_value upb_value_ ## name(type_t val) { \ | |
641 upb_value ret; \ | |
642 upb_value_set ## name(&ret, val); \ | |
643 return ret; \ | |
644 } \ | |
645 UPB_INLINE type_t upb_value_get ## name(upb_value val) { \ | |
646 assert(val.ctype == proto_type); \ | |
647 return (type_t)(converter)val.val; \ | |
648 } | |
649 | |
650 FUNCS(int32, int32, int32_t, int32_t, UPB_CTYPE_INT32) | |
651 FUNCS(int64, int64, int64_t, int64_t, UPB_CTYPE_INT64) | |
652 FUNCS(uint32, uint32, uint32_t, uint32_t, UPB_CTYPE_UINT32) | |
653 FUNCS(uint64, uint64, uint64_t, uint64_t, UPB_CTYPE_UINT64) | |
654 FUNCS(bool, _bool, bool, bool, UPB_CTYPE_BOOL) | |
655 FUNCS(cstr, cstr, char*, uintptr_t, UPB_CTYPE_CSTR) | |
656 FUNCS(ptr, ptr, void*, uintptr_t, UPB_CTYPE_PTR) | |
657 FUNCS(constptr, constptr, const void*, uintptr_t, UPB_CTYPE_CONSTPTR) | |
658 FUNCS(fptr, fptr, upb_func*, uintptr_t, UPB_CTYPE_FPTR) | |
659 | |
660 #undef FUNCS | |
661 #undef SET_TYPE | |
662 | |
663 | |
664 /* upb_tabkey *****************************************************************/ | |
665 | |
666 /* Either: | |
667 * 1. an actual integer key, or | |
668 * 2. a pointer to a string prefixed by its uint32_t length, owned by us. | |
669 * | |
670 * ...depending on whether this is a string table or an int table. We would | |
671 * make this a union of those two types, but C89 doesn't support statically | |
672 * initializing a non-first union member. */ | |
673 typedef uintptr_t upb_tabkey; | |
674 | |
675 #define UPB_TABKEY_NUM(n) n | |
676 #define UPB_TABKEY_NONE 0 | |
677 /* The preprocessor isn't quite powerful enough to turn the compile-time string | |
678 * length into a byte-wise string representation, so code generation needs to | |
679 * help it along. | |
680 * | |
681 * "len1" is the low byte and len4 is the high byte. */ | |
682 #ifdef UPB_BIG_ENDIAN | |
683 #define UPB_TABKEY_STR(len1, len2, len3, len4, strval) \ | |
684 (uintptr_t)(len4 len3 len2 len1 strval) | |
685 #else | |
686 #define UPB_TABKEY_STR(len1, len2, len3, len4, strval) \ | |
687 (uintptr_t)(len1 len2 len3 len4 strval) | |
688 #endif | |
689 | |
690 UPB_INLINE char *upb_tabstr(upb_tabkey key, uint32_t *len) { | |
691 char* mem = (char*)key; | |
692 if (len) memcpy(len, mem, sizeof(*len)); | |
693 return mem + sizeof(*len); | |
694 } | |
695 | |
696 | |
697 /* upb_tabval *****************************************************************/ | |
698 | |
699 #ifdef __cplusplus | |
700 | |
701 /* Status initialization not supported. | |
702 * | |
703 * This separate definition is necessary because in C++, UINTPTR_MAX isn't | |
704 * reliably available. */ | |
705 typedef struct { | |
706 uint64_t val; | |
707 } upb_tabval; | |
708 | |
709 #else | |
710 | |
711 /* C -- supports static initialization, but to support static initialization of | |
712 * both integers and points for both 32 and 64 bit targets, it takes a little | |
713 * bit of doing. */ | |
714 | |
715 #if UINTPTR_MAX == 0xffffffffffffffffULL | |
716 #define UPB_PTR_IS_64BITS | |
717 #elif UINTPTR_MAX != 0xffffffff | |
718 #error Could not determine how many bits pointers are. | |
719 #endif | |
720 | |
721 typedef union { | |
722 /* For static initialization. | |
723 * | |
724 * Unfortunately this ugliness is necessary -- it is the only way that we can, | |
725 * with -std=c89 -pedantic, statically initialize this to either a pointer or | |
726 * an integer on 32-bit platforms. */ | |
727 struct { | |
728 #ifdef UPB_PTR_IS_64BITS | |
729 uintptr_t val; | |
730 #else | |
731 uintptr_t val1; | |
732 uintptr_t val2; | |
733 #endif | |
734 } staticinit; | |
735 | |
736 /* The normal accessor that we use for everything at runtime. */ | |
737 uint64_t val; | |
738 } upb_tabval; | |
739 | |
740 #ifdef UPB_PTR_IS_64BITS | |
741 #define UPB_TABVALUE_INT_INIT(v) {{v}} | |
742 #define UPB_TABVALUE_EMPTY_INIT {{-1}} | |
743 #else | |
744 | |
745 /* 32-bit pointers */ | |
746 | |
747 #ifdef UPB_BIG_ENDIAN | |
748 #define UPB_TABVALUE_INT_INIT(v) {{0, v}} | |
749 #define UPB_TABVALUE_EMPTY_INIT {{-1, -1}} | |
750 #else | |
751 #define UPB_TABVALUE_INT_INIT(v) {{v, 0}} | |
752 #define UPB_TABVALUE_EMPTY_INIT {{-1, -1}} | |
753 #endif | |
754 | |
755 #endif | |
756 | |
757 #define UPB_TABVALUE_PTR_INIT(v) UPB_TABVALUE_INT_INIT((uintptr_t)v) | |
758 | |
759 #undef UPB_PTR_IS_64BITS | |
760 | |
761 #endif /* __cplusplus */ | |
762 | |
763 | |
764 /* upb_table ******************************************************************/ | |
765 | |
766 typedef struct _upb_tabent { | |
767 upb_tabkey key; | |
768 upb_tabval val; | |
769 | |
770 /* Internal chaining. This is const so we can create static initializers for | |
771 * tables. We cast away const sometimes, but *only* when the containing | |
772 * upb_table is known to be non-const. This requires a bit of care, but | |
773 * the subtlety is confined to table.c. */ | |
774 const struct _upb_tabent *next; | |
775 } upb_tabent; | |
776 | |
777 typedef struct { | |
778 size_t count; /* Number of entries in the hash part. */ | |
779 size_t mask; /* Mask to turn hash value -> bucket. */ | |
780 upb_ctype_t ctype; /* Type of all values. */ | |
781 uint8_t size_lg2; /* Size of the hashtable part is 2^size_lg2 entries. */ | |
782 | |
783 /* Hash table entries. | |
784 * Making this const isn't entirely accurate; what we really want is for it to | |
785 * have the same const-ness as the table it's inside. But there's no way to | |
786 * declare that in C. So we have to make it const so that we can statically | |
787 * initialize const hash tables. Then we cast away const when we have to. | |
788 */ | |
789 const upb_tabent *entries; | |
790 } upb_table; | |
791 | |
792 typedef struct { | |
793 upb_table t; | |
794 } upb_strtable; | |
795 | |
796 #define UPB_STRTABLE_INIT(count, mask, ctype, size_lg2, entries) \ | |
797 {{count, mask, ctype, size_lg2, entries}} | |
798 | |
799 #define UPB_EMPTY_STRTABLE_INIT(ctype) \ | |
800 UPB_STRTABLE_INIT(0, 0, ctype, 0, NULL) | |
801 | |
802 typedef struct { | |
803 upb_table t; /* For entries that don't fit in the array part. */ | |
804 const upb_tabval *array; /* Array part of the table. See const note above. */ | |
805 size_t array_size; /* Array part size. */ | |
806 size_t array_count; /* Array part number of elements. */ | |
807 } upb_inttable; | |
808 | |
809 #define UPB_INTTABLE_INIT(count, mask, ctype, size_lg2, ent, a, asize, acount) \ | |
810 {{count, mask, ctype, size_lg2, ent}, a, asize, acount} | |
811 | |
812 #define UPB_EMPTY_INTTABLE_INIT(ctype) \ | |
813 UPB_INTTABLE_INIT(0, 0, ctype, 0, NULL, NULL, 0, 0) | |
814 | |
815 #define UPB_ARRAY_EMPTYENT -1 | |
816 | |
817 UPB_INLINE size_t upb_table_size(const upb_table *t) { | |
818 if (t->size_lg2 == 0) | |
819 return 0; | |
820 else | |
821 return 1 << t->size_lg2; | |
822 } | |
823 | |
824 /* Internal-only functions, in .h file only out of necessity. */ | |
825 UPB_INLINE bool upb_tabent_isempty(const upb_tabent *e) { | |
826 return e->key == 0; | |
827 } | |
828 | |
829 /* Used by some of the unit tests for generic hashing functionality. */ | |
830 uint32_t MurmurHash2(const void * key, size_t len, uint32_t seed); | |
831 | |
832 UPB_INLINE uintptr_t upb_intkey(uintptr_t key) { | |
833 return key; | |
834 } | |
835 | |
836 UPB_INLINE uint32_t upb_inthash(uintptr_t key) { | |
837 return (uint32_t)key; | |
838 } | |
839 | |
840 static const upb_tabent *upb_getentry(const upb_table *t, uint32_t hash) { | |
841 return t->entries + (hash & t->mask); | |
842 } | |
843 | |
844 UPB_INLINE bool upb_arrhas(upb_tabval key) { | |
845 return key.val != (uint64_t)-1; | |
846 } | |
847 | |
848 /* Initialize and uninitialize a table, respectively. If memory allocation | |
849 * failed, false is returned that the table is uninitialized. */ | |
850 bool upb_inttable_init(upb_inttable *table, upb_ctype_t ctype); | |
851 bool upb_strtable_init(upb_strtable *table, upb_ctype_t ctype); | |
852 void upb_inttable_uninit(upb_inttable *table); | |
853 void upb_strtable_uninit(upb_strtable *table); | |
854 | |
855 /* Returns the number of values in the table. */ | |
856 size_t upb_inttable_count(const upb_inttable *t); | |
857 UPB_INLINE size_t upb_strtable_count(const upb_strtable *t) { | |
858 return t->t.count; | |
859 } | |
860 | |
861 /* Inserts the given key into the hashtable with the given value. The key must | |
862 * not already exist in the hash table. For string tables, the key must be | |
863 * NULL-terminated, and the table will make an internal copy of the key. | |
864 * Inttables must not insert a value of UINTPTR_MAX. | |
865 * | |
866 * If a table resize was required but memory allocation failed, false is | |
867 * returned and the table is unchanged. */ | |
868 bool upb_inttable_insert(upb_inttable *t, uintptr_t key, upb_value val); | |
869 bool upb_strtable_insert2(upb_strtable *t, const char *key, size_t len, | |
870 upb_value val); | |
871 | |
872 /* For NULL-terminated strings. */ | |
873 UPB_INLINE bool upb_strtable_insert(upb_strtable *t, const char *key, | |
874 upb_value val) { | |
875 return upb_strtable_insert2(t, key, strlen(key), val); | |
876 } | |
877 | |
878 /* Looks up key in this table, returning "true" if the key was found. | |
879 * If v is non-NULL, copies the value for this key into *v. */ | |
880 bool upb_inttable_lookup(const upb_inttable *t, uintptr_t key, upb_value *v); | |
881 bool upb_strtable_lookup2(const upb_strtable *t, const char *key, size_t len, | |
882 upb_value *v); | |
883 | |
884 /* For NULL-terminated strings. */ | |
885 UPB_INLINE bool upb_strtable_lookup(const upb_strtable *t, const char *key, | |
886 upb_value *v) { | |
887 return upb_strtable_lookup2(t, key, strlen(key), v); | |
888 } | |
889 | |
890 /* Removes an item from the table. Returns true if the remove was successful, | |
891 * and stores the removed item in *val if non-NULL. */ | |
892 bool upb_inttable_remove(upb_inttable *t, uintptr_t key, upb_value *val); | |
893 bool upb_strtable_remove2(upb_strtable *t, const char *key, size_t len, | |
894 upb_value *val); | |
895 | |
896 /* For NULL-terminated strings. */ | |
897 UPB_INLINE bool upb_strtable_remove(upb_strtable *t, const char *key, | |
898 upb_value *v) { | |
899 return upb_strtable_remove2(t, key, strlen(key), v); | |
900 } | |
901 | |
902 /* Updates an existing entry in an inttable. If the entry does not exist, | |
903 * returns false and does nothing. Unlike insert/remove, this does not | |
904 * invalidate iterators. */ | |
905 bool upb_inttable_replace(upb_inttable *t, uintptr_t key, upb_value val); | |
906 | |
907 /* Handy routines for treating an inttable like a stack. May not be mixed with | |
908 * other insert/remove calls. */ | |
909 bool upb_inttable_push(upb_inttable *t, upb_value val); | |
910 upb_value upb_inttable_pop(upb_inttable *t); | |
911 | |
912 /* Convenience routines for inttables with pointer keys. */ | |
913 bool upb_inttable_insertptr(upb_inttable *t, const void *key, upb_value val); | |
914 bool upb_inttable_removeptr(upb_inttable *t, const void *key, upb_value *val); | |
915 bool upb_inttable_lookupptr( | |
916 const upb_inttable *t, const void *key, upb_value *val); | |
917 | |
918 /* Optimizes the table for the current set of entries, for both memory use and | |
919 * lookup time. Client should call this after all entries have been inserted; | |
920 * inserting more entries is legal, but will likely require a table resize. */ | |
921 void upb_inttable_compact(upb_inttable *t); | |
922 | |
923 /* A special-case inlinable version of the lookup routine for 32-bit | |
924 * integers. */ | |
925 UPB_INLINE bool upb_inttable_lookup32(const upb_inttable *t, uint32_t key, | |
926 upb_value *v) { | |
927 *v = upb_value_int32(0); /* Silence compiler warnings. */ | |
928 if (key < t->array_size) { | |
929 upb_tabval arrval = t->array[key]; | |
930 if (upb_arrhas(arrval)) { | |
931 _upb_value_setval(v, arrval.val, t->t.ctype); | |
932 return true; | |
933 } else { | |
934 return false; | |
935 } | |
936 } else { | |
937 const upb_tabent *e; | |
938 if (t->t.entries == NULL) return false; | |
939 for (e = upb_getentry(&t->t, upb_inthash(key)); true; e = e->next) { | |
940 if ((uint32_t)e->key == key) { | |
941 _upb_value_setval(v, e->val.val, t->t.ctype); | |
942 return true; | |
943 } | |
944 if (e->next == NULL) return false; | |
945 } | |
946 } | |
947 } | |
948 | |
949 /* Exposed for testing only. */ | |
950 bool upb_strtable_resize(upb_strtable *t, size_t size_lg2); | |
951 | |
952 /* Iterators ******************************************************************/ | |
953 | |
954 /* Iterators for int and string tables. We are subject to some kind of unusual | |
955 * design constraints: | |
956 * | |
957 * For high-level languages: | |
958 * - we must be able to guarantee that we don't crash or corrupt memory even if | |
959 * the program accesses an invalidated iterator. | |
960 * | |
961 * For C++11 range-based for: | |
962 * - iterators must be copyable | |
963 * - iterators must be comparable | |
964 * - it must be possible to construct an "end" value. | |
965 * | |
966 * Iteration order is undefined. | |
967 * | |
968 * Modifying the table invalidates iterators. upb_{str,int}table_done() is | |
969 * guaranteed to work even on an invalidated iterator, as long as the table it | |
970 * is iterating over has not been freed. Calling next() or accessing data from | |
971 * an invalidated iterator yields unspecified elements from the table, but it is | |
972 * guaranteed not to crash and to return real table elements (except when done() | |
973 * is true). */ | |
974 | |
975 | |
976 /* upb_strtable_iter **********************************************************/ | |
977 | |
978 /* upb_strtable_iter i; | |
979 * upb_strtable_begin(&i, t); | |
980 * for(; !upb_strtable_done(&i); upb_strtable_next(&i)) { | |
981 * const char *key = upb_strtable_iter_key(&i); | |
982 * const upb_value val = upb_strtable_iter_value(&i); | |
983 * // ... | |
984 * } | |
985 */ | |
986 | |
987 typedef struct { | |
988 const upb_strtable *t; | |
989 size_t index; | |
990 } upb_strtable_iter; | |
991 | |
992 void upb_strtable_begin(upb_strtable_iter *i, const upb_strtable *t); | |
993 void upb_strtable_next(upb_strtable_iter *i); | |
994 bool upb_strtable_done(const upb_strtable_iter *i); | |
995 const char *upb_strtable_iter_key(upb_strtable_iter *i); | |
996 size_t upb_strtable_iter_keylength(upb_strtable_iter *i); | |
997 upb_value upb_strtable_iter_value(const upb_strtable_iter *i); | |
998 void upb_strtable_iter_setdone(upb_strtable_iter *i); | |
999 bool upb_strtable_iter_isequal(const upb_strtable_iter *i1, | |
1000 const upb_strtable_iter *i2); | |
1001 | |
1002 | |
1003 /* upb_inttable_iter **********************************************************/ | |
1004 | |
1005 /* upb_inttable_iter i; | |
1006 * upb_inttable_begin(&i, t); | |
1007 * for(; !upb_inttable_done(&i); upb_inttable_next(&i)) { | |
1008 * uintptr_t key = upb_inttable_iter_key(&i); | |
1009 * upb_value val = upb_inttable_iter_value(&i); | |
1010 * // ... | |
1011 * } | |
1012 */ | |
1013 | |
1014 typedef struct { | |
1015 const upb_inttable *t; | |
1016 size_t index; | |
1017 bool array_part; | |
1018 } upb_inttable_iter; | |
1019 | |
1020 void upb_inttable_begin(upb_inttable_iter *i, const upb_inttable *t); | |
1021 void upb_inttable_next(upb_inttable_iter *i); | |
1022 bool upb_inttable_done(const upb_inttable_iter *i); | |
1023 uintptr_t upb_inttable_iter_key(const upb_inttable_iter *i); | |
1024 upb_value upb_inttable_iter_value(const upb_inttable_iter *i); | |
1025 void upb_inttable_iter_setdone(upb_inttable_iter *i); | |
1026 bool upb_inttable_iter_isequal(const upb_inttable_iter *i1, | |
1027 const upb_inttable_iter *i2); | |
1028 | |
1029 | |
1030 #ifdef __cplusplus | |
1031 } /* extern "C" */ | |
1032 #endif | |
1033 | |
1034 #endif /* UPB_TABLE_H_ */ | |
1035 | |
1036 /* Reference tracking will check ref()/unref() operations to make sure the | |
1037 * ref ownership is correct. Where possible it will also make tools like | |
1038 * Valgrind attribute ref leaks to the code that took the leaked ref, not | |
1039 * the code that originally created the object. | |
1040 * | |
1041 * Enabling this requires the application to define upb_lock()/upb_unlock() | |
1042 * functions that acquire/release a global mutex (or #define UPB_THREAD_UNSAFE). | |
1043 * For this reason we don't enable it by default, even in debug builds. | |
1044 */ | |
1045 | |
1046 /* #define UPB_DEBUG_REFS */ | |
1047 | |
1048 #ifdef __cplusplus | |
1049 namespace upb { class RefCounted; } | |
1050 #endif | |
1051 | |
1052 UPB_DECLARE_TYPE(upb::RefCounted, upb_refcounted) | |
1053 | |
1054 struct upb_refcounted_vtbl; | |
1055 | |
1056 #ifdef __cplusplus | |
1057 | |
1058 class upb::RefCounted { | |
1059 public: | |
1060 /* Returns true if the given object is frozen. */ | |
1061 bool IsFrozen() const; | |
1062 | |
1063 /* Increases the ref count, the new ref is owned by "owner" which must not | |
1064 * already own a ref (and should not itself be a refcounted object if the ref | |
1065 * could possibly be circular; see below). | |
1066 * Thread-safe iff "this" is frozen. */ | |
1067 void Ref(const void *owner) const; | |
1068 | |
1069 /* Release a ref that was acquired from upb_refcounted_ref() and collects any | |
1070 * objects it can. */ | |
1071 void Unref(const void *owner) const; | |
1072 | |
1073 /* Moves an existing ref from "from" to "to", without changing the overall | |
1074 * ref count. DonateRef(foo, NULL, owner) is the same as Ref(foo, owner), | |
1075 * but "to" may not be NULL. */ | |
1076 void DonateRef(const void *from, const void *to) const; | |
1077 | |
1078 /* Verifies that a ref to the given object is currently held by the given | |
1079 * owner. Only effective in UPB_DEBUG_REFS builds. */ | |
1080 void CheckRef(const void *owner) const; | |
1081 | |
1082 private: | |
1083 UPB_DISALLOW_POD_OPS(RefCounted, upb::RefCounted) | |
1084 #else | |
1085 struct upb_refcounted { | |
1086 #endif | |
1087 /* TODO(haberman): move the actual structure definition to structdefs.int.h. | |
1088 * The only reason they are here is because inline functions need to see the | |
1089 * definition of upb_handlers, which needs to see this definition. But we | |
1090 * can change the upb_handlers inline functions to deal in raw offsets | |
1091 * instead. | |
1092 */ | |
1093 | |
1094 /* A single reference count shared by all objects in the group. */ | |
1095 uint32_t *group; | |
1096 | |
1097 /* A singly-linked list of all objects in the group. */ | |
1098 upb_refcounted *next; | |
1099 | |
1100 /* Table of function pointers for this type. */ | |
1101 const struct upb_refcounted_vtbl *vtbl; | |
1102 | |
1103 /* Maintained only when mutable, this tracks the number of refs (but not | |
1104 * ref2's) to this object. *group should be the sum of all individual_count | |
1105 * in the group. */ | |
1106 uint32_t individual_count; | |
1107 | |
1108 bool is_frozen; | |
1109 | |
1110 #ifdef UPB_DEBUG_REFS | |
1111 upb_inttable *refs; /* Maps owner -> trackedref for incoming refs. */ | |
1112 upb_inttable *ref2s; /* Set of targets for outgoing ref2s. */ | |
1113 #endif | |
1114 }; | |
1115 | |
1116 #ifdef UPB_DEBUG_REFS | |
1117 #define UPB_REFCOUNT_INIT(refs, ref2s) \ | |
1118 {&static_refcount, NULL, NULL, 0, true, refs, ref2s} | |
1119 #else | |
1120 #define UPB_REFCOUNT_INIT(refs, ref2s) {&static_refcount, NULL, NULL, 0, true} | |
1121 #endif | |
1122 | |
1123 UPB_BEGIN_EXTERN_C | |
1124 | |
1125 /* It is better to use tracked refs when possible, for the extra debugging | |
1126 * capability. But if this is not possible (because you don't have easy access | |
1127 * to a stable pointer value that is associated with the ref), you can pass | |
1128 * UPB_UNTRACKED_REF instead. */ | |
1129 extern const void *UPB_UNTRACKED_REF; | |
1130 | |
1131 /* Native C API. */ | |
1132 bool upb_refcounted_isfrozen(const upb_refcounted *r); | |
1133 void upb_refcounted_ref(const upb_refcounted *r, const void *owner); | |
1134 void upb_refcounted_unref(const upb_refcounted *r, const void *owner); | |
1135 void upb_refcounted_donateref( | |
1136 const upb_refcounted *r, const void *from, const void *to); | |
1137 void upb_refcounted_checkref(const upb_refcounted *r, const void *owner); | |
1138 | |
1139 #define UPB_REFCOUNTED_CMETHODS(type, upcastfunc) \ | |
1140 UPB_INLINE bool type ## _isfrozen(const type *v) { \ | |
1141 return upb_refcounted_isfrozen(upcastfunc(v)); \ | |
1142 } \ | |
1143 UPB_INLINE void type ## _ref(const type *v, const void *owner) { \ | |
1144 upb_refcounted_ref(upcastfunc(v), owner); \ | |
1145 } \ | |
1146 UPB_INLINE void type ## _unref(const type *v, const void *owner) { \ | |
1147 upb_refcounted_unref(upcastfunc(v), owner); \ | |
1148 } \ | |
1149 UPB_INLINE void type ## _donateref(const type *v, const void *from, const void
*to) { \ | |
1150 upb_refcounted_donateref(upcastfunc(v), from, to); \ | |
1151 } \ | |
1152 UPB_INLINE void type ## _checkref(const type *v, const void *owner) { \ | |
1153 upb_refcounted_checkref(upcastfunc(v), owner); \ | |
1154 } | |
1155 | |
1156 #define UPB_REFCOUNTED_CPPMETHODS \ | |
1157 bool IsFrozen() const { \ | |
1158 return upb::upcast_to<const upb::RefCounted>(this)->IsFrozen(); \ | |
1159 } \ | |
1160 void Ref(const void *owner) const { \ | |
1161 return upb::upcast_to<const upb::RefCounted>(this)->Ref(owner); \ | |
1162 } \ | |
1163 void Unref(const void *owner) const { \ | |
1164 return upb::upcast_to<const upb::RefCounted>(this)->Unref(owner); \ | |
1165 } \ | |
1166 void DonateRef(const void *from, const void *to) const { \ | |
1167 return upb::upcast_to<const upb::RefCounted>(this)->DonateRef(from, to); \ | |
1168 } \ | |
1169 void CheckRef(const void *owner) const { \ | |
1170 return upb::upcast_to<const upb::RefCounted>(this)->CheckRef(owner); \ | |
1171 } | |
1172 | |
1173 /* Internal-to-upb Interface **************************************************/ | |
1174 | |
1175 typedef void upb_refcounted_visit(const upb_refcounted *r, | |
1176 const upb_refcounted *subobj, | |
1177 void *closure); | |
1178 | |
1179 struct upb_refcounted_vtbl { | |
1180 /* Must visit all subobjects that are currently ref'd via upb_refcounted_ref2. | |
1181 * Must be longjmp()-safe. */ | |
1182 void (*visit)(const upb_refcounted *r, upb_refcounted_visit *visit, void *c); | |
1183 | |
1184 /* Must free the object and release all references to other objects. */ | |
1185 void (*free)(upb_refcounted *r); | |
1186 }; | |
1187 | |
1188 /* Initializes the refcounted with a single ref for the given owner. Returns | |
1189 * false if memory could not be allocated. */ | |
1190 bool upb_refcounted_init(upb_refcounted *r, | |
1191 const struct upb_refcounted_vtbl *vtbl, | |
1192 const void *owner); | |
1193 | |
1194 /* Adds a ref from one refcounted object to another ("from" must not already | |
1195 * own a ref). These refs may be circular; cycles will be collected correctly | |
1196 * (if conservatively). These refs do not need to be freed in from's free() | |
1197 * function. */ | |
1198 void upb_refcounted_ref2(const upb_refcounted *r, upb_refcounted *from); | |
1199 | |
1200 /* Removes a ref that was acquired from upb_refcounted_ref2(), and collects any | |
1201 * object it can. This is only necessary when "from" no longer points to "r", | |
1202 * and not from from's "free" function. */ | |
1203 void upb_refcounted_unref2(const upb_refcounted *r, upb_refcounted *from); | |
1204 | |
1205 #define upb_ref2(r, from) \ | |
1206 upb_refcounted_ref2((const upb_refcounted*)r, (upb_refcounted*)from) | |
1207 #define upb_unref2(r, from) \ | |
1208 upb_refcounted_unref2((const upb_refcounted*)r, (upb_refcounted*)from) | |
1209 | |
1210 /* Freezes all mutable object reachable by ref2() refs from the given roots. | |
1211 * This will split refcounting groups into precise SCC groups, so that | |
1212 * refcounting of frozen objects can be more aggressive. If memory allocation | |
1213 * fails, or if more than 2**31 mutable objects are reachable from "roots", or | |
1214 * if the maximum depth of the graph exceeds "maxdepth", false is returned and | |
1215 * the objects are unchanged. | |
1216 * | |
1217 * After this operation succeeds, the objects are frozen/const, and may not be | |
1218 * used through non-const pointers. In particular, they may not be passed as | |
1219 * the second parameter of upb_refcounted_{ref,unref}2(). On the upside, all | |
1220 * operations on frozen refcounteds are threadsafe, and objects will be freed | |
1221 * at the precise moment that they become unreachable. | |
1222 * | |
1223 * Caller must own refs on each object in the "roots" list. */ | |
1224 bool upb_refcounted_freeze(upb_refcounted *const*roots, int n, upb_status *s, | |
1225 int maxdepth); | |
1226 | |
1227 /* Shared by all compiled-in refcounted objects. */ | |
1228 extern uint32_t static_refcount; | |
1229 | |
1230 UPB_END_EXTERN_C | |
1231 | |
1232 #ifdef __cplusplus | |
1233 /* C++ Wrappers. */ | |
1234 namespace upb { | |
1235 inline bool RefCounted::IsFrozen() const { | |
1236 return upb_refcounted_isfrozen(this); | |
1237 } | |
1238 inline void RefCounted::Ref(const void *owner) const { | |
1239 upb_refcounted_ref(this, owner); | |
1240 } | |
1241 inline void RefCounted::Unref(const void *owner) const { | |
1242 upb_refcounted_unref(this, owner); | |
1243 } | |
1244 inline void RefCounted::DonateRef(const void *from, const void *to) const { | |
1245 upb_refcounted_donateref(this, from, to); | |
1246 } | |
1247 inline void RefCounted::CheckRef(const void *owner) const { | |
1248 upb_refcounted_checkref(this, owner); | |
1249 } | |
1250 } /* namespace upb */ | |
1251 #endif | |
1252 | |
1253 #endif /* UPB_REFCOUNT_H_ */ | |
1254 | |
1255 #ifdef __cplusplus | |
1256 #include <cstring> | |
1257 #include <string> | |
1258 #include <vector> | |
1259 | |
1260 namespace upb { | |
1261 class Def; | |
1262 class EnumDef; | |
1263 class FieldDef; | |
1264 class MessageDef; | |
1265 class OneofDef; | |
1266 } | |
1267 #endif | |
1268 | |
1269 UPB_DECLARE_DERIVED_TYPE(upb::Def, upb::RefCounted, upb_def, upb_refcounted) | |
1270 | |
1271 /* The maximum message depth that the type graph can have. This is a resource | |
1272 * limit for the C stack since we sometimes need to recursively traverse the | |
1273 * graph. Cycles are ok; the traversal will stop when it detects a cycle, but | |
1274 * we must hit the cycle before the maximum depth is reached. | |
1275 * | |
1276 * If having a single static limit is too inflexible, we can add another variant | |
1277 * of Def::Freeze that allows specifying this as a parameter. */ | |
1278 #define UPB_MAX_MESSAGE_DEPTH 64 | |
1279 | |
1280 | |
1281 /* upb::Def: base class for defs *********************************************/ | |
1282 | |
1283 /* All the different kind of defs we support. These correspond 1:1 with | |
1284 * declarations in a .proto file. */ | |
1285 typedef enum { | |
1286 UPB_DEF_MSG, | |
1287 UPB_DEF_FIELD, | |
1288 UPB_DEF_ENUM, | |
1289 UPB_DEF_ONEOF, | |
1290 UPB_DEF_SERVICE, /* Not yet implemented. */ | |
1291 UPB_DEF_ANY = -1 /* Wildcard for upb_symtab_get*() */ | |
1292 } upb_deftype_t; | |
1293 | |
1294 #ifdef __cplusplus | |
1295 | |
1296 /* The base class of all defs. Its base is upb::RefCounted (use upb::upcast() | |
1297 * to convert). */ | |
1298 class upb::Def { | |
1299 public: | |
1300 typedef upb_deftype_t Type; | |
1301 | |
1302 Def* Dup(const void *owner) const; | |
1303 | |
1304 /* upb::RefCounted methods like Ref()/Unref(). */ | |
1305 UPB_REFCOUNTED_CPPMETHODS | |
1306 | |
1307 Type def_type() const; | |
1308 | |
1309 /* "fullname" is the def's fully-qualified name (eg. foo.bar.Message). */ | |
1310 const char *full_name() const; | |
1311 | |
1312 /* The def must be mutable. Caller retains ownership of fullname. Defs are | |
1313 * not required to have a name; if a def has no name when it is frozen, it | |
1314 * will remain an anonymous def. On failure, returns false and details in "s" | |
1315 * if non-NULL. */ | |
1316 bool set_full_name(const char* fullname, upb::Status* s); | |
1317 bool set_full_name(const std::string &fullname, upb::Status* s); | |
1318 | |
1319 /* Freezes the given defs; this validates all constraints and marks the defs | |
1320 * as frozen (read-only). "defs" may not contain any fielddefs, but fields | |
1321 * of any msgdefs will be frozen. | |
1322 * | |
1323 * Symbolic references to sub-types and enum defaults must have already been | |
1324 * resolved. Any mutable defs reachable from any of "defs" must also be in | |
1325 * the list; more formally, "defs" must be a transitive closure of mutable | |
1326 * defs. | |
1327 * | |
1328 * After this operation succeeds, the finalized defs must only be accessed | |
1329 * through a const pointer! */ | |
1330 static bool Freeze(Def* const* defs, int n, Status* status); | |
1331 static bool Freeze(const std::vector<Def*>& defs, Status* status); | |
1332 | |
1333 private: | |
1334 UPB_DISALLOW_POD_OPS(Def, upb::Def) | |
1335 }; | |
1336 | |
1337 #endif /* __cplusplus */ | |
1338 | |
1339 UPB_BEGIN_EXTERN_C | |
1340 | |
1341 /* Native C API. */ | |
1342 upb_def *upb_def_dup(const upb_def *def, const void *owner); | |
1343 | |
1344 /* Include upb_refcounted methods like upb_def_ref()/upb_def_unref(). */ | |
1345 UPB_REFCOUNTED_CMETHODS(upb_def, upb_def_upcast) | |
1346 | |
1347 upb_deftype_t upb_def_type(const upb_def *d); | |
1348 const char *upb_def_fullname(const upb_def *d); | |
1349 bool upb_def_setfullname(upb_def *def, const char *fullname, upb_status *s); | |
1350 bool upb_def_freeze(upb_def *const *defs, int n, upb_status *s); | |
1351 | |
1352 UPB_END_EXTERN_C | |
1353 | |
1354 | |
1355 /* upb::Def casts *************************************************************/ | |
1356 | |
1357 #ifdef __cplusplus | |
1358 #define UPB_CPP_CASTS(cname, cpptype) \ | |
1359 namespace upb { \ | |
1360 template <> \ | |
1361 inline cpptype *down_cast<cpptype *, Def>(Def * def) { \ | |
1362 return upb_downcast_##cname##_mutable(def); \ | |
1363 } \ | |
1364 template <> \ | |
1365 inline cpptype *dyn_cast<cpptype *, Def>(Def * def) { \ | |
1366 return upb_dyncast_##cname##_mutable(def); \ | |
1367 } \ | |
1368 template <> \ | |
1369 inline const cpptype *down_cast<const cpptype *, const Def>( \ | |
1370 const Def *def) { \ | |
1371 return upb_downcast_##cname(def); \ | |
1372 } \ | |
1373 template <> \ | |
1374 inline const cpptype *dyn_cast<const cpptype *, const Def>(const Def *def) { \ | |
1375 return upb_dyncast_##cname(def); \ | |
1376 } \ | |
1377 template <> \ | |
1378 inline const cpptype *down_cast<const cpptype *, Def>(Def * def) { \ | |
1379 return upb_downcast_##cname(def); \ | |
1380 } \ | |
1381 template <> \ | |
1382 inline const cpptype *dyn_cast<const cpptype *, Def>(Def * def) { \ | |
1383 return upb_dyncast_##cname(def); \ | |
1384 } \ | |
1385 } /* namespace upb */ | |
1386 #else | |
1387 #define UPB_CPP_CASTS(cname, cpptype) | |
1388 #endif /* __cplusplus */ | |
1389 | |
1390 /* Dynamic casts, for determining if a def is of a particular type at runtime. | |
1391 * Downcasts, for when some wants to assert that a def is of a particular type. | |
1392 * These are only checked if we are building debug. */ | |
1393 #define UPB_DEF_CASTS(lower, upper, cpptype) \ | |
1394 UPB_INLINE const upb_##lower *upb_dyncast_##lower(const upb_def *def) { \ | |
1395 if (upb_def_type(def) != UPB_DEF_##upper) return NULL; \ | |
1396 return (upb_##lower *)def; \ | |
1397 } \ | |
1398 UPB_INLINE const upb_##lower *upb_downcast_##lower(const upb_def *def) { \ | |
1399 assert(upb_def_type(def) == UPB_DEF_##upper); \ | |
1400 return (const upb_##lower *)def; \ | |
1401 } \ | |
1402 UPB_INLINE upb_##lower *upb_dyncast_##lower##_mutable(upb_def *def) { \ | |
1403 return (upb_##lower *)upb_dyncast_##lower(def); \ | |
1404 } \ | |
1405 UPB_INLINE upb_##lower *upb_downcast_##lower##_mutable(upb_def *def) { \ | |
1406 return (upb_##lower *)upb_downcast_##lower(def); \ | |
1407 } \ | |
1408 UPB_CPP_CASTS(lower, cpptype) | |
1409 | |
1410 #define UPB_DEFINE_DEF(cppname, lower, upper, cppmethods, members) \ | |
1411 UPB_DEFINE_CLASS2(cppname, upb::Def, upb::RefCounted, cppmethods, \ | |
1412 members) \ | |
1413 UPB_DEF_CASTS(lower, upper, cppname) | |
1414 | |
1415 #define UPB_DECLARE_DEF_TYPE(cppname, lower, upper) \ | |
1416 UPB_DECLARE_DERIVED_TYPE2(cppname, upb::Def, upb::RefCounted, \ | |
1417 upb_ ## lower, upb_def, upb_refcounted) \ | |
1418 UPB_DEF_CASTS(lower, upper, cppname) | |
1419 | |
1420 UPB_DECLARE_DEF_TYPE(upb::FieldDef, fielddef, FIELD) | |
1421 UPB_DECLARE_DEF_TYPE(upb::MessageDef, msgdef, MSG) | |
1422 UPB_DECLARE_DEF_TYPE(upb::EnumDef, enumdef, ENUM) | |
1423 UPB_DECLARE_DEF_TYPE(upb::OneofDef, oneofdef, ONEOF) | |
1424 | |
1425 #undef UPB_DECLARE_DEF_TYPE | |
1426 #undef UPB_DEF_CASTS | |
1427 #undef UPB_CPP_CASTS | |
1428 | |
1429 | |
1430 /* upb::FieldDef **************************************************************/ | |
1431 | |
1432 /* The types a field can have. Note that this list is not identical to the | |
1433 * types defined in descriptor.proto, which gives INT32 and SINT32 separate | |
1434 * types (we distinguish the two with the "integer encoding" enum below). */ | |
1435 typedef enum { | |
1436 UPB_TYPE_FLOAT = 1, | |
1437 UPB_TYPE_DOUBLE = 2, | |
1438 UPB_TYPE_BOOL = 3, | |
1439 UPB_TYPE_STRING = 4, | |
1440 UPB_TYPE_BYTES = 5, | |
1441 UPB_TYPE_MESSAGE = 6, | |
1442 UPB_TYPE_ENUM = 7, /* Enum values are int32. */ | |
1443 UPB_TYPE_INT32 = 8, | |
1444 UPB_TYPE_UINT32 = 9, | |
1445 UPB_TYPE_INT64 = 10, | |
1446 UPB_TYPE_UINT64 = 11 | |
1447 } upb_fieldtype_t; | |
1448 | |
1449 /* The repeated-ness of each field; this matches descriptor.proto. */ | |
1450 typedef enum { | |
1451 UPB_LABEL_OPTIONAL = 1, | |
1452 UPB_LABEL_REQUIRED = 2, | |
1453 UPB_LABEL_REPEATED = 3 | |
1454 } upb_label_t; | |
1455 | |
1456 /* How integers should be encoded in serializations that offer multiple | |
1457 * integer encoding methods. */ | |
1458 typedef enum { | |
1459 UPB_INTFMT_VARIABLE = 1, | |
1460 UPB_INTFMT_FIXED = 2, | |
1461 UPB_INTFMT_ZIGZAG = 3 /* Only for signed types (INT32/INT64). */ | |
1462 } upb_intfmt_t; | |
1463 | |
1464 /* Descriptor types, as defined in descriptor.proto. */ | |
1465 typedef enum { | |
1466 UPB_DESCRIPTOR_TYPE_DOUBLE = 1, | |
1467 UPB_DESCRIPTOR_TYPE_FLOAT = 2, | |
1468 UPB_DESCRIPTOR_TYPE_INT64 = 3, | |
1469 UPB_DESCRIPTOR_TYPE_UINT64 = 4, | |
1470 UPB_DESCRIPTOR_TYPE_INT32 = 5, | |
1471 UPB_DESCRIPTOR_TYPE_FIXED64 = 6, | |
1472 UPB_DESCRIPTOR_TYPE_FIXED32 = 7, | |
1473 UPB_DESCRIPTOR_TYPE_BOOL = 8, | |
1474 UPB_DESCRIPTOR_TYPE_STRING = 9, | |
1475 UPB_DESCRIPTOR_TYPE_GROUP = 10, | |
1476 UPB_DESCRIPTOR_TYPE_MESSAGE = 11, | |
1477 UPB_DESCRIPTOR_TYPE_BYTES = 12, | |
1478 UPB_DESCRIPTOR_TYPE_UINT32 = 13, | |
1479 UPB_DESCRIPTOR_TYPE_ENUM = 14, | |
1480 UPB_DESCRIPTOR_TYPE_SFIXED32 = 15, | |
1481 UPB_DESCRIPTOR_TYPE_SFIXED64 = 16, | |
1482 UPB_DESCRIPTOR_TYPE_SINT32 = 17, | |
1483 UPB_DESCRIPTOR_TYPE_SINT64 = 18 | |
1484 } upb_descriptortype_t; | |
1485 | |
1486 /* Maximum field number allowed for FieldDefs. This is an inherent limit of the | |
1487 * protobuf wire format. */ | |
1488 #define UPB_MAX_FIELDNUMBER ((1 << 29) - 1) | |
1489 | |
1490 #ifdef __cplusplus | |
1491 | |
1492 /* A upb_fielddef describes a single field in a message. It is most often | |
1493 * found as a part of a upb_msgdef, but can also stand alone to represent | |
1494 * an extension. | |
1495 * | |
1496 * Its base class is upb::Def (use upb::upcast() to convert). */ | |
1497 class upb::FieldDef { | |
1498 public: | |
1499 typedef upb_fieldtype_t Type; | |
1500 typedef upb_label_t Label; | |
1501 typedef upb_intfmt_t IntegerFormat; | |
1502 typedef upb_descriptortype_t DescriptorType; | |
1503 | |
1504 /* These return true if the given value is a valid member of the enumeration.
*/ | |
1505 static bool CheckType(int32_t val); | |
1506 static bool CheckLabel(int32_t val); | |
1507 static bool CheckDescriptorType(int32_t val); | |
1508 static bool CheckIntegerFormat(int32_t val); | |
1509 | |
1510 /* These convert to the given enumeration; they require that the value is | |
1511 * valid. */ | |
1512 static Type ConvertType(int32_t val); | |
1513 static Label ConvertLabel(int32_t val); | |
1514 static DescriptorType ConvertDescriptorType(int32_t val); | |
1515 static IntegerFormat ConvertIntegerFormat(int32_t val); | |
1516 | |
1517 /* Returns NULL if memory allocation failed. */ | |
1518 static reffed_ptr<FieldDef> New(); | |
1519 | |
1520 /* Duplicates the given field, returning NULL if memory allocation failed. | |
1521 * When a fielddef is duplicated, the subdef (if any) is made symbolic if it | |
1522 * wasn't already. If the subdef is set but has no name (which is possible | |
1523 * since msgdefs are not required to have a name) the new fielddef's subdef | |
1524 * will be unset. */ | |
1525 FieldDef* Dup(const void* owner) const; | |
1526 | |
1527 /* upb::RefCounted methods like Ref()/Unref(). */ | |
1528 UPB_REFCOUNTED_CPPMETHODS | |
1529 | |
1530 /* Functionality from upb::Def. */ | |
1531 const char* full_name() const; | |
1532 | |
1533 bool type_is_set() const; /* set_[descriptor_]type() has been called? */ | |
1534 Type type() const; /* Requires that type_is_set() == true. */ | |
1535 Label label() const; /* Defaults to UPB_LABEL_OPTIONAL. */ | |
1536 const char* name() const; /* NULL if uninitialized. */ | |
1537 uint32_t number() const; /* Returns 0 if uninitialized. */ | |
1538 bool is_extension() const; | |
1539 | |
1540 /* For UPB_TYPE_MESSAGE fields only where is_tag_delimited() == false, | |
1541 * indicates whether this field should have lazy parsing handlers that yield | |
1542 * the unparsed string for the submessage. | |
1543 * | |
1544 * TODO(haberman): I think we want to move this into a FieldOptions container | |
1545 * when we add support for custom options (the FieldOptions struct will | |
1546 * contain both regular FieldOptions like "lazy" *and* custom options). */ | |
1547 bool lazy() const; | |
1548 | |
1549 /* For non-string, non-submessage fields, this indicates whether binary | |
1550 * protobufs are encoded in packed or non-packed format. | |
1551 * | |
1552 * TODO(haberman): see note above about putting options like this into a | |
1553 * FieldOptions container. */ | |
1554 bool packed() const; | |
1555 | |
1556 /* An integer that can be used as an index into an array of fields for | |
1557 * whatever message this field belongs to. Guaranteed to be less than | |
1558 * f->containing_type()->field_count(). May only be accessed once the def has | |
1559 * been finalized. */ | |
1560 int index() const; | |
1561 | |
1562 /* The MessageDef to which this field belongs. | |
1563 * | |
1564 * If this field has been added to a MessageDef, that message can be retrieved | |
1565 * directly (this is always the case for frozen FieldDefs). | |
1566 * | |
1567 * If the field has not yet been added to a MessageDef, you can set the name | |
1568 * of the containing type symbolically instead. This is mostly useful for | |
1569 * extensions, where the extension is declared separately from the message. */ | |
1570 const MessageDef* containing_type() const; | |
1571 const char* containing_type_name(); | |
1572 | |
1573 /* The OneofDef to which this field belongs, or NULL if this field is not part | |
1574 * of a oneof. */ | |
1575 const OneofDef* containing_oneof() const; | |
1576 | |
1577 /* The field's type according to the enum in descriptor.proto. This is not | |
1578 * the same as UPB_TYPE_*, because it distinguishes between (for example) | |
1579 * INT32 and SINT32, whereas our "type" enum does not. This return of | |
1580 * descriptor_type() is a function of type(), integer_format(), and | |
1581 * is_tag_delimited(). Likewise set_descriptor_type() sets all three | |
1582 * appropriately. */ | |
1583 DescriptorType descriptor_type() const; | |
1584 | |
1585 /* Convenient field type tests. */ | |
1586 bool IsSubMessage() const; | |
1587 bool IsString() const; | |
1588 bool IsSequence() const; | |
1589 bool IsPrimitive() const; | |
1590 bool IsMap() const; | |
1591 | |
1592 /* How integers are encoded. Only meaningful for integer types. | |
1593 * Defaults to UPB_INTFMT_VARIABLE, and is reset when "type" changes. */ | |
1594 IntegerFormat integer_format() const; | |
1595 | |
1596 /* Whether a submessage field is tag-delimited or not (if false, then | |
1597 * length-delimited). May only be set when type() == UPB_TYPE_MESSAGE. */ | |
1598 bool is_tag_delimited() const; | |
1599 | |
1600 /* Returns the non-string default value for this fielddef, which may either | |
1601 * be something the client set explicitly or the "default default" (0 for | |
1602 * numbers, empty for strings). The field's type indicates the type of the | |
1603 * returned value, except for enum fields that are still mutable. | |
1604 * | |
1605 * Requires that the given function matches the field's current type. */ | |
1606 int64_t default_int64() const; | |
1607 int32_t default_int32() const; | |
1608 uint64_t default_uint64() const; | |
1609 uint32_t default_uint32() const; | |
1610 bool default_bool() const; | |
1611 float default_float() const; | |
1612 double default_double() const; | |
1613 | |
1614 /* The resulting string is always NULL-terminated. If non-NULL, the length | |
1615 * will be stored in *len. */ | |
1616 const char *default_string(size_t* len) const; | |
1617 | |
1618 /* For frozen UPB_TYPE_ENUM fields, enum defaults can always be read as either | |
1619 * string or int32, and both of these methods will always return true. | |
1620 * | |
1621 * For mutable UPB_TYPE_ENUM fields, the story is a bit more complicated. | |
1622 * Enum defaults are unusual. They can be specified either as string or int32, | |
1623 * but to be valid the enum must have that value as a member. And if no | |
1624 * default is specified, the "default default" comes from the EnumDef. | |
1625 * | |
1626 * We allow reading the default as either an int32 or a string, but only if | |
1627 * we have a meaningful value to report. We have a meaningful value if it was | |
1628 * set explicitly, or if we could get the "default default" from the EnumDef. | |
1629 * Also if you explicitly set the name and we find the number in the EnumDef *
/ | |
1630 bool EnumHasStringDefault() const; | |
1631 bool EnumHasInt32Default() const; | |
1632 | |
1633 /* Submessage and enum fields must reference a "subdef", which is the | |
1634 * upb::MessageDef or upb::EnumDef that defines their type. Note that when | |
1635 * the FieldDef is mutable it may not have a subdef *yet*, but this function | |
1636 * still returns true to indicate that the field's type requires a subdef. */ | |
1637 bool HasSubDef() const; | |
1638 | |
1639 /* Returns the enum or submessage def for this field, if any. The field's | |
1640 * type must match (ie. you may only call enum_subdef() for fields where | |
1641 * type() == UPB_TYPE_ENUM). Returns NULL if the subdef has not been set or | |
1642 * is currently set symbolically. */ | |
1643 const EnumDef* enum_subdef() const; | |
1644 const MessageDef* message_subdef() const; | |
1645 | |
1646 /* Returns the generic subdef for this field. Requires that HasSubDef() (ie. | |
1647 * only works for UPB_TYPE_ENUM and UPB_TYPE_MESSAGE fields). */ | |
1648 const Def* subdef() const; | |
1649 | |
1650 /* Returns the symbolic name of the subdef. If the subdef is currently set | |
1651 * unresolved (ie. set symbolically) returns the symbolic name. If it has | |
1652 * been resolved to a specific subdef, returns the name from that subdef. */ | |
1653 const char* subdef_name() const; | |
1654 | |
1655 /* Setters (non-const methods), only valid for mutable FieldDefs! ***********/ | |
1656 | |
1657 bool set_full_name(const char* fullname, upb::Status* s); | |
1658 bool set_full_name(const std::string& fullname, upb::Status* s); | |
1659 | |
1660 /* This may only be called if containing_type() == NULL (ie. the field has not | |
1661 * been added to a message yet). */ | |
1662 bool set_containing_type_name(const char *name, Status* status); | |
1663 bool set_containing_type_name(const std::string& name, Status* status); | |
1664 | |
1665 /* Defaults to false. When we freeze, we ensure that this can only be true | |
1666 * for length-delimited message fields. Prior to freezing this can be true or | |
1667 * false with no restrictions. */ | |
1668 void set_lazy(bool lazy); | |
1669 | |
1670 /* Defaults to true. Sets whether this field is encoded in packed format. */ | |
1671 void set_packed(bool packed); | |
1672 | |
1673 /* "type" or "descriptor_type" MUST be set explicitly before the fielddef is | |
1674 * finalized. These setters require that the enum value is valid; if the | |
1675 * value did not come directly from an enum constant, the caller should | |
1676 * validate it first with the functions above (CheckFieldType(), etc). */ | |
1677 void set_type(Type type); | |
1678 void set_label(Label label); | |
1679 void set_descriptor_type(DescriptorType type); | |
1680 void set_is_extension(bool is_extension); | |
1681 | |
1682 /* "number" and "name" must be set before the FieldDef is added to a | |
1683 * MessageDef, and may not be set after that. | |
1684 * | |
1685 * "name" is the same as full_name()/set_full_name(), but since fielddefs | |
1686 * most often use simple, non-qualified names, we provide this accessor | |
1687 * also. Generally only extensions will want to think of this name as | |
1688 * fully-qualified. */ | |
1689 bool set_number(uint32_t number, upb::Status* s); | |
1690 bool set_name(const char* name, upb::Status* s); | |
1691 bool set_name(const std::string& name, upb::Status* s); | |
1692 | |
1693 void set_integer_format(IntegerFormat format); | |
1694 bool set_tag_delimited(bool tag_delimited, upb::Status* s); | |
1695 | |
1696 /* Sets default value for the field. The call must exactly match the type | |
1697 * of the field. Enum fields may use either setint32 or setstring to set | |
1698 * the default numerically or symbolically, respectively, but symbolic | |
1699 * defaults must be resolved before finalizing (see ResolveEnumDefault()). | |
1700 * | |
1701 * Changing the type of a field will reset its default. */ | |
1702 void set_default_int64(int64_t val); | |
1703 void set_default_int32(int32_t val); | |
1704 void set_default_uint64(uint64_t val); | |
1705 void set_default_uint32(uint32_t val); | |
1706 void set_default_bool(bool val); | |
1707 void set_default_float(float val); | |
1708 void set_default_double(double val); | |
1709 bool set_default_string(const void *str, size_t len, Status *s); | |
1710 bool set_default_string(const std::string &str, Status *s); | |
1711 void set_default_cstr(const char *str, Status *s); | |
1712 | |
1713 /* Before a fielddef is frozen, its subdef may be set either directly (with a | |
1714 * upb::Def*) or symbolically. Symbolic refs must be resolved before the | |
1715 * containing msgdef can be frozen (see upb_resolve() above). upb always | |
1716 * guarantees that any def reachable from a live def will also be kept alive. | |
1717 * | |
1718 * Both methods require that upb_hassubdef(f) (so the type must be set prior | |
1719 * to calling these methods). Returns false if this is not the case, or if | |
1720 * the given subdef is not of the correct type. The subdef is reset if the | |
1721 * field's type is changed. The subdef can be set to NULL to clear it. */ | |
1722 bool set_subdef(const Def* subdef, Status* s); | |
1723 bool set_enum_subdef(const EnumDef* subdef, Status* s); | |
1724 bool set_message_subdef(const MessageDef* subdef, Status* s); | |
1725 bool set_subdef_name(const char* name, Status* s); | |
1726 bool set_subdef_name(const std::string &name, Status* s); | |
1727 | |
1728 private: | |
1729 UPB_DISALLOW_POD_OPS(FieldDef, upb::FieldDef) | |
1730 }; | |
1731 | |
1732 # endif /* defined(__cplusplus) */ | |
1733 | |
1734 UPB_BEGIN_EXTERN_C | |
1735 | |
1736 /* Native C API. */ | |
1737 upb_fielddef *upb_fielddef_new(const void *owner); | |
1738 upb_fielddef *upb_fielddef_dup(const upb_fielddef *f, const void *owner); | |
1739 | |
1740 /* Include upb_refcounted methods like upb_fielddef_ref(). */ | |
1741 UPB_REFCOUNTED_CMETHODS(upb_fielddef, upb_fielddef_upcast2) | |
1742 | |
1743 /* Methods from upb_def. */ | |
1744 const char *upb_fielddef_fullname(const upb_fielddef *f); | |
1745 bool upb_fielddef_setfullname(upb_fielddef *f, const char *fullname, | |
1746 upb_status *s); | |
1747 | |
1748 bool upb_fielddef_typeisset(const upb_fielddef *f); | |
1749 upb_fieldtype_t upb_fielddef_type(const upb_fielddef *f); | |
1750 upb_descriptortype_t upb_fielddef_descriptortype(const upb_fielddef *f); | |
1751 upb_label_t upb_fielddef_label(const upb_fielddef *f); | |
1752 uint32_t upb_fielddef_number(const upb_fielddef *f); | |
1753 const char *upb_fielddef_name(const upb_fielddef *f); | |
1754 bool upb_fielddef_isextension(const upb_fielddef *f); | |
1755 bool upb_fielddef_lazy(const upb_fielddef *f); | |
1756 bool upb_fielddef_packed(const upb_fielddef *f); | |
1757 const upb_msgdef *upb_fielddef_containingtype(const upb_fielddef *f); | |
1758 const upb_oneofdef *upb_fielddef_containingoneof(const upb_fielddef *f); | |
1759 upb_msgdef *upb_fielddef_containingtype_mutable(upb_fielddef *f); | |
1760 const char *upb_fielddef_containingtypename(upb_fielddef *f); | |
1761 upb_intfmt_t upb_fielddef_intfmt(const upb_fielddef *f); | |
1762 uint32_t upb_fielddef_index(const upb_fielddef *f); | |
1763 bool upb_fielddef_istagdelim(const upb_fielddef *f); | |
1764 bool upb_fielddef_issubmsg(const upb_fielddef *f); | |
1765 bool upb_fielddef_isstring(const upb_fielddef *f); | |
1766 bool upb_fielddef_isseq(const upb_fielddef *f); | |
1767 bool upb_fielddef_isprimitive(const upb_fielddef *f); | |
1768 bool upb_fielddef_ismap(const upb_fielddef *f); | |
1769 int64_t upb_fielddef_defaultint64(const upb_fielddef *f); | |
1770 int32_t upb_fielddef_defaultint32(const upb_fielddef *f); | |
1771 uint64_t upb_fielddef_defaultuint64(const upb_fielddef *f); | |
1772 uint32_t upb_fielddef_defaultuint32(const upb_fielddef *f); | |
1773 bool upb_fielddef_defaultbool(const upb_fielddef *f); | |
1774 float upb_fielddef_defaultfloat(const upb_fielddef *f); | |
1775 double upb_fielddef_defaultdouble(const upb_fielddef *f); | |
1776 const char *upb_fielddef_defaultstr(const upb_fielddef *f, size_t *len); | |
1777 bool upb_fielddef_enumhasdefaultint32(const upb_fielddef *f); | |
1778 bool upb_fielddef_enumhasdefaultstr(const upb_fielddef *f); | |
1779 bool upb_fielddef_hassubdef(const upb_fielddef *f); | |
1780 const upb_def *upb_fielddef_subdef(const upb_fielddef *f); | |
1781 const upb_msgdef *upb_fielddef_msgsubdef(const upb_fielddef *f); | |
1782 const upb_enumdef *upb_fielddef_enumsubdef(const upb_fielddef *f); | |
1783 const char *upb_fielddef_subdefname(const upb_fielddef *f); | |
1784 | |
1785 void upb_fielddef_settype(upb_fielddef *f, upb_fieldtype_t type); | |
1786 void upb_fielddef_setdescriptortype(upb_fielddef *f, int type); | |
1787 void upb_fielddef_setlabel(upb_fielddef *f, upb_label_t label); | |
1788 bool upb_fielddef_setnumber(upb_fielddef *f, uint32_t number, upb_status *s); | |
1789 bool upb_fielddef_setname(upb_fielddef *f, const char *name, upb_status *s); | |
1790 bool upb_fielddef_setcontainingtypename(upb_fielddef *f, const char *name, | |
1791 upb_status *s); | |
1792 void upb_fielddef_setisextension(upb_fielddef *f, bool is_extension); | |
1793 void upb_fielddef_setlazy(upb_fielddef *f, bool lazy); | |
1794 void upb_fielddef_setpacked(upb_fielddef *f, bool packed); | |
1795 void upb_fielddef_setintfmt(upb_fielddef *f, upb_intfmt_t fmt); | |
1796 void upb_fielddef_settagdelim(upb_fielddef *f, bool tag_delim); | |
1797 void upb_fielddef_setdefaultint64(upb_fielddef *f, int64_t val); | |
1798 void upb_fielddef_setdefaultint32(upb_fielddef *f, int32_t val); | |
1799 void upb_fielddef_setdefaultuint64(upb_fielddef *f, uint64_t val); | |
1800 void upb_fielddef_setdefaultuint32(upb_fielddef *f, uint32_t val); | |
1801 void upb_fielddef_setdefaultbool(upb_fielddef *f, bool val); | |
1802 void upb_fielddef_setdefaultfloat(upb_fielddef *f, float val); | |
1803 void upb_fielddef_setdefaultdouble(upb_fielddef *f, double val); | |
1804 bool upb_fielddef_setdefaultstr(upb_fielddef *f, const void *str, size_t len, | |
1805 upb_status *s); | |
1806 void upb_fielddef_setdefaultcstr(upb_fielddef *f, const char *str, | |
1807 upb_status *s); | |
1808 bool upb_fielddef_setsubdef(upb_fielddef *f, const upb_def *subdef, | |
1809 upb_status *s); | |
1810 bool upb_fielddef_setmsgsubdef(upb_fielddef *f, const upb_msgdef *subdef, | |
1811 upb_status *s); | |
1812 bool upb_fielddef_setenumsubdef(upb_fielddef *f, const upb_enumdef *subdef, | |
1813 upb_status *s); | |
1814 bool upb_fielddef_setsubdefname(upb_fielddef *f, const char *name, | |
1815 upb_status *s); | |
1816 | |
1817 bool upb_fielddef_checklabel(int32_t label); | |
1818 bool upb_fielddef_checktype(int32_t type); | |
1819 bool upb_fielddef_checkdescriptortype(int32_t type); | |
1820 bool upb_fielddef_checkintfmt(int32_t fmt); | |
1821 | |
1822 UPB_END_EXTERN_C | |
1823 | |
1824 | |
1825 /* upb::MessageDef ************************************************************/ | |
1826 | |
1827 typedef upb_inttable_iter upb_msg_field_iter; | |
1828 typedef upb_strtable_iter upb_msg_oneof_iter; | |
1829 | |
1830 #ifdef __cplusplus | |
1831 | |
1832 /* Structure that describes a single .proto message type. | |
1833 * | |
1834 * Its base class is upb::Def (use upb::upcast() to convert). */ | |
1835 class upb::MessageDef { | |
1836 public: | |
1837 /* Returns NULL if memory allocation failed. */ | |
1838 static reffed_ptr<MessageDef> New(); | |
1839 | |
1840 /* upb::RefCounted methods like Ref()/Unref(). */ | |
1841 UPB_REFCOUNTED_CPPMETHODS | |
1842 | |
1843 /* Functionality from upb::Def. */ | |
1844 const char* full_name() const; | |
1845 bool set_full_name(const char* fullname, Status* s); | |
1846 bool set_full_name(const std::string& fullname, Status* s); | |
1847 | |
1848 /* Call to freeze this MessageDef. | |
1849 * WARNING: this will fail if this message has any unfrozen submessages! | |
1850 * Messages with cycles must be frozen as a batch using upb::Def::Freeze(). */ | |
1851 bool Freeze(Status* s); | |
1852 | |
1853 /* The number of fields that belong to the MessageDef. */ | |
1854 int field_count() const; | |
1855 | |
1856 /* The number of oneofs that belong to the MessageDef. */ | |
1857 int oneof_count() const; | |
1858 | |
1859 /* Adds a field (upb_fielddef object) to a msgdef. Requires that the msgdef | |
1860 * and the fielddefs are mutable. The fielddef's name and number must be | |
1861 * set, and the message may not already contain any field with this name or | |
1862 * number, and this fielddef may not be part of another message. In error | |
1863 * cases false is returned and the msgdef is unchanged. | |
1864 * | |
1865 * If the given field is part of a oneof, this call succeeds if and only if | |
1866 * that oneof is already part of this msgdef. (Note that adding a oneof to a | |
1867 * msgdef automatically adds all of its fields to the msgdef at the time that | |
1868 * the oneof is added, so it is usually more idiomatic to add the oneof's | |
1869 * fields first then add the oneof to the msgdef. This case is supported for | |
1870 * convenience.) | |
1871 * | |
1872 * If |f| is already part of this MessageDef, this method performs no action | |
1873 * and returns true (success). Thus, this method is idempotent. */ | |
1874 bool AddField(FieldDef* f, Status* s); | |
1875 bool AddField(const reffed_ptr<FieldDef>& f, Status* s); | |
1876 | |
1877 /* Adds a oneof (upb_oneofdef object) to a msgdef. Requires that the msgdef, | |
1878 * oneof, and any fielddefs are mutable, that the fielddefs contained in the | |
1879 * oneof do not have any name or number conflicts with existing fields in the | |
1880 * msgdef, and that the oneof's name is unique among all oneofs in the msgdef. | |
1881 * If the oneof is added successfully, all of its fields will be added | |
1882 * directly to the msgdef as well. In error cases, false is returned and the | |
1883 * msgdef is unchanged. */ | |
1884 bool AddOneof(OneofDef* o, Status* s); | |
1885 bool AddOneof(const reffed_ptr<OneofDef>& o, Status* s); | |
1886 | |
1887 /* These return NULL if the field is not found. */ | |
1888 FieldDef* FindFieldByNumber(uint32_t number); | |
1889 FieldDef* FindFieldByName(const char *name, size_t len); | |
1890 const FieldDef* FindFieldByNumber(uint32_t number) const; | |
1891 const FieldDef* FindFieldByName(const char* name, size_t len) const; | |
1892 | |
1893 | |
1894 FieldDef* FindFieldByName(const char *name) { | |
1895 return FindFieldByName(name, strlen(name)); | |
1896 } | |
1897 const FieldDef* FindFieldByName(const char *name) const { | |
1898 return FindFieldByName(name, strlen(name)); | |
1899 } | |
1900 | |
1901 template <class T> | |
1902 FieldDef* FindFieldByName(const T& str) { | |
1903 return FindFieldByName(str.c_str(), str.size()); | |
1904 } | |
1905 template <class T> | |
1906 const FieldDef* FindFieldByName(const T& str) const { | |
1907 return FindFieldByName(str.c_str(), str.size()); | |
1908 } | |
1909 | |
1910 OneofDef* FindOneofByName(const char* name, size_t len); | |
1911 const OneofDef* FindOneofByName(const char* name, size_t len) const; | |
1912 | |
1913 OneofDef* FindOneofByName(const char* name) { | |
1914 return FindOneofByName(name, strlen(name)); | |
1915 } | |
1916 const OneofDef* FindOneofByName(const char* name) const { | |
1917 return FindOneofByName(name, strlen(name)); | |
1918 } | |
1919 | |
1920 template<class T> | |
1921 OneofDef* FindOneofByName(const T& str) { | |
1922 return FindOneofByName(str.c_str(), str.size()); | |
1923 } | |
1924 template<class T> | |
1925 const OneofDef* FindOneofByName(const T& str) const { | |
1926 return FindOneofByName(str.c_str(), str.size()); | |
1927 } | |
1928 | |
1929 /* Returns a new msgdef that is a copy of the given msgdef (and a copy of all | |
1930 * the fields) but with any references to submessages broken and replaced | |
1931 * with just the name of the submessage. Returns NULL if memory allocation | |
1932 * failed. | |
1933 * | |
1934 * TODO(haberman): which is more useful, keeping fields resolved or | |
1935 * unresolving them? If there's no obvious answer, Should this functionality | |
1936 * just be moved into symtab.c? */ | |
1937 MessageDef* Dup(const void* owner) const; | |
1938 | |
1939 /* Is this message a map entry? */ | |
1940 void setmapentry(bool map_entry); | |
1941 bool mapentry() const; | |
1942 | |
1943 /* Iteration over fields. The order is undefined. */ | |
1944 class field_iterator | |
1945 : public std::iterator<std::forward_iterator_tag, FieldDef*> { | |
1946 public: | |
1947 explicit field_iterator(MessageDef* md); | |
1948 static field_iterator end(MessageDef* md); | |
1949 | |
1950 void operator++(); | |
1951 FieldDef* operator*() const; | |
1952 bool operator!=(const field_iterator& other) const; | |
1953 bool operator==(const field_iterator& other) const; | |
1954 | |
1955 private: | |
1956 upb_msg_field_iter iter_; | |
1957 }; | |
1958 | |
1959 class const_field_iterator | |
1960 : public std::iterator<std::forward_iterator_tag, const FieldDef*> { | |
1961 public: | |
1962 explicit const_field_iterator(const MessageDef* md); | |
1963 static const_field_iterator end(const MessageDef* md); | |
1964 | |
1965 void operator++(); | |
1966 const FieldDef* operator*() const; | |
1967 bool operator!=(const const_field_iterator& other) const; | |
1968 bool operator==(const const_field_iterator& other) const; | |
1969 | |
1970 private: | |
1971 upb_msg_field_iter iter_; | |
1972 }; | |
1973 | |
1974 /* Iteration over oneofs. The order is undefined. */ | |
1975 class oneof_iterator | |
1976 : public std::iterator<std::forward_iterator_tag, FieldDef*> { | |
1977 public: | |
1978 explicit oneof_iterator(MessageDef* md); | |
1979 static oneof_iterator end(MessageDef* md); | |
1980 | |
1981 void operator++(); | |
1982 OneofDef* operator*() const; | |
1983 bool operator!=(const oneof_iterator& other) const; | |
1984 bool operator==(const oneof_iterator& other) const; | |
1985 | |
1986 private: | |
1987 upb_msg_oneof_iter iter_; | |
1988 }; | |
1989 | |
1990 class const_oneof_iterator | |
1991 : public std::iterator<std::forward_iterator_tag, const FieldDef*> { | |
1992 public: | |
1993 explicit const_oneof_iterator(const MessageDef* md); | |
1994 static const_oneof_iterator end(const MessageDef* md); | |
1995 | |
1996 void operator++(); | |
1997 const OneofDef* operator*() const; | |
1998 bool operator!=(const const_oneof_iterator& other) const; | |
1999 bool operator==(const const_oneof_iterator& other) const; | |
2000 | |
2001 private: | |
2002 upb_msg_oneof_iter iter_; | |
2003 }; | |
2004 | |
2005 class FieldAccessor { | |
2006 public: | |
2007 explicit FieldAccessor(MessageDef* msg) : msg_(msg) {} | |
2008 field_iterator begin() { return msg_->field_begin(); } | |
2009 field_iterator end() { return msg_->field_end(); } | |
2010 private: | |
2011 MessageDef* msg_; | |
2012 }; | |
2013 | |
2014 class ConstFieldAccessor { | |
2015 public: | |
2016 explicit ConstFieldAccessor(const MessageDef* msg) : msg_(msg) {} | |
2017 const_field_iterator begin() { return msg_->field_begin(); } | |
2018 const_field_iterator end() { return msg_->field_end(); } | |
2019 private: | |
2020 const MessageDef* msg_; | |
2021 }; | |
2022 | |
2023 class OneofAccessor { | |
2024 public: | |
2025 explicit OneofAccessor(MessageDef* msg) : msg_(msg) {} | |
2026 oneof_iterator begin() { return msg_->oneof_begin(); } | |
2027 oneof_iterator end() { return msg_->oneof_end(); } | |
2028 private: | |
2029 MessageDef* msg_; | |
2030 }; | |
2031 | |
2032 class ConstOneofAccessor { | |
2033 public: | |
2034 explicit ConstOneofAccessor(const MessageDef* msg) : msg_(msg) {} | |
2035 const_oneof_iterator begin() { return msg_->oneof_begin(); } | |
2036 const_oneof_iterator end() { return msg_->oneof_end(); } | |
2037 private: | |
2038 const MessageDef* msg_; | |
2039 }; | |
2040 | |
2041 field_iterator field_begin(); | |
2042 field_iterator field_end(); | |
2043 const_field_iterator field_begin() const; | |
2044 const_field_iterator field_end() const; | |
2045 | |
2046 oneof_iterator oneof_begin(); | |
2047 oneof_iterator oneof_end(); | |
2048 const_oneof_iterator oneof_begin() const; | |
2049 const_oneof_iterator oneof_end() const; | |
2050 | |
2051 FieldAccessor fields() { return FieldAccessor(this); } | |
2052 ConstFieldAccessor fields() const { return ConstFieldAccessor(this); } | |
2053 OneofAccessor oneofs() { return OneofAccessor(this); } | |
2054 ConstOneofAccessor oneofs() const { return ConstOneofAccessor(this); } | |
2055 | |
2056 private: | |
2057 UPB_DISALLOW_POD_OPS(MessageDef, upb::MessageDef) | |
2058 }; | |
2059 | |
2060 #endif /* __cplusplus */ | |
2061 | |
2062 UPB_BEGIN_EXTERN_C | |
2063 | |
2064 /* Returns NULL if memory allocation failed. */ | |
2065 upb_msgdef *upb_msgdef_new(const void *owner); | |
2066 | |
2067 /* Include upb_refcounted methods like upb_msgdef_ref(). */ | |
2068 UPB_REFCOUNTED_CMETHODS(upb_msgdef, upb_msgdef_upcast2) | |
2069 | |
2070 bool upb_msgdef_freeze(upb_msgdef *m, upb_status *status); | |
2071 | |
2072 const char *upb_msgdef_fullname(const upb_msgdef *m); | |
2073 bool upb_msgdef_setfullname(upb_msgdef *m, const char *fullname, upb_status *s); | |
2074 | |
2075 upb_msgdef *upb_msgdef_dup(const upb_msgdef *m, const void *owner); | |
2076 bool upb_msgdef_addfield(upb_msgdef *m, upb_fielddef *f, const void *ref_donor, | |
2077 upb_status *s); | |
2078 bool upb_msgdef_addoneof(upb_msgdef *m, upb_oneofdef *o, const void *ref_donor, | |
2079 upb_status *s); | |
2080 | |
2081 /* Field lookup in a couple of different variations: | |
2082 * - itof = int to field | |
2083 * - ntof = name to field | |
2084 * - ntofz = name to field, null-terminated string. */ | |
2085 const upb_fielddef *upb_msgdef_itof(const upb_msgdef *m, uint32_t i); | |
2086 const upb_fielddef *upb_msgdef_ntof(const upb_msgdef *m, const char *name, | |
2087 size_t len); | |
2088 int upb_msgdef_numfields(const upb_msgdef *m); | |
2089 | |
2090 UPB_INLINE const upb_fielddef *upb_msgdef_ntofz(const upb_msgdef *m, | |
2091 const char *name) { | |
2092 return upb_msgdef_ntof(m, name, strlen(name)); | |
2093 } | |
2094 | |
2095 UPB_INLINE upb_fielddef *upb_msgdef_itof_mutable(upb_msgdef *m, uint32_t i) { | |
2096 return (upb_fielddef*)upb_msgdef_itof(m, i); | |
2097 } | |
2098 | |
2099 UPB_INLINE upb_fielddef *upb_msgdef_ntof_mutable(upb_msgdef *m, | |
2100 const char *name, size_t len) { | |
2101 return (upb_fielddef *)upb_msgdef_ntof(m, name, len); | |
2102 } | |
2103 | |
2104 /* Oneof lookup: | |
2105 * - ntoo = name to oneof | |
2106 * - ntooz = name to oneof, null-terminated string. */ | |
2107 const upb_oneofdef *upb_msgdef_ntoo(const upb_msgdef *m, const char *name, | |
2108 size_t len); | |
2109 int upb_msgdef_numoneofs(const upb_msgdef *m); | |
2110 | |
2111 UPB_INLINE const upb_oneofdef *upb_msgdef_ntooz(const upb_msgdef *m, | |
2112 const char *name) { | |
2113 return upb_msgdef_ntoo(m, name, strlen(name)); | |
2114 } | |
2115 | |
2116 UPB_INLINE upb_oneofdef *upb_msgdef_ntoo_mutable(upb_msgdef *m, | |
2117 const char *name, size_t len) { | |
2118 return (upb_oneofdef *)upb_msgdef_ntoo(m, name, len); | |
2119 } | |
2120 | |
2121 void upb_msgdef_setmapentry(upb_msgdef *m, bool map_entry); | |
2122 bool upb_msgdef_mapentry(const upb_msgdef *m); | |
2123 | |
2124 /* Well-known field tag numbers for map-entry messages. */ | |
2125 #define UPB_MAPENTRY_KEY 1 | |
2126 #define UPB_MAPENTRY_VALUE 2 | |
2127 | |
2128 const upb_oneofdef *upb_msgdef_findoneof(const upb_msgdef *m, | |
2129 const char *name); | |
2130 int upb_msgdef_numoneofs(const upb_msgdef *m); | |
2131 | |
2132 /* upb_msg_field_iter i; | |
2133 * for(upb_msg_field_begin(&i, m); | |
2134 * !upb_msg_field_done(&i); | |
2135 * upb_msg_field_next(&i)) { | |
2136 * upb_fielddef *f = upb_msg_iter_field(&i); | |
2137 * // ... | |
2138 * } | |
2139 * | |
2140 * For C we don't have separate iterators for const and non-const. | |
2141 * It is the caller's responsibility to cast the upb_fielddef* to | |
2142 * const if the upb_msgdef* is const. */ | |
2143 void upb_msg_field_begin(upb_msg_field_iter *iter, const upb_msgdef *m); | |
2144 void upb_msg_field_next(upb_msg_field_iter *iter); | |
2145 bool upb_msg_field_done(const upb_msg_field_iter *iter); | |
2146 upb_fielddef *upb_msg_iter_field(const upb_msg_field_iter *iter); | |
2147 void upb_msg_field_iter_setdone(upb_msg_field_iter *iter); | |
2148 | |
2149 /* Similar to above, we also support iterating through the oneofs in a | |
2150 * msgdef. */ | |
2151 void upb_msg_oneof_begin(upb_msg_oneof_iter *iter, const upb_msgdef *m); | |
2152 void upb_msg_oneof_next(upb_msg_oneof_iter *iter); | |
2153 bool upb_msg_oneof_done(const upb_msg_oneof_iter *iter); | |
2154 upb_oneofdef *upb_msg_iter_oneof(const upb_msg_oneof_iter *iter); | |
2155 void upb_msg_oneof_iter_setdone(upb_msg_oneof_iter *iter); | |
2156 | |
2157 UPB_END_EXTERN_C | |
2158 | |
2159 | |
2160 /* upb::EnumDef ***************************************************************/ | |
2161 | |
2162 typedef upb_strtable_iter upb_enum_iter; | |
2163 | |
2164 #ifdef __cplusplus | |
2165 | |
2166 /* Class that represents an enum. Its base class is upb::Def (convert with | |
2167 * upb::upcast()). */ | |
2168 class upb::EnumDef { | |
2169 public: | |
2170 /* Returns NULL if memory allocation failed. */ | |
2171 static reffed_ptr<EnumDef> New(); | |
2172 | |
2173 /* upb::RefCounted methods like Ref()/Unref(). */ | |
2174 UPB_REFCOUNTED_CPPMETHODS | |
2175 | |
2176 /* Functionality from upb::Def. */ | |
2177 const char* full_name() const; | |
2178 bool set_full_name(const char* fullname, Status* s); | |
2179 bool set_full_name(const std::string& fullname, Status* s); | |
2180 | |
2181 /* Call to freeze this EnumDef. */ | |
2182 bool Freeze(Status* s); | |
2183 | |
2184 /* The value that is used as the default when no field default is specified. | |
2185 * If not set explicitly, the first value that was added will be used. | |
2186 * The default value must be a member of the enum. | |
2187 * Requires that value_count() > 0. */ | |
2188 int32_t default_value() const; | |
2189 | |
2190 /* Sets the default value. If this value is not valid, returns false and an | |
2191 * error message in status. */ | |
2192 bool set_default_value(int32_t val, Status* status); | |
2193 | |
2194 /* Returns the number of values currently defined in the enum. Note that | |
2195 * multiple names can refer to the same number, so this may be greater than | |
2196 * the total number of unique numbers. */ | |
2197 int value_count() const; | |
2198 | |
2199 /* Adds a single name/number pair to the enum. Fails if this name has | |
2200 * already been used by another value. */ | |
2201 bool AddValue(const char* name, int32_t num, Status* status); | |
2202 bool AddValue(const std::string& name, int32_t num, Status* status); | |
2203 | |
2204 /* Lookups from name to integer, returning true if found. */ | |
2205 bool FindValueByName(const char* name, int32_t* num) const; | |
2206 | |
2207 /* Finds the name corresponding to the given number, or NULL if none was | |
2208 * found. If more than one name corresponds to this number, returns the | |
2209 * first one that was added. */ | |
2210 const char* FindValueByNumber(int32_t num) const; | |
2211 | |
2212 /* Returns a new EnumDef with all the same values. The new EnumDef will be | |
2213 * owned by the given owner. */ | |
2214 EnumDef* Dup(const void* owner) const; | |
2215 | |
2216 /* Iteration over name/value pairs. The order is undefined. | |
2217 * Adding an enum val invalidates any iterators. | |
2218 * | |
2219 * TODO: make compatible with range-for, with elements as pairs? */ | |
2220 class Iterator { | |
2221 public: | |
2222 explicit Iterator(const EnumDef*); | |
2223 | |
2224 int32_t number(); | |
2225 const char *name(); | |
2226 bool Done(); | |
2227 void Next(); | |
2228 | |
2229 private: | |
2230 upb_enum_iter iter_; | |
2231 }; | |
2232 | |
2233 private: | |
2234 UPB_DISALLOW_POD_OPS(EnumDef, upb::EnumDef) | |
2235 }; | |
2236 | |
2237 #endif /* __cplusplus */ | |
2238 | |
2239 UPB_BEGIN_EXTERN_C | |
2240 | |
2241 /* Native C API. */ | |
2242 upb_enumdef *upb_enumdef_new(const void *owner); | |
2243 upb_enumdef *upb_enumdef_dup(const upb_enumdef *e, const void *owner); | |
2244 | |
2245 /* Include upb_refcounted methods like upb_enumdef_ref(). */ | |
2246 UPB_REFCOUNTED_CMETHODS(upb_enumdef, upb_enumdef_upcast2) | |
2247 | |
2248 bool upb_enumdef_freeze(upb_enumdef *e, upb_status *status); | |
2249 | |
2250 /* From upb_def. */ | |
2251 const char *upb_enumdef_fullname(const upb_enumdef *e); | |
2252 bool upb_enumdef_setfullname(upb_enumdef *e, const char *fullname, | |
2253 upb_status *s); | |
2254 | |
2255 int32_t upb_enumdef_default(const upb_enumdef *e); | |
2256 bool upb_enumdef_setdefault(upb_enumdef *e, int32_t val, upb_status *s); | |
2257 int upb_enumdef_numvals(const upb_enumdef *e); | |
2258 bool upb_enumdef_addval(upb_enumdef *e, const char *name, int32_t num, | |
2259 upb_status *status); | |
2260 | |
2261 /* Enum lookups: | |
2262 * - ntoi: look up a name with specified length. | |
2263 * - ntoiz: look up a name provided as a null-terminated string. | |
2264 * - iton: look up an integer, returning the name as a null-terminated | |
2265 * string. */ | |
2266 bool upb_enumdef_ntoi(const upb_enumdef *e, const char *name, size_t len, | |
2267 int32_t *num); | |
2268 UPB_INLINE bool upb_enumdef_ntoiz(const upb_enumdef *e, | |
2269 const char *name, int32_t *num) { | |
2270 return upb_enumdef_ntoi(e, name, strlen(name), num); | |
2271 } | |
2272 const char *upb_enumdef_iton(const upb_enumdef *e, int32_t num); | |
2273 | |
2274 /* upb_enum_iter i; | |
2275 * for(upb_enum_begin(&i, e); !upb_enum_done(&i); upb_enum_next(&i)) { | |
2276 * // ... | |
2277 * } | |
2278 */ | |
2279 void upb_enum_begin(upb_enum_iter *iter, const upb_enumdef *e); | |
2280 void upb_enum_next(upb_enum_iter *iter); | |
2281 bool upb_enum_done(upb_enum_iter *iter); | |
2282 const char *upb_enum_iter_name(upb_enum_iter *iter); | |
2283 int32_t upb_enum_iter_number(upb_enum_iter *iter); | |
2284 | |
2285 UPB_END_EXTERN_C | |
2286 | |
2287 /* upb::OneofDef **************************************************************/ | |
2288 | |
2289 typedef upb_inttable_iter upb_oneof_iter; | |
2290 | |
2291 #ifdef __cplusplus | |
2292 | |
2293 /* Class that represents a oneof. Its base class is upb::Def (convert with | |
2294 * upb::upcast()). */ | |
2295 class upb::OneofDef { | |
2296 public: | |
2297 /* Returns NULL if memory allocation failed. */ | |
2298 static reffed_ptr<OneofDef> New(); | |
2299 | |
2300 /* upb::RefCounted methods like Ref()/Unref(). */ | |
2301 UPB_REFCOUNTED_CPPMETHODS | |
2302 | |
2303 /* Functionality from upb::Def. */ | |
2304 const char* full_name() const; | |
2305 | |
2306 /* Returns the MessageDef that owns this OneofDef. */ | |
2307 const MessageDef* containing_type() const; | |
2308 | |
2309 /* Returns the name of this oneof. This is the name used to look up the oneof | |
2310 * by name once added to a message def. */ | |
2311 const char* name() const; | |
2312 bool set_name(const char* name, Status* s); | |
2313 | |
2314 /* Returns the number of fields currently defined in the oneof. */ | |
2315 int field_count() const; | |
2316 | |
2317 /* Adds a field to the oneof. The field must not have been added to any other | |
2318 * oneof or msgdef. If the oneof is not yet part of a msgdef, then when the | |
2319 * oneof is eventually added to a msgdef, all fields added to the oneof will | |
2320 * also be added to the msgdef at that time. If the oneof is already part of a | |
2321 * msgdef, the field must either be a part of that msgdef already, or must not | |
2322 * be a part of any msgdef; in the latter case, the field is added to the | |
2323 * msgdef as a part of this operation. | |
2324 * | |
2325 * The field may only have an OPTIONAL label, never REQUIRED or REPEATED. | |
2326 * | |
2327 * If |f| is already part of this MessageDef, this method performs no action | |
2328 * and returns true (success). Thus, this method is idempotent. */ | |
2329 bool AddField(FieldDef* field, Status* s); | |
2330 bool AddField(const reffed_ptr<FieldDef>& field, Status* s); | |
2331 | |
2332 /* Looks up by name. */ | |
2333 const FieldDef* FindFieldByName(const char* name, size_t len) const; | |
2334 FieldDef* FindFieldByName(const char* name, size_t len); | |
2335 const FieldDef* FindFieldByName(const char* name) const { | |
2336 return FindFieldByName(name, strlen(name)); | |
2337 } | |
2338 FieldDef* FindFieldByName(const char* name) { | |
2339 return FindFieldByName(name, strlen(name)); | |
2340 } | |
2341 | |
2342 template <class T> | |
2343 FieldDef* FindFieldByName(const T& str) { | |
2344 return FindFieldByName(str.c_str(), str.size()); | |
2345 } | |
2346 template <class T> | |
2347 const FieldDef* FindFieldByName(const T& str) const { | |
2348 return FindFieldByName(str.c_str(), str.size()); | |
2349 } | |
2350 | |
2351 /* Looks up by tag number. */ | |
2352 const FieldDef* FindFieldByNumber(uint32_t num) const; | |
2353 | |
2354 /* Returns a new OneofDef with all the same fields. The OneofDef will be owned | |
2355 * by the given owner. */ | |
2356 OneofDef* Dup(const void* owner) const; | |
2357 | |
2358 /* Iteration over fields. The order is undefined. */ | |
2359 class iterator : public std::iterator<std::forward_iterator_tag, FieldDef*> { | |
2360 public: | |
2361 explicit iterator(OneofDef* md); | |
2362 static iterator end(OneofDef* md); | |
2363 | |
2364 void operator++(); | |
2365 FieldDef* operator*() const; | |
2366 bool operator!=(const iterator& other) const; | |
2367 bool operator==(const iterator& other) const; | |
2368 | |
2369 private: | |
2370 upb_oneof_iter iter_; | |
2371 }; | |
2372 | |
2373 class const_iterator | |
2374 : public std::iterator<std::forward_iterator_tag, const FieldDef*> { | |
2375 public: | |
2376 explicit const_iterator(const OneofDef* md); | |
2377 static const_iterator end(const OneofDef* md); | |
2378 | |
2379 void operator++(); | |
2380 const FieldDef* operator*() const; | |
2381 bool operator!=(const const_iterator& other) const; | |
2382 bool operator==(const const_iterator& other) const; | |
2383 | |
2384 private: | |
2385 upb_oneof_iter iter_; | |
2386 }; | |
2387 | |
2388 iterator begin(); | |
2389 iterator end(); | |
2390 const_iterator begin() const; | |
2391 const_iterator end() const; | |
2392 | |
2393 private: | |
2394 UPB_DISALLOW_POD_OPS(OneofDef, upb::OneofDef) | |
2395 }; | |
2396 | |
2397 #endif /* __cplusplus */ | |
2398 | |
2399 UPB_BEGIN_EXTERN_C | |
2400 | |
2401 /* Native C API. */ | |
2402 upb_oneofdef *upb_oneofdef_new(const void *owner); | |
2403 upb_oneofdef *upb_oneofdef_dup(const upb_oneofdef *o, const void *owner); | |
2404 | |
2405 /* Include upb_refcounted methods like upb_oneofdef_ref(). */ | |
2406 UPB_REFCOUNTED_CMETHODS(upb_oneofdef, upb_oneofdef_upcast2) | |
2407 | |
2408 const char *upb_oneofdef_name(const upb_oneofdef *o); | |
2409 bool upb_oneofdef_setname(upb_oneofdef *o, const char *name, upb_status *s); | |
2410 | |
2411 const upb_msgdef *upb_oneofdef_containingtype(const upb_oneofdef *o); | |
2412 int upb_oneofdef_numfields(const upb_oneofdef *o); | |
2413 bool upb_oneofdef_addfield(upb_oneofdef *o, upb_fielddef *f, | |
2414 const void *ref_donor, | |
2415 upb_status *s); | |
2416 | |
2417 /* Oneof lookups: | |
2418 * - ntof: look up a field by name. | |
2419 * - ntofz: look up a field by name (as a null-terminated string). | |
2420 * - itof: look up a field by number. */ | |
2421 const upb_fielddef *upb_oneofdef_ntof(const upb_oneofdef *o, | |
2422 const char *name, size_t length); | |
2423 UPB_INLINE const upb_fielddef *upb_oneofdef_ntofz(const upb_oneofdef *o, | |
2424 const char *name) { | |
2425 return upb_oneofdef_ntof(o, name, strlen(name)); | |
2426 } | |
2427 const upb_fielddef *upb_oneofdef_itof(const upb_oneofdef *o, uint32_t num); | |
2428 | |
2429 /* upb_oneof_iter i; | |
2430 * for(upb_oneof_begin(&i, e); !upb_oneof_done(&i); upb_oneof_next(&i)) { | |
2431 * // ... | |
2432 * } | |
2433 */ | |
2434 void upb_oneof_begin(upb_oneof_iter *iter, const upb_oneofdef *o); | |
2435 void upb_oneof_next(upb_oneof_iter *iter); | |
2436 bool upb_oneof_done(upb_oneof_iter *iter); | |
2437 upb_fielddef *upb_oneof_iter_field(const upb_oneof_iter *iter); | |
2438 void upb_oneof_iter_setdone(upb_oneof_iter *iter); | |
2439 | |
2440 UPB_END_EXTERN_C | |
2441 | |
2442 #ifdef __cplusplus | |
2443 | |
2444 UPB_INLINE const char* upb_safecstr(const std::string& str) { | |
2445 assert(str.size() == std::strlen(str.c_str())); | |
2446 return str.c_str(); | |
2447 } | |
2448 | |
2449 /* Inline C++ wrappers. */ | |
2450 namespace upb { | |
2451 | |
2452 inline Def* Def::Dup(const void* owner) const { | |
2453 return upb_def_dup(this, owner); | |
2454 } | |
2455 inline Def::Type Def::def_type() const { return upb_def_type(this); } | |
2456 inline const char* Def::full_name() const { return upb_def_fullname(this); } | |
2457 inline bool Def::set_full_name(const char* fullname, Status* s) { | |
2458 return upb_def_setfullname(this, fullname, s); | |
2459 } | |
2460 inline bool Def::set_full_name(const std::string& fullname, Status* s) { | |
2461 return upb_def_setfullname(this, upb_safecstr(fullname), s); | |
2462 } | |
2463 inline bool Def::Freeze(Def* const* defs, int n, Status* status) { | |
2464 return upb_def_freeze(defs, n, status); | |
2465 } | |
2466 inline bool Def::Freeze(const std::vector<Def*>& defs, Status* status) { | |
2467 return upb_def_freeze((Def* const*)&defs[0], defs.size(), status); | |
2468 } | |
2469 | |
2470 inline bool FieldDef::CheckType(int32_t val) { | |
2471 return upb_fielddef_checktype(val); | |
2472 } | |
2473 inline bool FieldDef::CheckLabel(int32_t val) { | |
2474 return upb_fielddef_checklabel(val); | |
2475 } | |
2476 inline bool FieldDef::CheckDescriptorType(int32_t val) { | |
2477 return upb_fielddef_checkdescriptortype(val); | |
2478 } | |
2479 inline bool FieldDef::CheckIntegerFormat(int32_t val) { | |
2480 return upb_fielddef_checkintfmt(val); | |
2481 } | |
2482 inline FieldDef::Type FieldDef::ConvertType(int32_t val) { | |
2483 assert(CheckType(val)); | |
2484 return static_cast<FieldDef::Type>(val); | |
2485 } | |
2486 inline FieldDef::Label FieldDef::ConvertLabel(int32_t val) { | |
2487 assert(CheckLabel(val)); | |
2488 return static_cast<FieldDef::Label>(val); | |
2489 } | |
2490 inline FieldDef::DescriptorType FieldDef::ConvertDescriptorType(int32_t val) { | |
2491 assert(CheckDescriptorType(val)); | |
2492 return static_cast<FieldDef::DescriptorType>(val); | |
2493 } | |
2494 inline FieldDef::IntegerFormat FieldDef::ConvertIntegerFormat(int32_t val) { | |
2495 assert(CheckIntegerFormat(val)); | |
2496 return static_cast<FieldDef::IntegerFormat>(val); | |
2497 } | |
2498 | |
2499 inline reffed_ptr<FieldDef> FieldDef::New() { | |
2500 upb_fielddef *f = upb_fielddef_new(&f); | |
2501 return reffed_ptr<FieldDef>(f, &f); | |
2502 } | |
2503 inline FieldDef* FieldDef::Dup(const void* owner) const { | |
2504 return upb_fielddef_dup(this, owner); | |
2505 } | |
2506 inline const char* FieldDef::full_name() const { | |
2507 return upb_fielddef_fullname(this); | |
2508 } | |
2509 inline bool FieldDef::set_full_name(const char* fullname, Status* s) { | |
2510 return upb_fielddef_setfullname(this, fullname, s); | |
2511 } | |
2512 inline bool FieldDef::set_full_name(const std::string& fullname, Status* s) { | |
2513 return upb_fielddef_setfullname(this, upb_safecstr(fullname), s); | |
2514 } | |
2515 inline bool FieldDef::type_is_set() const { | |
2516 return upb_fielddef_typeisset(this); | |
2517 } | |
2518 inline FieldDef::Type FieldDef::type() const { return upb_fielddef_type(this); } | |
2519 inline FieldDef::DescriptorType FieldDef::descriptor_type() const { | |
2520 return upb_fielddef_descriptortype(this); | |
2521 } | |
2522 inline FieldDef::Label FieldDef::label() const { | |
2523 return upb_fielddef_label(this); | |
2524 } | |
2525 inline uint32_t FieldDef::number() const { return upb_fielddef_number(this); } | |
2526 inline const char* FieldDef::name() const { return upb_fielddef_name(this); } | |
2527 inline bool FieldDef::is_extension() const { | |
2528 return upb_fielddef_isextension(this); | |
2529 } | |
2530 inline bool FieldDef::lazy() const { | |
2531 return upb_fielddef_lazy(this); | |
2532 } | |
2533 inline void FieldDef::set_lazy(bool lazy) { | |
2534 upb_fielddef_setlazy(this, lazy); | |
2535 } | |
2536 inline bool FieldDef::packed() const { | |
2537 return upb_fielddef_packed(this); | |
2538 } | |
2539 inline void FieldDef::set_packed(bool packed) { | |
2540 upb_fielddef_setpacked(this, packed); | |
2541 } | |
2542 inline const MessageDef* FieldDef::containing_type() const { | |
2543 return upb_fielddef_containingtype(this); | |
2544 } | |
2545 inline const OneofDef* FieldDef::containing_oneof() const { | |
2546 return upb_fielddef_containingoneof(this); | |
2547 } | |
2548 inline const char* FieldDef::containing_type_name() { | |
2549 return upb_fielddef_containingtypename(this); | |
2550 } | |
2551 inline bool FieldDef::set_number(uint32_t number, Status* s) { | |
2552 return upb_fielddef_setnumber(this, number, s); | |
2553 } | |
2554 inline bool FieldDef::set_name(const char *name, Status* s) { | |
2555 return upb_fielddef_setname(this, name, s); | |
2556 } | |
2557 inline bool FieldDef::set_name(const std::string& name, Status* s) { | |
2558 return upb_fielddef_setname(this, upb_safecstr(name), s); | |
2559 } | |
2560 inline bool FieldDef::set_containing_type_name(const char *name, Status* s) { | |
2561 return upb_fielddef_setcontainingtypename(this, name, s); | |
2562 } | |
2563 inline bool FieldDef::set_containing_type_name(const std::string &name, | |
2564 Status *s) { | |
2565 return upb_fielddef_setcontainingtypename(this, upb_safecstr(name), s); | |
2566 } | |
2567 inline void FieldDef::set_type(upb_fieldtype_t type) { | |
2568 upb_fielddef_settype(this, type); | |
2569 } | |
2570 inline void FieldDef::set_is_extension(bool is_extension) { | |
2571 upb_fielddef_setisextension(this, is_extension); | |
2572 } | |
2573 inline void FieldDef::set_descriptor_type(FieldDef::DescriptorType type) { | |
2574 upb_fielddef_setdescriptortype(this, type); | |
2575 } | |
2576 inline void FieldDef::set_label(upb_label_t label) { | |
2577 upb_fielddef_setlabel(this, label); | |
2578 } | |
2579 inline bool FieldDef::IsSubMessage() const { | |
2580 return upb_fielddef_issubmsg(this); | |
2581 } | |
2582 inline bool FieldDef::IsString() const { return upb_fielddef_isstring(this); } | |
2583 inline bool FieldDef::IsSequence() const { return upb_fielddef_isseq(this); } | |
2584 inline bool FieldDef::IsMap() const { return upb_fielddef_ismap(this); } | |
2585 inline int64_t FieldDef::default_int64() const { | |
2586 return upb_fielddef_defaultint64(this); | |
2587 } | |
2588 inline int32_t FieldDef::default_int32() const { | |
2589 return upb_fielddef_defaultint32(this); | |
2590 } | |
2591 inline uint64_t FieldDef::default_uint64() const { | |
2592 return upb_fielddef_defaultuint64(this); | |
2593 } | |
2594 inline uint32_t FieldDef::default_uint32() const { | |
2595 return upb_fielddef_defaultuint32(this); | |
2596 } | |
2597 inline bool FieldDef::default_bool() const { | |
2598 return upb_fielddef_defaultbool(this); | |
2599 } | |
2600 inline float FieldDef::default_float() const { | |
2601 return upb_fielddef_defaultfloat(this); | |
2602 } | |
2603 inline double FieldDef::default_double() const { | |
2604 return upb_fielddef_defaultdouble(this); | |
2605 } | |
2606 inline const char* FieldDef::default_string(size_t* len) const { | |
2607 return upb_fielddef_defaultstr(this, len); | |
2608 } | |
2609 inline void FieldDef::set_default_int64(int64_t value) { | |
2610 upb_fielddef_setdefaultint64(this, value); | |
2611 } | |
2612 inline void FieldDef::set_default_int32(int32_t value) { | |
2613 upb_fielddef_setdefaultint32(this, value); | |
2614 } | |
2615 inline void FieldDef::set_default_uint64(uint64_t value) { | |
2616 upb_fielddef_setdefaultuint64(this, value); | |
2617 } | |
2618 inline void FieldDef::set_default_uint32(uint32_t value) { | |
2619 upb_fielddef_setdefaultuint32(this, value); | |
2620 } | |
2621 inline void FieldDef::set_default_bool(bool value) { | |
2622 upb_fielddef_setdefaultbool(this, value); | |
2623 } | |
2624 inline void FieldDef::set_default_float(float value) { | |
2625 upb_fielddef_setdefaultfloat(this, value); | |
2626 } | |
2627 inline void FieldDef::set_default_double(double value) { | |
2628 upb_fielddef_setdefaultdouble(this, value); | |
2629 } | |
2630 inline bool FieldDef::set_default_string(const void *str, size_t len, | |
2631 Status *s) { | |
2632 return upb_fielddef_setdefaultstr(this, str, len, s); | |
2633 } | |
2634 inline bool FieldDef::set_default_string(const std::string& str, Status* s) { | |
2635 return upb_fielddef_setdefaultstr(this, str.c_str(), str.size(), s); | |
2636 } | |
2637 inline void FieldDef::set_default_cstr(const char* str, Status* s) { | |
2638 return upb_fielddef_setdefaultcstr(this, str, s); | |
2639 } | |
2640 inline bool FieldDef::HasSubDef() const { return upb_fielddef_hassubdef(this); } | |
2641 inline const Def* FieldDef::subdef() const { return upb_fielddef_subdef(this); } | |
2642 inline const MessageDef *FieldDef::message_subdef() const { | |
2643 return upb_fielddef_msgsubdef(this); | |
2644 } | |
2645 inline const EnumDef *FieldDef::enum_subdef() const { | |
2646 return upb_fielddef_enumsubdef(this); | |
2647 } | |
2648 inline const char* FieldDef::subdef_name() const { | |
2649 return upb_fielddef_subdefname(this); | |
2650 } | |
2651 inline bool FieldDef::set_subdef(const Def* subdef, Status* s) { | |
2652 return upb_fielddef_setsubdef(this, subdef, s); | |
2653 } | |
2654 inline bool FieldDef::set_enum_subdef(const EnumDef* subdef, Status* s) { | |
2655 return upb_fielddef_setenumsubdef(this, subdef, s); | |
2656 } | |
2657 inline bool FieldDef::set_message_subdef(const MessageDef* subdef, Status* s) { | |
2658 return upb_fielddef_setmsgsubdef(this, subdef, s); | |
2659 } | |
2660 inline bool FieldDef::set_subdef_name(const char* name, Status* s) { | |
2661 return upb_fielddef_setsubdefname(this, name, s); | |
2662 } | |
2663 inline bool FieldDef::set_subdef_name(const std::string& name, Status* s) { | |
2664 return upb_fielddef_setsubdefname(this, upb_safecstr(name), s); | |
2665 } | |
2666 | |
2667 inline reffed_ptr<MessageDef> MessageDef::New() { | |
2668 upb_msgdef *m = upb_msgdef_new(&m); | |
2669 return reffed_ptr<MessageDef>(m, &m); | |
2670 } | |
2671 inline const char *MessageDef::full_name() const { | |
2672 return upb_msgdef_fullname(this); | |
2673 } | |
2674 inline bool MessageDef::set_full_name(const char* fullname, Status* s) { | |
2675 return upb_msgdef_setfullname(this, fullname, s); | |
2676 } | |
2677 inline bool MessageDef::set_full_name(const std::string& fullname, Status* s) { | |
2678 return upb_msgdef_setfullname(this, upb_safecstr(fullname), s); | |
2679 } | |
2680 inline bool MessageDef::Freeze(Status* status) { | |
2681 return upb_msgdef_freeze(this, status); | |
2682 } | |
2683 inline int MessageDef::field_count() const { | |
2684 return upb_msgdef_numfields(this); | |
2685 } | |
2686 inline int MessageDef::oneof_count() const { | |
2687 return upb_msgdef_numoneofs(this); | |
2688 } | |
2689 inline bool MessageDef::AddField(upb_fielddef* f, Status* s) { | |
2690 return upb_msgdef_addfield(this, f, NULL, s); | |
2691 } | |
2692 inline bool MessageDef::AddField(const reffed_ptr<FieldDef>& f, Status* s) { | |
2693 return upb_msgdef_addfield(this, f.get(), NULL, s); | |
2694 } | |
2695 inline bool MessageDef::AddOneof(upb_oneofdef* o, Status* s) { | |
2696 return upb_msgdef_addoneof(this, o, NULL, s); | |
2697 } | |
2698 inline bool MessageDef::AddOneof(const reffed_ptr<OneofDef>& o, Status* s) { | |
2699 return upb_msgdef_addoneof(this, o.get(), NULL, s); | |
2700 } | |
2701 inline FieldDef* MessageDef::FindFieldByNumber(uint32_t number) { | |
2702 return upb_msgdef_itof_mutable(this, number); | |
2703 } | |
2704 inline FieldDef* MessageDef::FindFieldByName(const char* name, size_t len) { | |
2705 return upb_msgdef_ntof_mutable(this, name, len); | |
2706 } | |
2707 inline const FieldDef* MessageDef::FindFieldByNumber(uint32_t number) const { | |
2708 return upb_msgdef_itof(this, number); | |
2709 } | |
2710 inline const FieldDef *MessageDef::FindFieldByName(const char *name, | |
2711 size_t len) const { | |
2712 return upb_msgdef_ntof(this, name, len); | |
2713 } | |
2714 inline OneofDef* MessageDef::FindOneofByName(const char* name, size_t len) { | |
2715 return upb_msgdef_ntoo_mutable(this, name, len); | |
2716 } | |
2717 inline const OneofDef* MessageDef::FindOneofByName(const char* name, | |
2718 size_t len) const { | |
2719 return upb_msgdef_ntoo(this, name, len); | |
2720 } | |
2721 inline MessageDef* MessageDef::Dup(const void *owner) const { | |
2722 return upb_msgdef_dup(this, owner); | |
2723 } | |
2724 inline void MessageDef::setmapentry(bool map_entry) { | |
2725 upb_msgdef_setmapentry(this, map_entry); | |
2726 } | |
2727 inline bool MessageDef::mapentry() const { | |
2728 return upb_msgdef_mapentry(this); | |
2729 } | |
2730 inline MessageDef::field_iterator MessageDef::field_begin() { | |
2731 return field_iterator(this); | |
2732 } | |
2733 inline MessageDef::field_iterator MessageDef::field_end() { | |
2734 return field_iterator::end(this); | |
2735 } | |
2736 inline MessageDef::const_field_iterator MessageDef::field_begin() const { | |
2737 return const_field_iterator(this); | |
2738 } | |
2739 inline MessageDef::const_field_iterator MessageDef::field_end() const { | |
2740 return const_field_iterator::end(this); | |
2741 } | |
2742 | |
2743 inline MessageDef::oneof_iterator MessageDef::oneof_begin() { | |
2744 return oneof_iterator(this); | |
2745 } | |
2746 inline MessageDef::oneof_iterator MessageDef::oneof_end() { | |
2747 return oneof_iterator::end(this); | |
2748 } | |
2749 inline MessageDef::const_oneof_iterator MessageDef::oneof_begin() const { | |
2750 return const_oneof_iterator(this); | |
2751 } | |
2752 inline MessageDef::const_oneof_iterator MessageDef::oneof_end() const { | |
2753 return const_oneof_iterator::end(this); | |
2754 } | |
2755 | |
2756 inline MessageDef::field_iterator::field_iterator(MessageDef* md) { | |
2757 upb_msg_field_begin(&iter_, md); | |
2758 } | |
2759 inline MessageDef::field_iterator MessageDef::field_iterator::end( | |
2760 MessageDef* md) { | |
2761 MessageDef::field_iterator iter(md); | |
2762 upb_msg_field_iter_setdone(&iter.iter_); | |
2763 return iter; | |
2764 } | |
2765 inline FieldDef* MessageDef::field_iterator::operator*() const { | |
2766 return upb_msg_iter_field(&iter_); | |
2767 } | |
2768 inline void MessageDef::field_iterator::operator++() { | |
2769 return upb_msg_field_next(&iter_); | |
2770 } | |
2771 inline bool MessageDef::field_iterator::operator==( | |
2772 const field_iterator &other) const { | |
2773 return upb_inttable_iter_isequal(&iter_, &other.iter_); | |
2774 } | |
2775 inline bool MessageDef::field_iterator::operator!=( | |
2776 const field_iterator &other) const { | |
2777 return !(*this == other); | |
2778 } | |
2779 | |
2780 inline MessageDef::const_field_iterator::const_field_iterator( | |
2781 const MessageDef* md) { | |
2782 upb_msg_field_begin(&iter_, md); | |
2783 } | |
2784 inline MessageDef::const_field_iterator MessageDef::const_field_iterator::end( | |
2785 const MessageDef *md) { | |
2786 MessageDef::const_field_iterator iter(md); | |
2787 upb_msg_field_iter_setdone(&iter.iter_); | |
2788 return iter; | |
2789 } | |
2790 inline const FieldDef* MessageDef::const_field_iterator::operator*() const { | |
2791 return upb_msg_iter_field(&iter_); | |
2792 } | |
2793 inline void MessageDef::const_field_iterator::operator++() { | |
2794 return upb_msg_field_next(&iter_); | |
2795 } | |
2796 inline bool MessageDef::const_field_iterator::operator==( | |
2797 const const_field_iterator &other) const { | |
2798 return upb_inttable_iter_isequal(&iter_, &other.iter_); | |
2799 } | |
2800 inline bool MessageDef::const_field_iterator::operator!=( | |
2801 const const_field_iterator &other) const { | |
2802 return !(*this == other); | |
2803 } | |
2804 | |
2805 inline MessageDef::oneof_iterator::oneof_iterator(MessageDef* md) { | |
2806 upb_msg_oneof_begin(&iter_, md); | |
2807 } | |
2808 inline MessageDef::oneof_iterator MessageDef::oneof_iterator::end( | |
2809 MessageDef* md) { | |
2810 MessageDef::oneof_iterator iter(md); | |
2811 upb_msg_oneof_iter_setdone(&iter.iter_); | |
2812 return iter; | |
2813 } | |
2814 inline OneofDef* MessageDef::oneof_iterator::operator*() const { | |
2815 return upb_msg_iter_oneof(&iter_); | |
2816 } | |
2817 inline void MessageDef::oneof_iterator::operator++() { | |
2818 return upb_msg_oneof_next(&iter_); | |
2819 } | |
2820 inline bool MessageDef::oneof_iterator::operator==( | |
2821 const oneof_iterator &other) const { | |
2822 return upb_strtable_iter_isequal(&iter_, &other.iter_); | |
2823 } | |
2824 inline bool MessageDef::oneof_iterator::operator!=( | |
2825 const oneof_iterator &other) const { | |
2826 return !(*this == other); | |
2827 } | |
2828 | |
2829 inline MessageDef::const_oneof_iterator::const_oneof_iterator( | |
2830 const MessageDef* md) { | |
2831 upb_msg_oneof_begin(&iter_, md); | |
2832 } | |
2833 inline MessageDef::const_oneof_iterator MessageDef::const_oneof_iterator::end( | |
2834 const MessageDef *md) { | |
2835 MessageDef::const_oneof_iterator iter(md); | |
2836 upb_msg_oneof_iter_setdone(&iter.iter_); | |
2837 return iter; | |
2838 } | |
2839 inline const OneofDef* MessageDef::const_oneof_iterator::operator*() const { | |
2840 return upb_msg_iter_oneof(&iter_); | |
2841 } | |
2842 inline void MessageDef::const_oneof_iterator::operator++() { | |
2843 return upb_msg_oneof_next(&iter_); | |
2844 } | |
2845 inline bool MessageDef::const_oneof_iterator::operator==( | |
2846 const const_oneof_iterator &other) const { | |
2847 return upb_strtable_iter_isequal(&iter_, &other.iter_); | |
2848 } | |
2849 inline bool MessageDef::const_oneof_iterator::operator!=( | |
2850 const const_oneof_iterator &other) const { | |
2851 return !(*this == other); | |
2852 } | |
2853 | |
2854 inline reffed_ptr<EnumDef> EnumDef::New() { | |
2855 upb_enumdef *e = upb_enumdef_new(&e); | |
2856 return reffed_ptr<EnumDef>(e, &e); | |
2857 } | |
2858 inline const char* EnumDef::full_name() const { | |
2859 return upb_enumdef_fullname(this); | |
2860 } | |
2861 inline bool EnumDef::set_full_name(const char* fullname, Status* s) { | |
2862 return upb_enumdef_setfullname(this, fullname, s); | |
2863 } | |
2864 inline bool EnumDef::set_full_name(const std::string& fullname, Status* s) { | |
2865 return upb_enumdef_setfullname(this, upb_safecstr(fullname), s); | |
2866 } | |
2867 inline bool EnumDef::Freeze(Status* status) { | |
2868 return upb_enumdef_freeze(this, status); | |
2869 } | |
2870 inline int32_t EnumDef::default_value() const { | |
2871 return upb_enumdef_default(this); | |
2872 } | |
2873 inline bool EnumDef::set_default_value(int32_t val, Status* status) { | |
2874 return upb_enumdef_setdefault(this, val, status); | |
2875 } | |
2876 inline int EnumDef::value_count() const { return upb_enumdef_numvals(this); } | |
2877 inline bool EnumDef::AddValue(const char* name, int32_t num, Status* status) { | |
2878 return upb_enumdef_addval(this, name, num, status); | |
2879 } | |
2880 inline bool EnumDef::AddValue(const std::string& name, int32_t num, | |
2881 Status* status) { | |
2882 return upb_enumdef_addval(this, upb_safecstr(name), num, status); | |
2883 } | |
2884 inline bool EnumDef::FindValueByName(const char* name, int32_t *num) const { | |
2885 return upb_enumdef_ntoiz(this, name, num); | |
2886 } | |
2887 inline const char* EnumDef::FindValueByNumber(int32_t num) const { | |
2888 return upb_enumdef_iton(this, num); | |
2889 } | |
2890 inline EnumDef* EnumDef::Dup(const void* owner) const { | |
2891 return upb_enumdef_dup(this, owner); | |
2892 } | |
2893 | |
2894 inline EnumDef::Iterator::Iterator(const EnumDef* e) { | |
2895 upb_enum_begin(&iter_, e); | |
2896 } | |
2897 inline int32_t EnumDef::Iterator::number() { | |
2898 return upb_enum_iter_number(&iter_); | |
2899 } | |
2900 inline const char* EnumDef::Iterator::name() { | |
2901 return upb_enum_iter_name(&iter_); | |
2902 } | |
2903 inline bool EnumDef::Iterator::Done() { return upb_enum_done(&iter_); } | |
2904 inline void EnumDef::Iterator::Next() { return upb_enum_next(&iter_); } | |
2905 | |
2906 inline reffed_ptr<OneofDef> OneofDef::New() { | |
2907 upb_oneofdef *o = upb_oneofdef_new(&o); | |
2908 return reffed_ptr<OneofDef>(o, &o); | |
2909 } | |
2910 inline const char* OneofDef::full_name() const { | |
2911 return upb_oneofdef_name(this); | |
2912 } | |
2913 | |
2914 inline const MessageDef* OneofDef::containing_type() const { | |
2915 return upb_oneofdef_containingtype(this); | |
2916 } | |
2917 inline const char* OneofDef::name() const { | |
2918 return upb_oneofdef_name(this); | |
2919 } | |
2920 inline bool OneofDef::set_name(const char* name, Status* s) { | |
2921 return upb_oneofdef_setname(this, name, s); | |
2922 } | |
2923 inline int OneofDef::field_count() const { | |
2924 return upb_oneofdef_numfields(this); | |
2925 } | |
2926 inline bool OneofDef::AddField(FieldDef* field, Status* s) { | |
2927 return upb_oneofdef_addfield(this, field, NULL, s); | |
2928 } | |
2929 inline bool OneofDef::AddField(const reffed_ptr<FieldDef>& field, Status* s) { | |
2930 return upb_oneofdef_addfield(this, field.get(), NULL, s); | |
2931 } | |
2932 inline const FieldDef* OneofDef::FindFieldByName(const char* name, | |
2933 size_t len) const { | |
2934 return upb_oneofdef_ntof(this, name, len); | |
2935 } | |
2936 inline const FieldDef* OneofDef::FindFieldByNumber(uint32_t num) const { | |
2937 return upb_oneofdef_itof(this, num); | |
2938 } | |
2939 inline OneofDef::iterator OneofDef::begin() { return iterator(this); } | |
2940 inline OneofDef::iterator OneofDef::end() { return iterator::end(this); } | |
2941 inline OneofDef::const_iterator OneofDef::begin() const { | |
2942 return const_iterator(this); | |
2943 } | |
2944 inline OneofDef::const_iterator OneofDef::end() const { | |
2945 return const_iterator::end(this); | |
2946 } | |
2947 | |
2948 inline OneofDef::iterator::iterator(OneofDef* o) { | |
2949 upb_oneof_begin(&iter_, o); | |
2950 } | |
2951 inline OneofDef::iterator OneofDef::iterator::end(OneofDef* o) { | |
2952 OneofDef::iterator iter(o); | |
2953 upb_oneof_iter_setdone(&iter.iter_); | |
2954 return iter; | |
2955 } | |
2956 inline FieldDef* OneofDef::iterator::operator*() const { | |
2957 return upb_oneof_iter_field(&iter_); | |
2958 } | |
2959 inline void OneofDef::iterator::operator++() { return upb_oneof_next(&iter_); } | |
2960 inline bool OneofDef::iterator::operator==(const iterator &other) const { | |
2961 return upb_inttable_iter_isequal(&iter_, &other.iter_); | |
2962 } | |
2963 inline bool OneofDef::iterator::operator!=(const iterator &other) const { | |
2964 return !(*this == other); | |
2965 } | |
2966 | |
2967 inline OneofDef::const_iterator::const_iterator(const OneofDef* md) { | |
2968 upb_oneof_begin(&iter_, md); | |
2969 } | |
2970 inline OneofDef::const_iterator OneofDef::const_iterator::end( | |
2971 const OneofDef *md) { | |
2972 OneofDef::const_iterator iter(md); | |
2973 upb_oneof_iter_setdone(&iter.iter_); | |
2974 return iter; | |
2975 } | |
2976 inline const FieldDef* OneofDef::const_iterator::operator*() const { | |
2977 return upb_msg_iter_field(&iter_); | |
2978 } | |
2979 inline void OneofDef::const_iterator::operator++() { | |
2980 return upb_oneof_next(&iter_); | |
2981 } | |
2982 inline bool OneofDef::const_iterator::operator==( | |
2983 const const_iterator &other) const { | |
2984 return upb_inttable_iter_isequal(&iter_, &other.iter_); | |
2985 } | |
2986 inline bool OneofDef::const_iterator::operator!=( | |
2987 const const_iterator &other) const { | |
2988 return !(*this == other); | |
2989 } | |
2990 | |
2991 } /* namespace upb */ | |
2992 #endif | |
2993 | |
2994 #endif /* UPB_DEF_H_ */ | |
2995 /* | |
2996 ** This file contains definitions of structs that should be considered private | |
2997 ** and NOT stable across versions of upb. | |
2998 ** | |
2999 ** The only reason they are declared here and not in .c files is to allow upb | |
3000 ** and the application (if desired) to embed statically-initialized instances | |
3001 ** of structures like defs. | |
3002 ** | |
3003 ** If you include this file, all guarantees of ABI compatibility go out the | |
3004 ** window! Any code that includes this file needs to recompile against the | |
3005 ** exact same version of upb that they are linking against. | |
3006 ** | |
3007 ** You also need to recompile if you change the value of the UPB_DEBUG_REFS | |
3008 ** flag. | |
3009 */ | |
3010 | |
3011 | |
3012 #ifndef UPB_STATICINIT_H_ | |
3013 #define UPB_STATICINIT_H_ | |
3014 | |
3015 #ifdef __cplusplus | |
3016 /* Because of how we do our typedefs, this header can't be included from C++. */ | |
3017 #error This file cannot be included from C++ | |
3018 #endif | |
3019 | |
3020 /* upb_refcounted *************************************************************/ | |
3021 | |
3022 | |
3023 /* upb_def ********************************************************************/ | |
3024 | |
3025 struct upb_def { | |
3026 upb_refcounted base; | |
3027 | |
3028 const char *fullname; | |
3029 char type; /* A upb_deftype_t (char to save space) */ | |
3030 | |
3031 /* Used as a flag during the def's mutable stage. Must be false unless | |
3032 * it is currently being used by a function on the stack. This allows | |
3033 * us to easily determine which defs were passed into the function's | |
3034 * current invocation. */ | |
3035 bool came_from_user; | |
3036 }; | |
3037 | |
3038 #define UPB_DEF_INIT(name, type, refs, ref2s) \ | |
3039 { UPB_REFCOUNT_INIT(refs, ref2s), name, type, false } | |
3040 | |
3041 | |
3042 /* upb_fielddef ***************************************************************/ | |
3043 | |
3044 struct upb_fielddef { | |
3045 upb_def base; | |
3046 | |
3047 union { | |
3048 int64_t sint; | |
3049 uint64_t uint; | |
3050 double dbl; | |
3051 float flt; | |
3052 void *bytes; | |
3053 } defaultval; | |
3054 union { | |
3055 const upb_msgdef *def; /* If !msg_is_symbolic. */ | |
3056 char *name; /* If msg_is_symbolic. */ | |
3057 } msg; | |
3058 union { | |
3059 const upb_def *def; /* If !subdef_is_symbolic. */ | |
3060 char *name; /* If subdef_is_symbolic. */ | |
3061 } sub; /* The msgdef or enumdef for this field, if upb_hassubdef(f). */ | |
3062 bool subdef_is_symbolic; | |
3063 bool msg_is_symbolic; | |
3064 const upb_oneofdef *oneof; | |
3065 bool default_is_string; | |
3066 bool type_is_set_; /* False until type is explicitly set. */ | |
3067 bool is_extension_; | |
3068 bool lazy_; | |
3069 bool packed_; | |
3070 upb_intfmt_t intfmt; | |
3071 bool tagdelim; | |
3072 upb_fieldtype_t type_; | |
3073 upb_label_t label_; | |
3074 uint32_t number_; | |
3075 uint32_t selector_base; /* Used to index into a upb::Handlers table. */ | |
3076 uint32_t index_; | |
3077 }; | |
3078 | |
3079 #define UPB_FIELDDEF_INIT(label, type, intfmt, tagdelim, is_extension, lazy, \ | |
3080 packed, name, num, msgdef, subdef, selector_base, \ | |
3081 index, defaultval, refs, ref2s) \ | |
3082 { \ | |
3083 UPB_DEF_INIT(name, UPB_DEF_FIELD, refs, ref2s), defaultval, {msgdef}, \ | |
3084 {subdef}, NULL, false, false, \ | |
3085 type == UPB_TYPE_STRING || type == UPB_TYPE_BYTES, true, is_extension, \ | |
3086 lazy, packed, intfmt, tagdelim, type, label, num, selector_base, index \ | |
3087 } | |
3088 | |
3089 | |
3090 /* upb_msgdef *****************************************************************/ | |
3091 | |
3092 struct upb_msgdef { | |
3093 upb_def base; | |
3094 | |
3095 size_t selector_count; | |
3096 uint32_t submsg_field_count; | |
3097 | |
3098 /* Tables for looking up fields by number and name. */ | |
3099 upb_inttable itof; /* int to field */ | |
3100 upb_strtable ntof; /* name to field */ | |
3101 | |
3102 /* Tables for looking up oneofs by name. */ | |
3103 upb_strtable ntoo; /* name to oneof */ | |
3104 | |
3105 /* Is this a map-entry message? | |
3106 * TODO: set this flag properly for static descriptors; regenerate | |
3107 * descriptor.upb.c. */ | |
3108 bool map_entry; | |
3109 | |
3110 /* TODO(haberman): proper extension ranges (there can be multiple). */ | |
3111 }; | |
3112 | |
3113 /* TODO: also support static initialization of the oneofs table. This will be | |
3114 * needed if we compile in descriptors that contain oneofs. */ | |
3115 #define UPB_MSGDEF_INIT(name, selector_count, submsg_field_count, itof, ntof, \ | |
3116 refs, ref2s) \ | |
3117 { \ | |
3118 UPB_DEF_INIT(name, UPB_DEF_MSG, refs, ref2s), selector_count, \ | |
3119 submsg_field_count, itof, ntof, \ | |
3120 UPB_EMPTY_STRTABLE_INIT(UPB_CTYPE_PTR), false \ | |
3121 } | |
3122 | |
3123 | |
3124 /* upb_enumdef ****************************************************************/ | |
3125 | |
3126 struct upb_enumdef { | |
3127 upb_def base; | |
3128 | |
3129 upb_strtable ntoi; | |
3130 upb_inttable iton; | |
3131 int32_t defaultval; | |
3132 }; | |
3133 | |
3134 #define UPB_ENUMDEF_INIT(name, ntoi, iton, defaultval, refs, ref2s) \ | |
3135 { UPB_DEF_INIT(name, UPB_DEF_ENUM, refs, ref2s), ntoi, iton, defaultval } | |
3136 | |
3137 | |
3138 /* upb_oneofdef ***************************************************************/ | |
3139 | |
3140 struct upb_oneofdef { | |
3141 upb_def base; | |
3142 | |
3143 upb_strtable ntof; | |
3144 upb_inttable itof; | |
3145 const upb_msgdef *parent; | |
3146 }; | |
3147 | |
3148 #define UPB_ONEOFDEF_INIT(name, ntof, itof, refs, ref2s) \ | |
3149 { UPB_DEF_INIT(name, UPB_DEF_ENUM, refs, ref2s), ntof, itof } | |
3150 | |
3151 | |
3152 /* upb_symtab *****************************************************************/ | |
3153 | |
3154 struct upb_symtab { | |
3155 upb_refcounted base; | |
3156 | |
3157 upb_strtable symtab; | |
3158 }; | |
3159 | |
3160 #define UPB_SYMTAB_INIT(symtab, refs, ref2s) \ | |
3161 { UPB_REFCOUNT_INIT(refs, ref2s), symtab } | |
3162 | |
3163 | |
3164 #endif /* UPB_STATICINIT_H_ */ | |
3165 /* | |
3166 ** upb::Handlers (upb_handlers) | |
3167 ** | |
3168 ** A upb_handlers is like a virtual table for a upb_msgdef. Each field of the | |
3169 ** message can have associated functions that will be called when we are | |
3170 ** parsing or visiting a stream of data. This is similar to how handlers work | |
3171 ** in SAX (the Simple API for XML). | |
3172 ** | |
3173 ** The handlers have no idea where the data is coming from, so a single set of | |
3174 ** handlers could be used with two completely different data sources (for | |
3175 ** example, a parser and a visitor over in-memory objects). This decoupling is | |
3176 ** the most important feature of upb, because it allows parsers and serializers | |
3177 ** to be highly reusable. | |
3178 ** | |
3179 ** This is a mixed C/C++ interface that offers a full API to both languages. | |
3180 ** See the top-level README for more information. | |
3181 */ | |
3182 | |
3183 #ifndef UPB_HANDLERS_H | |
3184 #define UPB_HANDLERS_H | |
3185 | |
3186 | |
3187 #ifdef __cplusplus | |
3188 namespace upb { | |
3189 class BufferHandle; | |
3190 class BytesHandler; | |
3191 class HandlerAttributes; | |
3192 class Handlers; | |
3193 template <class T> class Handler; | |
3194 template <class T> struct CanonicalType; | |
3195 } /* namespace upb */ | |
3196 #endif | |
3197 | |
3198 UPB_DECLARE_TYPE(upb::BufferHandle, upb_bufhandle) | |
3199 UPB_DECLARE_TYPE(upb::BytesHandler, upb_byteshandler) | |
3200 UPB_DECLARE_TYPE(upb::HandlerAttributes, upb_handlerattr) | |
3201 UPB_DECLARE_DERIVED_TYPE(upb::Handlers, upb::RefCounted, | |
3202 upb_handlers, upb_refcounted) | |
3203 | |
3204 /* The maximum depth that the handler graph can have. This is a resource limit | |
3205 * for the C stack since we sometimes need to recursively traverse the graph. | |
3206 * Cycles are ok; the traversal will stop when it detects a cycle, but we must | |
3207 * hit the cycle before the maximum depth is reached. | |
3208 * | |
3209 * If having a single static limit is too inflexible, we can add another variant | |
3210 * of Handlers::Freeze that allows specifying this as a parameter. */ | |
3211 #define UPB_MAX_HANDLER_DEPTH 64 | |
3212 | |
3213 /* All the different types of handlers that can be registered. | |
3214 * Only needed for the advanced functions in upb::Handlers. */ | |
3215 typedef enum { | |
3216 UPB_HANDLER_INT32, | |
3217 UPB_HANDLER_INT64, | |
3218 UPB_HANDLER_UINT32, | |
3219 UPB_HANDLER_UINT64, | |
3220 UPB_HANDLER_FLOAT, | |
3221 UPB_HANDLER_DOUBLE, | |
3222 UPB_HANDLER_BOOL, | |
3223 UPB_HANDLER_STARTSTR, | |
3224 UPB_HANDLER_STRING, | |
3225 UPB_HANDLER_ENDSTR, | |
3226 UPB_HANDLER_STARTSUBMSG, | |
3227 UPB_HANDLER_ENDSUBMSG, | |
3228 UPB_HANDLER_STARTSEQ, | |
3229 UPB_HANDLER_ENDSEQ | |
3230 } upb_handlertype_t; | |
3231 | |
3232 #define UPB_HANDLER_MAX (UPB_HANDLER_ENDSEQ+1) | |
3233 | |
3234 #define UPB_BREAK NULL | |
3235 | |
3236 /* A convenient definition for when no closure is needed. */ | |
3237 extern char _upb_noclosure; | |
3238 #define UPB_NO_CLOSURE &_upb_noclosure | |
3239 | |
3240 /* A selector refers to a specific field handler in the Handlers object | |
3241 * (for example: the STARTSUBMSG handler for field "field15"). */ | |
3242 typedef int32_t upb_selector_t; | |
3243 | |
3244 UPB_BEGIN_EXTERN_C | |
3245 | |
3246 /* Forward-declares for C inline accessors. We need to declare these here | |
3247 * so we can "friend" them in the class declarations in C++. */ | |
3248 UPB_INLINE upb_func *upb_handlers_gethandler(const upb_handlers *h, | |
3249 upb_selector_t s); | |
3250 UPB_INLINE const void *upb_handlerattr_handlerdata(const upb_handlerattr *attr); | |
3251 UPB_INLINE const void *upb_handlers_gethandlerdata(const upb_handlers *h, | |
3252 upb_selector_t s); | |
3253 | |
3254 UPB_INLINE void upb_bufhandle_init(upb_bufhandle *h); | |
3255 UPB_INLINE void upb_bufhandle_setobj(upb_bufhandle *h, const void *obj, | |
3256 const void *type); | |
3257 UPB_INLINE void upb_bufhandle_setbuf(upb_bufhandle *h, const char *buf, | |
3258 size_t ofs); | |
3259 UPB_INLINE const void *upb_bufhandle_obj(const upb_bufhandle *h); | |
3260 UPB_INLINE const void *upb_bufhandle_objtype(const upb_bufhandle *h); | |
3261 UPB_INLINE const char *upb_bufhandle_buf(const upb_bufhandle *h); | |
3262 | |
3263 UPB_END_EXTERN_C | |
3264 | |
3265 | |
3266 /* Static selectors for upb::Handlers. */ | |
3267 #define UPB_STARTMSG_SELECTOR 0 | |
3268 #define UPB_ENDMSG_SELECTOR 1 | |
3269 #define UPB_STATIC_SELECTOR_COUNT 2 | |
3270 | |
3271 /* Static selectors for upb::BytesHandler. */ | |
3272 #define UPB_STARTSTR_SELECTOR 0 | |
3273 #define UPB_STRING_SELECTOR 1 | |
3274 #define UPB_ENDSTR_SELECTOR 2 | |
3275 | |
3276 typedef void upb_handlerfree(void *d); | |
3277 | |
3278 #ifdef __cplusplus | |
3279 | |
3280 /* A set of attributes that accompanies a handler's function pointer. */ | |
3281 class upb::HandlerAttributes { | |
3282 public: | |
3283 HandlerAttributes(); | |
3284 ~HandlerAttributes(); | |
3285 | |
3286 /* Sets the handler data that will be passed as the second parameter of the | |
3287 * handler. To free this pointer when the handlers are freed, call | |
3288 * Handlers::AddCleanup(). */ | |
3289 bool SetHandlerData(const void *handler_data); | |
3290 const void* handler_data() const; | |
3291 | |
3292 /* Use this to specify the type of the closure. This will be checked against | |
3293 * all other closure types for handler that use the same closure. | |
3294 * Registration will fail if this does not match all other non-NULL closure | |
3295 * types. */ | |
3296 bool SetClosureType(const void *closure_type); | |
3297 const void* closure_type() const; | |
3298 | |
3299 /* Use this to specify the type of the returned closure. Only used for | |
3300 * Start*{String,SubMessage,Sequence} handlers. This must match the closure | |
3301 * type of any handlers that use it (for example, the StringBuf handler must | |
3302 * match the closure returned from StartString). */ | |
3303 bool SetReturnClosureType(const void *return_closure_type); | |
3304 const void* return_closure_type() const; | |
3305 | |
3306 /* Set to indicate that the handler always returns "ok" (either "true" or a | |
3307 * non-NULL closure). This is a hint that can allow code generators to | |
3308 * generate more efficient code. */ | |
3309 bool SetAlwaysOk(bool always_ok); | |
3310 bool always_ok() const; | |
3311 | |
3312 private: | |
3313 friend UPB_INLINE const void * ::upb_handlerattr_handlerdata( | |
3314 const upb_handlerattr *attr); | |
3315 #else | |
3316 struct upb_handlerattr { | |
3317 #endif | |
3318 const void *handler_data_; | |
3319 const void *closure_type_; | |
3320 const void *return_closure_type_; | |
3321 bool alwaysok_; | |
3322 }; | |
3323 | |
3324 #define UPB_HANDLERATTR_INITIALIZER {NULL, NULL, NULL, false} | |
3325 | |
3326 typedef struct { | |
3327 upb_func *func; | |
3328 | |
3329 /* It is wasteful to include the entire attributes here: | |
3330 * | |
3331 * * Some of the information is redundant (like storing the closure type | |
3332 * separately for each handler that must match). | |
3333 * * Some of the info is only needed prior to freeze() (like closure types). | |
3334 * * alignment padding wastes a lot of space for alwaysok_. | |
3335 * | |
3336 * If/when the size and locality of handlers is an issue, we can optimize this | |
3337 * not to store the entire attr like this. We do not expose the table's | |
3338 * layout to allow this optimization in the future. */ | |
3339 upb_handlerattr attr; | |
3340 } upb_handlers_tabent; | |
3341 | |
3342 #ifdef __cplusplus | |
3343 | |
3344 /* Extra information about a buffer that is passed to a StringBuf handler. | |
3345 * TODO(haberman): allow the handle to be pinned so that it will outlive | |
3346 * the handler invocation. */ | |
3347 class upb::BufferHandle { | |
3348 public: | |
3349 BufferHandle(); | |
3350 ~BufferHandle(); | |
3351 | |
3352 /* The beginning of the buffer. This may be different than the pointer | |
3353 * passed to a StringBuf handler because the handler may receive data | |
3354 * that is from the middle or end of a larger buffer. */ | |
3355 const char* buffer() const; | |
3356 | |
3357 /* The offset within the attached object where this buffer begins. Only | |
3358 * meaningful if there is an attached object. */ | |
3359 size_t object_offset() const; | |
3360 | |
3361 /* Note that object_offset is the offset of "buf" within the attached | |
3362 * object. */ | |
3363 void SetBuffer(const char* buf, size_t object_offset); | |
3364 | |
3365 /* The BufferHandle can have an "attached object", which can be used to | |
3366 * tunnel through a pointer to the buffer's underlying representation. */ | |
3367 template <class T> | |
3368 void SetAttachedObject(const T* obj); | |
3369 | |
3370 /* Returns NULL if the attached object is not of this type. */ | |
3371 template <class T> | |
3372 const T* GetAttachedObject() const; | |
3373 | |
3374 private: | |
3375 friend UPB_INLINE void ::upb_bufhandle_init(upb_bufhandle *h); | |
3376 friend UPB_INLINE void ::upb_bufhandle_setobj(upb_bufhandle *h, | |
3377 const void *obj, | |
3378 const void *type); | |
3379 friend UPB_INLINE void ::upb_bufhandle_setbuf(upb_bufhandle *h, | |
3380 const char *buf, size_t ofs); | |
3381 friend UPB_INLINE const void* ::upb_bufhandle_obj(const upb_bufhandle *h); | |
3382 friend UPB_INLINE const void* ::upb_bufhandle_objtype( | |
3383 const upb_bufhandle *h); | |
3384 friend UPB_INLINE const char* ::upb_bufhandle_buf(const upb_bufhandle *h); | |
3385 #else | |
3386 struct upb_bufhandle { | |
3387 #endif | |
3388 const char *buf_; | |
3389 const void *obj_; | |
3390 const void *objtype_; | |
3391 size_t objofs_; | |
3392 }; | |
3393 | |
3394 #ifdef __cplusplus | |
3395 | |
3396 /* A upb::Handlers object represents the set of handlers associated with a | |
3397 * message in the graph of messages. You can think of it as a big virtual | |
3398 * table with functions corresponding to all the events that can fire while | |
3399 * parsing or visiting a message of a specific type. | |
3400 * | |
3401 * Any handlers that are not set behave as if they had successfully consumed | |
3402 * the value. Any unset Start* handlers will propagate their closure to the | |
3403 * inner frame. | |
3404 * | |
3405 * The easiest way to create the *Handler objects needed by the Set* methods is | |
3406 * with the UpbBind() and UpbMakeHandler() macros; see below. */ | |
3407 class upb::Handlers { | |
3408 public: | |
3409 typedef upb_selector_t Selector; | |
3410 typedef upb_handlertype_t Type; | |
3411 | |
3412 typedef Handler<void *(*)(void *, const void *)> StartFieldHandler; | |
3413 typedef Handler<bool (*)(void *, const void *)> EndFieldHandler; | |
3414 typedef Handler<bool (*)(void *, const void *)> StartMessageHandler; | |
3415 typedef Handler<bool (*)(void *, const void *, Status*)> EndMessageHandler; | |
3416 typedef Handler<void *(*)(void *, const void *, size_t)> StartStringHandler; | |
3417 typedef Handler<size_t (*)(void *, const void *, const char *, size_t, | |
3418 const BufferHandle *)> StringHandler; | |
3419 | |
3420 template <class T> struct ValueHandler { | |
3421 typedef Handler<bool(*)(void *, const void *, T)> H; | |
3422 }; | |
3423 | |
3424 typedef ValueHandler<int32_t>::H Int32Handler; | |
3425 typedef ValueHandler<int64_t>::H Int64Handler; | |
3426 typedef ValueHandler<uint32_t>::H UInt32Handler; | |
3427 typedef ValueHandler<uint64_t>::H UInt64Handler; | |
3428 typedef ValueHandler<float>::H FloatHandler; | |
3429 typedef ValueHandler<double>::H DoubleHandler; | |
3430 typedef ValueHandler<bool>::H BoolHandler; | |
3431 | |
3432 /* Any function pointer can be converted to this and converted back to its | |
3433 * correct type. */ | |
3434 typedef void GenericFunction(); | |
3435 | |
3436 typedef void HandlersCallback(const void *closure, upb_handlers *h); | |
3437 | |
3438 /* Returns a new handlers object for the given frozen msgdef. | |
3439 * Returns NULL if memory allocation failed. */ | |
3440 static reffed_ptr<Handlers> New(const MessageDef *m); | |
3441 | |
3442 /* Convenience function for registering a graph of handlers that mirrors the | |
3443 * graph of msgdefs for some message. For "m" and all its children a new set | |
3444 * of handlers will be created and the given callback will be invoked, | |
3445 * allowing the client to register handlers for this message. Note that any | |
3446 * subhandlers set by the callback will be overwritten. */ | |
3447 static reffed_ptr<const Handlers> NewFrozen(const MessageDef *m, | |
3448 HandlersCallback *callback, | |
3449 const void *closure); | |
3450 | |
3451 /* Functionality from upb::RefCounted. */ | |
3452 UPB_REFCOUNTED_CPPMETHODS | |
3453 | |
3454 /* All handler registration functions return bool to indicate success or | |
3455 * failure; details about failures are stored in this status object. If a | |
3456 * failure does occur, it must be cleared before the Handlers are frozen, | |
3457 * otherwise the freeze() operation will fail. The functions may *only* be | |
3458 * used while the Handlers are mutable. */ | |
3459 const Status* status(); | |
3460 void ClearError(); | |
3461 | |
3462 /* Call to freeze these Handlers. Requires that any SubHandlers are already | |
3463 * frozen. For cycles, you must use the static version below and freeze the | |
3464 * whole graph at once. */ | |
3465 bool Freeze(Status* s); | |
3466 | |
3467 /* Freezes the given set of handlers. You may not freeze a handler without | |
3468 * also freezing any handlers they point to. */ | |
3469 static bool Freeze(Handlers*const* handlers, int n, Status* s); | |
3470 static bool Freeze(const std::vector<Handlers*>& handlers, Status* s); | |
3471 | |
3472 /* Returns the msgdef associated with this handlers object. */ | |
3473 const MessageDef* message_def() const; | |
3474 | |
3475 /* Adds the given pointer and function to the list of cleanup functions that | |
3476 * will be run when these handlers are freed. If this pointer has previously | |
3477 * been registered, the function returns false and does nothing. */ | |
3478 bool AddCleanup(void *ptr, upb_handlerfree *cleanup); | |
3479 | |
3480 /* Sets the startmsg handler for the message, which is defined as follows: | |
3481 * | |
3482 * bool startmsg(MyType* closure) { | |
3483 * // Called when the message begins. Returns true if processing should | |
3484 * // continue. | |
3485 * return true; | |
3486 * } | |
3487 */ | |
3488 bool SetStartMessageHandler(const StartMessageHandler& handler); | |
3489 | |
3490 /* Sets the endmsg handler for the message, which is defined as follows: | |
3491 * | |
3492 * bool endmsg(MyType* closure, upb_status *status) { | |
3493 * // Called when processing of this message ends, whether in success or | |
3494 * // failure. "status" indicates the final status of processing, and | |
3495 * // can also be modified in-place to update the final status. | |
3496 * } | |
3497 */ | |
3498 bool SetEndMessageHandler(const EndMessageHandler& handler); | |
3499 | |
3500 /* Sets the value handler for the given field, which is defined as follows | |
3501 * (this is for an int32 field; other field types will pass their native | |
3502 * C/C++ type for "val"): | |
3503 * | |
3504 * bool OnValue(MyClosure* c, const MyHandlerData* d, int32_t val) { | |
3505 * // Called when the field's value is encountered. "d" contains | |
3506 * // whatever data was bound to this field when it was registered. | |
3507 * // Returns true if processing should continue. | |
3508 * return true; | |
3509 * } | |
3510 * | |
3511 * handers->SetInt32Handler(f, UpbBind(OnValue, new MyHandlerData(...))); | |
3512 * | |
3513 * The value type must exactly match f->type(). | |
3514 * For example, a handler that takes an int32_t parameter may only be used for | |
3515 * fields of type UPB_TYPE_INT32 and UPB_TYPE_ENUM. | |
3516 * | |
3517 * Returns false if the handler failed to register; in this case the cleanup | |
3518 * handler (if any) will be called immediately. | |
3519 */ | |
3520 bool SetInt32Handler (const FieldDef* f, const Int32Handler& h); | |
3521 bool SetInt64Handler (const FieldDef* f, const Int64Handler& h); | |
3522 bool SetUInt32Handler(const FieldDef* f, const UInt32Handler& h); | |
3523 bool SetUInt64Handler(const FieldDef* f, const UInt64Handler& h); | |
3524 bool SetFloatHandler (const FieldDef* f, const FloatHandler& h); | |
3525 bool SetDoubleHandler(const FieldDef* f, const DoubleHandler& h); | |
3526 bool SetBoolHandler (const FieldDef* f, const BoolHandler& h); | |
3527 | |
3528 /* Like the previous, but templated on the type on the value (ie. int32). | |
3529 * This is mostly useful to call from other templates. To call this you must | |
3530 * specify the template parameter explicitly, ie: | |
3531 * h->SetValueHandler<T>(f, UpbBind(MyHandler<T>, MyData)); */ | |
3532 template <class T> | |
3533 bool SetValueHandler( | |
3534 const FieldDef *f, | |
3535 const typename ValueHandler<typename CanonicalType<T>::Type>::H& handler); | |
3536 | |
3537 /* Sets handlers for a string field, which are defined as follows: | |
3538 * | |
3539 * MySubClosure* startstr(MyClosure* c, const MyHandlerData* d, | |
3540 * size_t size_hint) { | |
3541 * // Called when a string value begins. The return value indicates the | |
3542 * // closure for the string. "size_hint" indicates the size of the | |
3543 * // string if it is known, however if the string is length-delimited | |
3544 * // and the end-of-string is not available size_hint will be zero. | |
3545 * // This case is indistinguishable from the case where the size is | |
3546 * // known to be zero. | |
3547 * // | |
3548 * // TODO(haberman): is it important to distinguish these cases? | |
3549 * // If we had ssize_t as a type we could make -1 "unknown", but | |
3550 * // ssize_t is POSIX (not ANSI) and therefore less portable. | |
3551 * // In practice I suspect it won't be important to distinguish. | |
3552 * return closure; | |
3553 * } | |
3554 * | |
3555 * size_t str(MyClosure* closure, const MyHandlerData* d, | |
3556 * const char *str, size_t len) { | |
3557 * // Called for each buffer of string data; the multiple physical buffers | |
3558 * // are all part of the same logical string. The return value indicates | |
3559 * // how many bytes were consumed. If this number is less than "len", | |
3560 * // this will also indicate that processing should be halted for now, | |
3561 * // like returning false or UPB_BREAK from any other callback. If | |
3562 * // number is greater than "len", the excess bytes will be skipped over | |
3563 * // and not passed to the callback. | |
3564 * return len; | |
3565 * } | |
3566 * | |
3567 * bool endstr(MyClosure* c, const MyHandlerData* d) { | |
3568 * // Called when a string value ends. Return value indicates whether | |
3569 * // processing should continue. | |
3570 * return true; | |
3571 * } | |
3572 */ | |
3573 bool SetStartStringHandler(const FieldDef* f, const StartStringHandler& h); | |
3574 bool SetStringHandler(const FieldDef* f, const StringHandler& h); | |
3575 bool SetEndStringHandler(const FieldDef* f, const EndFieldHandler& h); | |
3576 | |
3577 /* Sets the startseq handler, which is defined as follows: | |
3578 * | |
3579 * MySubClosure *startseq(MyClosure* c, const MyHandlerData* d) { | |
3580 * // Called when a sequence (repeated field) begins. The returned | |
3581 * // pointer indicates the closure for the sequence (or UPB_BREAK | |
3582 * // to interrupt processing). | |
3583 * return closure; | |
3584 * } | |
3585 * | |
3586 * h->SetStartSequenceHandler(f, UpbBind(startseq, new MyHandlerData(...))); | |
3587 * | |
3588 * Returns "false" if "f" does not belong to this message or is not a | |
3589 * repeated field. | |
3590 */ | |
3591 bool SetStartSequenceHandler(const FieldDef* f, const StartFieldHandler& h); | |
3592 | |
3593 /* Sets the startsubmsg handler for the given field, which is defined as | |
3594 * follows: | |
3595 * | |
3596 * MySubClosure* startsubmsg(MyClosure* c, const MyHandlerData* d) { | |
3597 * // Called when a submessage begins. The returned pointer indicates the | |
3598 * // closure for the sequence (or UPB_BREAK to interrupt processing). | |
3599 * return closure; | |
3600 * } | |
3601 * | |
3602 * h->SetStartSubMessageHandler(f, UpbBind(startsubmsg, | |
3603 * new MyHandlerData(...))); | |
3604 * | |
3605 * Returns "false" if "f" does not belong to this message or is not a | |
3606 * submessage/group field. | |
3607 */ | |
3608 bool SetStartSubMessageHandler(const FieldDef* f, const StartFieldHandler& h); | |
3609 | |
3610 /* Sets the endsubmsg handler for the given field, which is defined as | |
3611 * follows: | |
3612 * | |
3613 * bool endsubmsg(MyClosure* c, const MyHandlerData* d) { | |
3614 * // Called when a submessage ends. Returns true to continue processing. | |
3615 * return true; | |
3616 * } | |
3617 * | |
3618 * Returns "false" if "f" does not belong to this message or is not a | |
3619 * submessage/group field. | |
3620 */ | |
3621 bool SetEndSubMessageHandler(const FieldDef *f, const EndFieldHandler &h); | |
3622 | |
3623 /* Starts the endsubseq handler for the given field, which is defined as | |
3624 * follows: | |
3625 * | |
3626 * bool endseq(MyClosure* c, const MyHandlerData* d) { | |
3627 * // Called when a sequence ends. Returns true continue processing. | |
3628 * return true; | |
3629 * } | |
3630 * | |
3631 * Returns "false" if "f" does not belong to this message or is not a | |
3632 * repeated field. | |
3633 */ | |
3634 bool SetEndSequenceHandler(const FieldDef* f, const EndFieldHandler& h); | |
3635 | |
3636 /* Sets or gets the object that specifies handlers for the given field, which | |
3637 * must be a submessage or group. Returns NULL if no handlers are set. */ | |
3638 bool SetSubHandlers(const FieldDef* f, const Handlers* sub); | |
3639 const Handlers* GetSubHandlers(const FieldDef* f) const; | |
3640 | |
3641 /* Equivalent to GetSubHandlers, but takes the STARTSUBMSG selector for the | |
3642 * field. */ | |
3643 const Handlers* GetSubHandlers(Selector startsubmsg) const; | |
3644 | |
3645 /* A selector refers to a specific field handler in the Handlers object | |
3646 * (for example: the STARTSUBMSG handler for field "field15"). | |
3647 * On success, returns true and stores the selector in "s". | |
3648 * If the FieldDef or Type are invalid, returns false. | |
3649 * The returned selector is ONLY valid for Handlers whose MessageDef | |
3650 * contains this FieldDef. */ | |
3651 static bool GetSelector(const FieldDef* f, Type type, Selector* s); | |
3652 | |
3653 /* Given a START selector of any kind, returns the corresponding END selector.
*/ | |
3654 static Selector GetEndSelector(Selector start_selector); | |
3655 | |
3656 /* Returns the function pointer for this handler. It is the client's | |
3657 * responsibility to cast to the correct function type before calling it. */ | |
3658 GenericFunction* GetHandler(Selector selector); | |
3659 | |
3660 /* Sets the given attributes to the attributes for this selector. */ | |
3661 bool GetAttributes(Selector selector, HandlerAttributes* attr); | |
3662 | |
3663 /* Returns the handler data that was registered with this handler. */ | |
3664 const void* GetHandlerData(Selector selector); | |
3665 | |
3666 /* Could add any of the following functions as-needed, with some minor | |
3667 * implementation changes: | |
3668 * | |
3669 * const FieldDef* GetFieldDef(Selector selector); | |
3670 * static bool IsSequence(Selector selector); */ | |
3671 | |
3672 private: | |
3673 UPB_DISALLOW_POD_OPS(Handlers, upb::Handlers) | |
3674 | |
3675 friend UPB_INLINE GenericFunction *::upb_handlers_gethandler( | |
3676 const upb_handlers *h, upb_selector_t s); | |
3677 friend UPB_INLINE const void *::upb_handlers_gethandlerdata( | |
3678 const upb_handlers *h, upb_selector_t s); | |
3679 #else | |
3680 struct upb_handlers { | |
3681 #endif | |
3682 upb_refcounted base; | |
3683 | |
3684 const upb_msgdef *msg; | |
3685 const upb_handlers **sub; | |
3686 const void *top_closure_type; | |
3687 upb_inttable cleanup_; | |
3688 upb_status status_; /* Used only when mutable. */ | |
3689 upb_handlers_tabent table[1]; /* Dynamically-sized field handler array. */ | |
3690 }; | |
3691 | |
3692 #ifdef __cplusplus | |
3693 | |
3694 namespace upb { | |
3695 | |
3696 /* Convenience macros for creating a Handler object that is wrapped with a | |
3697 * type-safe wrapper function that converts the "void*" parameters/returns | |
3698 * of the underlying C API into nice C++ function. | |
3699 * | |
3700 * Sample usage: | |
3701 * void OnValue1(MyClosure* c, const MyHandlerData* d, int32_t val) { | |
3702 * // do stuff ... | |
3703 * } | |
3704 * | |
3705 * // Handler that doesn't need any data bound to it. | |
3706 * void OnValue2(MyClosure* c, int32_t val) { | |
3707 * // do stuff ... | |
3708 * } | |
3709 * | |
3710 * // Handler that returns bool so it can return failure if necessary. | |
3711 * bool OnValue3(MyClosure* c, int32_t val) { | |
3712 * // do stuff ... | |
3713 * return ok; | |
3714 * } | |
3715 * | |
3716 * // Member function handler. | |
3717 * class MyClosure { | |
3718 * public: | |
3719 * void OnValue(int32_t val) { | |
3720 * // do stuff ... | |
3721 * } | |
3722 * }; | |
3723 * | |
3724 * // Takes ownership of the MyHandlerData. | |
3725 * handlers->SetInt32Handler(f1, UpbBind(OnValue1, new MyHandlerData(...))); | |
3726 * handlers->SetInt32Handler(f2, UpbMakeHandler(OnValue2)); | |
3727 * handlers->SetInt32Handler(f1, UpbMakeHandler(OnValue3)); | |
3728 * handlers->SetInt32Handler(f2, UpbMakeHandler(&MyClosure::OnValue)); | |
3729 */ | |
3730 | |
3731 #ifdef UPB_CXX11 | |
3732 | |
3733 /* In C++11, the "template" disambiguator can appear even outside templates, | |
3734 * so all calls can safely use this pair of macros. */ | |
3735 | |
3736 #define UpbMakeHandler(f) upb::MatchFunc(f).template GetFunc<f>() | |
3737 | |
3738 /* We have to be careful to only evaluate "d" once. */ | |
3739 #define UpbBind(f, d) upb::MatchFunc(f).template GetFunc<f>((d)) | |
3740 | |
3741 #else | |
3742 | |
3743 /* Prior to C++11, the "template" disambiguator may only appear inside a | |
3744 * template, so the regular macro must not use "template" */ | |
3745 | |
3746 #define UpbMakeHandler(f) upb::MatchFunc(f).GetFunc<f>() | |
3747 | |
3748 #define UpbBind(f, d) upb::MatchFunc(f).GetFunc<f>((d)) | |
3749 | |
3750 #endif /* UPB_CXX11 */ | |
3751 | |
3752 /* This macro must be used in C++98 for calls from inside a template. But we | |
3753 * define this variant in all cases; code that wants to be compatible with both | |
3754 * C++98 and C++11 should always use this macro when calling from a template. */ | |
3755 #define UpbMakeHandlerT(f) upb::MatchFunc(f).template GetFunc<f>() | |
3756 | |
3757 /* We have to be careful to only evaluate "d" once. */ | |
3758 #define UpbBindT(f, d) upb::MatchFunc(f).template GetFunc<f>((d)) | |
3759 | |
3760 /* Handler: a struct that contains the (handler, data, deleter) tuple that is | |
3761 * used to register all handlers. Users can Make() these directly but it's | |
3762 * more convenient to use the UpbMakeHandler/UpbBind macros above. */ | |
3763 template <class T> class Handler { | |
3764 public: | |
3765 /* The underlying, handler function signature that upb uses internally. */ | |
3766 typedef T FuncPtr; | |
3767 | |
3768 /* Intentionally implicit. */ | |
3769 template <class F> Handler(F func); | |
3770 ~Handler(); | |
3771 | |
3772 private: | |
3773 void AddCleanup(Handlers* h) const { | |
3774 if (cleanup_func_) { | |
3775 bool ok = h->AddCleanup(cleanup_data_, cleanup_func_); | |
3776 UPB_ASSERT_VAR(ok, ok); | |
3777 } | |
3778 } | |
3779 | |
3780 UPB_DISALLOW_COPY_AND_ASSIGN(Handler) | |
3781 friend class Handlers; | |
3782 FuncPtr handler_; | |
3783 mutable HandlerAttributes attr_; | |
3784 mutable bool registered_; | |
3785 void *cleanup_data_; | |
3786 upb_handlerfree *cleanup_func_; | |
3787 }; | |
3788 | |
3789 } /* namespace upb */ | |
3790 | |
3791 #endif /* __cplusplus */ | |
3792 | |
3793 UPB_BEGIN_EXTERN_C | |
3794 | |
3795 /* Native C API. */ | |
3796 | |
3797 /* Handler function typedefs. */ | |
3798 typedef bool upb_startmsg_handlerfunc(void *c, const void*); | |
3799 typedef bool upb_endmsg_handlerfunc(void *c, const void *, upb_status *status); | |
3800 typedef void* upb_startfield_handlerfunc(void *c, const void *hd); | |
3801 typedef bool upb_endfield_handlerfunc(void *c, const void *hd); | |
3802 typedef bool upb_int32_handlerfunc(void *c, const void *hd, int32_t val); | |
3803 typedef bool upb_int64_handlerfunc(void *c, const void *hd, int64_t val); | |
3804 typedef bool upb_uint32_handlerfunc(void *c, const void *hd, uint32_t val); | |
3805 typedef bool upb_uint64_handlerfunc(void *c, const void *hd, uint64_t val); | |
3806 typedef bool upb_float_handlerfunc(void *c, const void *hd, float val); | |
3807 typedef bool upb_double_handlerfunc(void *c, const void *hd, double val); | |
3808 typedef bool upb_bool_handlerfunc(void *c, const void *hd, bool val); | |
3809 typedef void *upb_startstr_handlerfunc(void *c, const void *hd, | |
3810 size_t size_hint); | |
3811 typedef size_t upb_string_handlerfunc(void *c, const void *hd, const char *buf, | |
3812 size_t n, const upb_bufhandle* handle); | |
3813 | |
3814 /* upb_bufhandle */ | |
3815 size_t upb_bufhandle_objofs(const upb_bufhandle *h); | |
3816 | |
3817 /* upb_handlerattr */ | |
3818 void upb_handlerattr_init(upb_handlerattr *attr); | |
3819 void upb_handlerattr_uninit(upb_handlerattr *attr); | |
3820 | |
3821 bool upb_handlerattr_sethandlerdata(upb_handlerattr *attr, const void *hd); | |
3822 bool upb_handlerattr_setclosuretype(upb_handlerattr *attr, const void *type); | |
3823 const void *upb_handlerattr_closuretype(const upb_handlerattr *attr); | |
3824 bool upb_handlerattr_setreturnclosuretype(upb_handlerattr *attr, | |
3825 const void *type); | |
3826 const void *upb_handlerattr_returnclosuretype(const upb_handlerattr *attr); | |
3827 bool upb_handlerattr_setalwaysok(upb_handlerattr *attr, bool alwaysok); | |
3828 bool upb_handlerattr_alwaysok(const upb_handlerattr *attr); | |
3829 | |
3830 UPB_INLINE const void *upb_handlerattr_handlerdata( | |
3831 const upb_handlerattr *attr) { | |
3832 return attr->handler_data_; | |
3833 } | |
3834 | |
3835 /* upb_handlers */ | |
3836 typedef void upb_handlers_callback(const void *closure, upb_handlers *h); | |
3837 upb_handlers *upb_handlers_new(const upb_msgdef *m, | |
3838 const void *owner); | |
3839 const upb_handlers *upb_handlers_newfrozen(const upb_msgdef *m, | |
3840 const void *owner, | |
3841 upb_handlers_callback *callback, | |
3842 const void *closure); | |
3843 | |
3844 /* Include refcounted methods like upb_handlers_ref(). */ | |
3845 UPB_REFCOUNTED_CMETHODS(upb_handlers, upb_handlers_upcast) | |
3846 | |
3847 const upb_status *upb_handlers_status(upb_handlers *h); | |
3848 void upb_handlers_clearerr(upb_handlers *h); | |
3849 const upb_msgdef *upb_handlers_msgdef(const upb_handlers *h); | |
3850 bool upb_handlers_addcleanup(upb_handlers *h, void *p, upb_handlerfree *hfree); | |
3851 | |
3852 bool upb_handlers_setstartmsg(upb_handlers *h, upb_startmsg_handlerfunc *func, | |
3853 upb_handlerattr *attr); | |
3854 bool upb_handlers_setendmsg(upb_handlers *h, upb_endmsg_handlerfunc *func, | |
3855 upb_handlerattr *attr); | |
3856 bool upb_handlers_setint32(upb_handlers *h, const upb_fielddef *f, | |
3857 upb_int32_handlerfunc *func, upb_handlerattr *attr); | |
3858 bool upb_handlers_setint64(upb_handlers *h, const upb_fielddef *f, | |
3859 upb_int64_handlerfunc *func, upb_handlerattr *attr); | |
3860 bool upb_handlers_setuint32(upb_handlers *h, const upb_fielddef *f, | |
3861 upb_uint32_handlerfunc *func, | |
3862 upb_handlerattr *attr); | |
3863 bool upb_handlers_setuint64(upb_handlers *h, const upb_fielddef *f, | |
3864 upb_uint64_handlerfunc *func, | |
3865 upb_handlerattr *attr); | |
3866 bool upb_handlers_setfloat(upb_handlers *h, const upb_fielddef *f, | |
3867 upb_float_handlerfunc *func, upb_handlerattr *attr); | |
3868 bool upb_handlers_setdouble(upb_handlers *h, const upb_fielddef *f, | |
3869 upb_double_handlerfunc *func, | |
3870 upb_handlerattr *attr); | |
3871 bool upb_handlers_setbool(upb_handlers *h, const upb_fielddef *f, | |
3872 upb_bool_handlerfunc *func, | |
3873 upb_handlerattr *attr); | |
3874 bool upb_handlers_setstartstr(upb_handlers *h, const upb_fielddef *f, | |
3875 upb_startstr_handlerfunc *func, | |
3876 upb_handlerattr *attr); | |
3877 bool upb_handlers_setstring(upb_handlers *h, const upb_fielddef *f, | |
3878 upb_string_handlerfunc *func, | |
3879 upb_handlerattr *attr); | |
3880 bool upb_handlers_setendstr(upb_handlers *h, const upb_fielddef *f, | |
3881 upb_endfield_handlerfunc *func, | |
3882 upb_handlerattr *attr); | |
3883 bool upb_handlers_setstartseq(upb_handlers *h, const upb_fielddef *f, | |
3884 upb_startfield_handlerfunc *func, | |
3885 upb_handlerattr *attr); | |
3886 bool upb_handlers_setstartsubmsg(upb_handlers *h, const upb_fielddef *f, | |
3887 upb_startfield_handlerfunc *func, | |
3888 upb_handlerattr *attr); | |
3889 bool upb_handlers_setendsubmsg(upb_handlers *h, const upb_fielddef *f, | |
3890 upb_endfield_handlerfunc *func, | |
3891 upb_handlerattr *attr); | |
3892 bool upb_handlers_setendseq(upb_handlers *h, const upb_fielddef *f, | |
3893 upb_endfield_handlerfunc *func, | |
3894 upb_handlerattr *attr); | |
3895 | |
3896 bool upb_handlers_setsubhandlers(upb_handlers *h, const upb_fielddef *f, | |
3897 const upb_handlers *sub); | |
3898 const upb_handlers *upb_handlers_getsubhandlers(const upb_handlers *h, | |
3899 const upb_fielddef *f); | |
3900 const upb_handlers *upb_handlers_getsubhandlers_sel(const upb_handlers *h, | |
3901 upb_selector_t sel); | |
3902 | |
3903 UPB_INLINE upb_func *upb_handlers_gethandler(const upb_handlers *h, | |
3904 upb_selector_t s) { | |
3905 return (upb_func *)h->table[s].func; | |
3906 } | |
3907 | |
3908 bool upb_handlers_getattr(const upb_handlers *h, upb_selector_t s, | |
3909 upb_handlerattr *attr); | |
3910 | |
3911 UPB_INLINE const void *upb_handlers_gethandlerdata(const upb_handlers *h, | |
3912 upb_selector_t s) { | |
3913 return upb_handlerattr_handlerdata(&h->table[s].attr); | |
3914 } | |
3915 | |
3916 #ifdef __cplusplus | |
3917 | |
3918 /* Handler types for single fields. | |
3919 * Right now we only have one for TYPE_BYTES but ones for other types | |
3920 * should follow. | |
3921 * | |
3922 * These follow the same handlers protocol for fields of a message. */ | |
3923 class upb::BytesHandler { | |
3924 public: | |
3925 BytesHandler(); | |
3926 ~BytesHandler(); | |
3927 #else | |
3928 struct upb_byteshandler { | |
3929 #endif | |
3930 upb_handlers_tabent table[3]; | |
3931 }; | |
3932 | |
3933 void upb_byteshandler_init(upb_byteshandler *h); | |
3934 | |
3935 /* Caller must ensure that "d" outlives the handlers. | |
3936 * TODO(haberman): should this have a "freeze" operation? It's not necessary | |
3937 * for memory management, but could be useful to force immutability and provide | |
3938 * a convenient moment to verify that all registration succeeded. */ | |
3939 bool upb_byteshandler_setstartstr(upb_byteshandler *h, | |
3940 upb_startstr_handlerfunc *func, void *d); | |
3941 bool upb_byteshandler_setstring(upb_byteshandler *h, | |
3942 upb_string_handlerfunc *func, void *d); | |
3943 bool upb_byteshandler_setendstr(upb_byteshandler *h, | |
3944 upb_endfield_handlerfunc *func, void *d); | |
3945 | |
3946 /* "Static" methods */ | |
3947 bool upb_handlers_freeze(upb_handlers *const *handlers, int n, upb_status *s); | |
3948 upb_handlertype_t upb_handlers_getprimitivehandlertype(const upb_fielddef *f); | |
3949 bool upb_handlers_getselector(const upb_fielddef *f, upb_handlertype_t type, | |
3950 upb_selector_t *s); | |
3951 UPB_INLINE upb_selector_t upb_handlers_getendselector(upb_selector_t start) { | |
3952 return start + 1; | |
3953 } | |
3954 | |
3955 /* Internal-only. */ | |
3956 uint32_t upb_handlers_selectorbaseoffset(const upb_fielddef *f); | |
3957 uint32_t upb_handlers_selectorcount(const upb_fielddef *f); | |
3958 | |
3959 UPB_END_EXTERN_C | |
3960 | |
3961 /* | |
3962 ** Inline definitions for handlers.h, which are particularly long and a bit | |
3963 ** tricky. | |
3964 */ | |
3965 | |
3966 #ifndef UPB_HANDLERS_INL_H_ | |
3967 #define UPB_HANDLERS_INL_H_ | |
3968 | |
3969 #include <limits.h> | |
3970 | |
3971 /* C inline methods. */ | |
3972 | |
3973 /* upb_bufhandle */ | |
3974 UPB_INLINE void upb_bufhandle_init(upb_bufhandle *h) { | |
3975 h->obj_ = NULL; | |
3976 h->objtype_ = NULL; | |
3977 h->buf_ = NULL; | |
3978 h->objofs_ = 0; | |
3979 } | |
3980 UPB_INLINE void upb_bufhandle_uninit(upb_bufhandle *h) { | |
3981 UPB_UNUSED(h); | |
3982 } | |
3983 UPB_INLINE void upb_bufhandle_setobj(upb_bufhandle *h, const void *obj, | |
3984 const void *type) { | |
3985 h->obj_ = obj; | |
3986 h->objtype_ = type; | |
3987 } | |
3988 UPB_INLINE void upb_bufhandle_setbuf(upb_bufhandle *h, const char *buf, | |
3989 size_t ofs) { | |
3990 h->buf_ = buf; | |
3991 h->objofs_ = ofs; | |
3992 } | |
3993 UPB_INLINE const void *upb_bufhandle_obj(const upb_bufhandle *h) { | |
3994 return h->obj_; | |
3995 } | |
3996 UPB_INLINE const void *upb_bufhandle_objtype(const upb_bufhandle *h) { | |
3997 return h->objtype_; | |
3998 } | |
3999 UPB_INLINE const char *upb_bufhandle_buf(const upb_bufhandle *h) { | |
4000 return h->buf_; | |
4001 } | |
4002 | |
4003 | |
4004 #ifdef __cplusplus | |
4005 | |
4006 /* Type detection and typedefs for integer types. | |
4007 * For platforms where there are multiple 32-bit or 64-bit types, we need to be | |
4008 * able to enumerate them so we can properly create overloads for all variants. | |
4009 * | |
4010 * If any platform existed where there were three integer types with the same | |
4011 * size, this would have to become more complicated. For example, short, int, | |
4012 * and long could all be 32-bits. Even more diabolically, short, int, long, | |
4013 * and long long could all be 64 bits and still be standard-compliant. | |
4014 * However, few platforms are this strange, and it's unlikely that upb will be | |
4015 * used on the strangest ones. */ | |
4016 | |
4017 /* Can't count on stdint.h limits like INT32_MAX, because in C++ these are | |
4018 * only defined when __STDC_LIMIT_MACROS are defined before the *first* include | |
4019 * of stdint.h. We can't guarantee that someone else didn't include these first | |
4020 * without defining __STDC_LIMIT_MACROS. */ | |
4021 #define UPB_INT32_MAX 0x7fffffffLL | |
4022 #define UPB_INT32_MIN (-UPB_INT32_MAX - 1) | |
4023 #define UPB_INT64_MAX 0x7fffffffffffffffLL | |
4024 #define UPB_INT64_MIN (-UPB_INT64_MAX - 1) | |
4025 | |
4026 #if INT_MAX == UPB_INT32_MAX && INT_MIN == UPB_INT32_MIN | |
4027 #define UPB_INT_IS_32BITS 1 | |
4028 #endif | |
4029 | |
4030 #if LONG_MAX == UPB_INT32_MAX && LONG_MIN == UPB_INT32_MIN | |
4031 #define UPB_LONG_IS_32BITS 1 | |
4032 #endif | |
4033 | |
4034 #if LONG_MAX == UPB_INT64_MAX && LONG_MIN == UPB_INT64_MIN | |
4035 #define UPB_LONG_IS_64BITS 1 | |
4036 #endif | |
4037 | |
4038 #if LLONG_MAX == UPB_INT64_MAX && LLONG_MIN == UPB_INT64_MIN | |
4039 #define UPB_LLONG_IS_64BITS 1 | |
4040 #endif | |
4041 | |
4042 /* We use macros instead of typedefs so we can undefine them later and avoid | |
4043 * leaking them outside this header file. */ | |
4044 #if UPB_INT_IS_32BITS | |
4045 #define UPB_INT32_T int | |
4046 #define UPB_UINT32_T unsigned int | |
4047 | |
4048 #if UPB_LONG_IS_32BITS | |
4049 #define UPB_TWO_32BIT_TYPES 1 | |
4050 #define UPB_INT32ALT_T long | |
4051 #define UPB_UINT32ALT_T unsigned long | |
4052 #endif /* UPB_LONG_IS_32BITS */ | |
4053 | |
4054 #elif UPB_LONG_IS_32BITS /* && !UPB_INT_IS_32BITS */ | |
4055 #define UPB_INT32_T long | |
4056 #define UPB_UINT32_T unsigned long | |
4057 #endif /* UPB_INT_IS_32BITS */ | |
4058 | |
4059 | |
4060 #if UPB_LONG_IS_64BITS | |
4061 #define UPB_INT64_T long | |
4062 #define UPB_UINT64_T unsigned long | |
4063 | |
4064 #if UPB_LLONG_IS_64BITS | |
4065 #define UPB_TWO_64BIT_TYPES 1 | |
4066 #define UPB_INT64ALT_T long long | |
4067 #define UPB_UINT64ALT_T unsigned long long | |
4068 #endif /* UPB_LLONG_IS_64BITS */ | |
4069 | |
4070 #elif UPB_LLONG_IS_64BITS /* && !UPB_LONG_IS_64BITS */ | |
4071 #define UPB_INT64_T long long | |
4072 #define UPB_UINT64_T unsigned long long | |
4073 #endif /* UPB_LONG_IS_64BITS */ | |
4074 | |
4075 #undef UPB_INT32_MAX | |
4076 #undef UPB_INT32_MIN | |
4077 #undef UPB_INT64_MAX | |
4078 #undef UPB_INT64_MIN | |
4079 #undef UPB_INT_IS_32BITS | |
4080 #undef UPB_LONG_IS_32BITS | |
4081 #undef UPB_LONG_IS_64BITS | |
4082 #undef UPB_LLONG_IS_64BITS | |
4083 | |
4084 | |
4085 namespace upb { | |
4086 | |
4087 typedef void CleanupFunc(void *ptr); | |
4088 | |
4089 /* Template to remove "const" from "const T*" and just return "T*". | |
4090 * | |
4091 * We define a nonsense default because otherwise it will fail to instantiate as | |
4092 * a function parameter type even in cases where we don't expect any caller to | |
4093 * actually match the overload. */ | |
4094 class CouldntRemoveConst {}; | |
4095 template <class T> struct remove_constptr { typedef CouldntRemoveConst type; }; | |
4096 template <class T> struct remove_constptr<const T *> { typedef T *type; }; | |
4097 | |
4098 /* Template that we use below to remove a template specialization from | |
4099 * consideration if it matches a specific type. */ | |
4100 template <class T, class U> struct disable_if_same { typedef void Type; }; | |
4101 template <class T> struct disable_if_same<T, T> {}; | |
4102 | |
4103 template <class T> void DeletePointer(void *p) { delete static_cast<T>(p); } | |
4104 | |
4105 template <class T1, class T2> | |
4106 struct FirstUnlessVoidOrBool { | |
4107 typedef T1 value; | |
4108 }; | |
4109 | |
4110 template <class T2> | |
4111 struct FirstUnlessVoidOrBool<void, T2> { | |
4112 typedef T2 value; | |
4113 }; | |
4114 | |
4115 template <class T2> | |
4116 struct FirstUnlessVoidOrBool<bool, T2> { | |
4117 typedef T2 value; | |
4118 }; | |
4119 | |
4120 template<class T, class U> | |
4121 struct is_same { | |
4122 static bool value; | |
4123 }; | |
4124 | |
4125 template<class T> | |
4126 struct is_same<T, T> { | |
4127 static bool value; | |
4128 }; | |
4129 | |
4130 template<class T, class U> | |
4131 bool is_same<T, U>::value = false; | |
4132 | |
4133 template<class T> | |
4134 bool is_same<T, T>::value = true; | |
4135 | |
4136 /* FuncInfo *******************************************************************/ | |
4137 | |
4138 /* Info about the user's original, pre-wrapped function. */ | |
4139 template <class C, class R = void> | |
4140 struct FuncInfo { | |
4141 /* The type of the closure that the function takes (its first param). */ | |
4142 typedef C Closure; | |
4143 | |
4144 /* The return type. */ | |
4145 typedef R Return; | |
4146 }; | |
4147 | |
4148 /* Func ***********************************************************************/ | |
4149 | |
4150 /* Func1, Func2, Func3: Template classes representing a function and its | |
4151 * signature. | |
4152 * | |
4153 * Since the function is a template parameter, calling the function can be | |
4154 * inlined at compile-time and does not require a function pointer at runtime. | |
4155 * These functions are not bound to a handler data so have no data or cleanup | |
4156 * handler. */ | |
4157 struct UnboundFunc { | |
4158 CleanupFunc *GetCleanup() { return NULL; } | |
4159 void *GetData() { return NULL; } | |
4160 }; | |
4161 | |
4162 template <class R, class P1, R F(P1), class I> | |
4163 struct Func1 : public UnboundFunc { | |
4164 typedef R Return; | |
4165 typedef I FuncInfo; | |
4166 static R Call(P1 p1) { return F(p1); } | |
4167 }; | |
4168 | |
4169 template <class R, class P1, class P2, R F(P1, P2), class I> | |
4170 struct Func2 : public UnboundFunc { | |
4171 typedef R Return; | |
4172 typedef I FuncInfo; | |
4173 static R Call(P1 p1, P2 p2) { return F(p1, p2); } | |
4174 }; | |
4175 | |
4176 template <class R, class P1, class P2, class P3, R F(P1, P2, P3), class I> | |
4177 struct Func3 : public UnboundFunc { | |
4178 typedef R Return; | |
4179 typedef I FuncInfo; | |
4180 static R Call(P1 p1, P2 p2, P3 p3) { return F(p1, p2, p3); } | |
4181 }; | |
4182 | |
4183 template <class R, class P1, class P2, class P3, class P4, R F(P1, P2, P3, P4), | |
4184 class I> | |
4185 struct Func4 : public UnboundFunc { | |
4186 typedef R Return; | |
4187 typedef I FuncInfo; | |
4188 static R Call(P1 p1, P2 p2, P3 p3, P4 p4) { return F(p1, p2, p3, p4); } | |
4189 }; | |
4190 | |
4191 template <class R, class P1, class P2, class P3, class P4, class P5, | |
4192 R F(P1, P2, P3, P4, P5), class I> | |
4193 struct Func5 : public UnboundFunc { | |
4194 typedef R Return; | |
4195 typedef I FuncInfo; | |
4196 static R Call(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) { | |
4197 return F(p1, p2, p3, p4, p5); | |
4198 } | |
4199 }; | |
4200 | |
4201 /* BoundFunc ******************************************************************/ | |
4202 | |
4203 /* BoundFunc2, BoundFunc3: Like Func2/Func3 except also contains a value that | |
4204 * shall be bound to the function's second parameter. | |
4205 * | |
4206 * Note that the second parameter is a const pointer, but our stored bound value | |
4207 * is non-const so we can free it when the handlers are destroyed. */ | |
4208 template <class T> | |
4209 struct BoundFunc { | |
4210 typedef typename remove_constptr<T>::type MutableP2; | |
4211 explicit BoundFunc(MutableP2 data_) : data(data_) {} | |
4212 CleanupFunc *GetCleanup() { return &DeletePointer<MutableP2>; } | |
4213 MutableP2 GetData() { return data; } | |
4214 MutableP2 data; | |
4215 }; | |
4216 | |
4217 template <class R, class P1, class P2, R F(P1, P2), class I> | |
4218 struct BoundFunc2 : public BoundFunc<P2> { | |
4219 typedef BoundFunc<P2> Base; | |
4220 typedef I FuncInfo; | |
4221 explicit BoundFunc2(typename Base::MutableP2 arg) : Base(arg) {} | |
4222 }; | |
4223 | |
4224 template <class R, class P1, class P2, class P3, R F(P1, P2, P3), class I> | |
4225 struct BoundFunc3 : public BoundFunc<P2> { | |
4226 typedef BoundFunc<P2> Base; | |
4227 typedef I FuncInfo; | |
4228 explicit BoundFunc3(typename Base::MutableP2 arg) : Base(arg) {} | |
4229 }; | |
4230 | |
4231 template <class R, class P1, class P2, class P3, class P4, R F(P1, P2, P3, P4), | |
4232 class I> | |
4233 struct BoundFunc4 : public BoundFunc<P2> { | |
4234 typedef BoundFunc<P2> Base; | |
4235 typedef I FuncInfo; | |
4236 explicit BoundFunc4(typename Base::MutableP2 arg) : Base(arg) {} | |
4237 }; | |
4238 | |
4239 template <class R, class P1, class P2, class P3, class P4, class P5, | |
4240 R F(P1, P2, P3, P4, P5), class I> | |
4241 struct BoundFunc5 : public BoundFunc<P2> { | |
4242 typedef BoundFunc<P2> Base; | |
4243 typedef I FuncInfo; | |
4244 explicit BoundFunc5(typename Base::MutableP2 arg) : Base(arg) {} | |
4245 }; | |
4246 | |
4247 /* FuncSig ********************************************************************/ | |
4248 | |
4249 /* FuncSig1, FuncSig2, FuncSig3: template classes reflecting a function | |
4250 * *signature*, but without a specific function attached. | |
4251 * | |
4252 * These classes contain member functions that can be invoked with a | |
4253 * specific function to return a Func/BoundFunc class. */ | |
4254 template <class R, class P1> | |
4255 struct FuncSig1 { | |
4256 template <R F(P1)> | |
4257 Func1<R, P1, F, FuncInfo<P1, R> > GetFunc() { | |
4258 return Func1<R, P1, F, FuncInfo<P1, R> >(); | |
4259 } | |
4260 }; | |
4261 | |
4262 template <class R, class P1, class P2> | |
4263 struct FuncSig2 { | |
4264 template <R F(P1, P2)> | |
4265 Func2<R, P1, P2, F, FuncInfo<P1, R> > GetFunc() { | |
4266 return Func2<R, P1, P2, F, FuncInfo<P1, R> >(); | |
4267 } | |
4268 | |
4269 template <R F(P1, P2)> | |
4270 BoundFunc2<R, P1, P2, F, FuncInfo<P1, R> > GetFunc( | |
4271 typename remove_constptr<P2>::type param2) { | |
4272 return BoundFunc2<R, P1, P2, F, FuncInfo<P1, R> >(param2); | |
4273 } | |
4274 }; | |
4275 | |
4276 template <class R, class P1, class P2, class P3> | |
4277 struct FuncSig3 { | |
4278 template <R F(P1, P2, P3)> | |
4279 Func3<R, P1, P2, P3, F, FuncInfo<P1, R> > GetFunc() { | |
4280 return Func3<R, P1, P2, P3, F, FuncInfo<P1, R> >(); | |
4281 } | |
4282 | |
4283 template <R F(P1, P2, P3)> | |
4284 BoundFunc3<R, P1, P2, P3, F, FuncInfo<P1, R> > GetFunc( | |
4285 typename remove_constptr<P2>::type param2) { | |
4286 return BoundFunc3<R, P1, P2, P3, F, FuncInfo<P1, R> >(param2); | |
4287 } | |
4288 }; | |
4289 | |
4290 template <class R, class P1, class P2, class P3, class P4> | |
4291 struct FuncSig4 { | |
4292 template <R F(P1, P2, P3, P4)> | |
4293 Func4<R, P1, P2, P3, P4, F, FuncInfo<P1, R> > GetFunc() { | |
4294 return Func4<R, P1, P2, P3, P4, F, FuncInfo<P1, R> >(); | |
4295 } | |
4296 | |
4297 template <R F(P1, P2, P3, P4)> | |
4298 BoundFunc4<R, P1, P2, P3, P4, F, FuncInfo<P1, R> > GetFunc( | |
4299 typename remove_constptr<P2>::type param2) { | |
4300 return BoundFunc4<R, P1, P2, P3, P4, F, FuncInfo<P1, R> >(param2); | |
4301 } | |
4302 }; | |
4303 | |
4304 template <class R, class P1, class P2, class P3, class P4, class P5> | |
4305 struct FuncSig5 { | |
4306 template <R F(P1, P2, P3, P4, P5)> | |
4307 Func5<R, P1, P2, P3, P4, P5, F, FuncInfo<P1, R> > GetFunc() { | |
4308 return Func5<R, P1, P2, P3, P4, P5, F, FuncInfo<P1, R> >(); | |
4309 } | |
4310 | |
4311 template <R F(P1, P2, P3, P4, P5)> | |
4312 BoundFunc5<R, P1, P2, P3, P4, P5, F, FuncInfo<P1, R> > GetFunc( | |
4313 typename remove_constptr<P2>::type param2) { | |
4314 return BoundFunc5<R, P1, P2, P3, P4, P5, F, FuncInfo<P1, R> >(param2); | |
4315 } | |
4316 }; | |
4317 | |
4318 /* Overloaded template function that can construct the appropriate FuncSig* | |
4319 * class given a function pointer by deducing the template parameters. */ | |
4320 template <class R, class P1> | |
4321 inline FuncSig1<R, P1> MatchFunc(R (*f)(P1)) { | |
4322 UPB_UNUSED(f); /* Only used for template parameter deduction. */ | |
4323 return FuncSig1<R, P1>(); | |
4324 } | |
4325 | |
4326 template <class R, class P1, class P2> | |
4327 inline FuncSig2<R, P1, P2> MatchFunc(R (*f)(P1, P2)) { | |
4328 UPB_UNUSED(f); /* Only used for template parameter deduction. */ | |
4329 return FuncSig2<R, P1, P2>(); | |
4330 } | |
4331 | |
4332 template <class R, class P1, class P2, class P3> | |
4333 inline FuncSig3<R, P1, P2, P3> MatchFunc(R (*f)(P1, P2, P3)) { | |
4334 UPB_UNUSED(f); /* Only used for template parameter deduction. */ | |
4335 return FuncSig3<R, P1, P2, P3>(); | |
4336 } | |
4337 | |
4338 template <class R, class P1, class P2, class P3, class P4> | |
4339 inline FuncSig4<R, P1, P2, P3, P4> MatchFunc(R (*f)(P1, P2, P3, P4)) { | |
4340 UPB_UNUSED(f); /* Only used for template parameter deduction. */ | |
4341 return FuncSig4<R, P1, P2, P3, P4>(); | |
4342 } | |
4343 | |
4344 template <class R, class P1, class P2, class P3, class P4, class P5> | |
4345 inline FuncSig5<R, P1, P2, P3, P4, P5> MatchFunc(R (*f)(P1, P2, P3, P4, P5)) { | |
4346 UPB_UNUSED(f); /* Only used for template parameter deduction. */ | |
4347 return FuncSig5<R, P1, P2, P3, P4, P5>(); | |
4348 } | |
4349 | |
4350 /* MethodSig ******************************************************************/ | |
4351 | |
4352 /* CallMethod*: a function template that calls a given method. */ | |
4353 template <class R, class C, R (C::*F)()> | |
4354 R CallMethod0(C *obj) { | |
4355 return ((*obj).*F)(); | |
4356 } | |
4357 | |
4358 template <class R, class C, class P1, R (C::*F)(P1)> | |
4359 R CallMethod1(C *obj, P1 arg1) { | |
4360 return ((*obj).*F)(arg1); | |
4361 } | |
4362 | |
4363 template <class R, class C, class P1, class P2, R (C::*F)(P1, P2)> | |
4364 R CallMethod2(C *obj, P1 arg1, P2 arg2) { | |
4365 return ((*obj).*F)(arg1, arg2); | |
4366 } | |
4367 | |
4368 template <class R, class C, class P1, class P2, class P3, R (C::*F)(P1, P2, P3)> | |
4369 R CallMethod3(C *obj, P1 arg1, P2 arg2, P3 arg3) { | |
4370 return ((*obj).*F)(arg1, arg2, arg3); | |
4371 } | |
4372 | |
4373 template <class R, class C, class P1, class P2, class P3, class P4, | |
4374 R (C::*F)(P1, P2, P3, P4)> | |
4375 R CallMethod4(C *obj, P1 arg1, P2 arg2, P3 arg3, P4 arg4) { | |
4376 return ((*obj).*F)(arg1, arg2, arg3, arg4); | |
4377 } | |
4378 | |
4379 /* MethodSig: like FuncSig, but for member functions. | |
4380 * | |
4381 * GetFunc() returns a normal FuncN object, so after calling GetFunc() no | |
4382 * more logic is required to special-case methods. */ | |
4383 template <class R, class C> | |
4384 struct MethodSig0 { | |
4385 template <R (C::*F)()> | |
4386 Func1<R, C *, CallMethod0<R, C, F>, FuncInfo<C *, R> > GetFunc() { | |
4387 return Func1<R, C *, CallMethod0<R, C, F>, FuncInfo<C *, R> >(); | |
4388 } | |
4389 }; | |
4390 | |
4391 template <class R, class C, class P1> | |
4392 struct MethodSig1 { | |
4393 template <R (C::*F)(P1)> | |
4394 Func2<R, C *, P1, CallMethod1<R, C, P1, F>, FuncInfo<C *, R> > GetFunc() { | |
4395 return Func2<R, C *, P1, CallMethod1<R, C, P1, F>, FuncInfo<C *, R> >(); | |
4396 } | |
4397 | |
4398 template <R (C::*F)(P1)> | |
4399 BoundFunc2<R, C *, P1, CallMethod1<R, C, P1, F>, FuncInfo<C *, R> > GetFunc( | |
4400 typename remove_constptr<P1>::type param1) { | |
4401 return BoundFunc2<R, C *, P1, CallMethod1<R, C, P1, F>, FuncInfo<C *, R> >( | |
4402 param1); | |
4403 } | |
4404 }; | |
4405 | |
4406 template <class R, class C, class P1, class P2> | |
4407 struct MethodSig2 { | |
4408 template <R (C::*F)(P1, P2)> | |
4409 Func3<R, C *, P1, P2, CallMethod2<R, C, P1, P2, F>, FuncInfo<C *, R> > | |
4410 GetFunc() { | |
4411 return Func3<R, C *, P1, P2, CallMethod2<R, C, P1, P2, F>, | |
4412 FuncInfo<C *, R> >(); | |
4413 } | |
4414 | |
4415 template <R (C::*F)(P1, P2)> | |
4416 BoundFunc3<R, C *, P1, P2, CallMethod2<R, C, P1, P2, F>, FuncInfo<C *, R> > | |
4417 GetFunc(typename remove_constptr<P1>::type param1) { | |
4418 return BoundFunc3<R, C *, P1, P2, CallMethod2<R, C, P1, P2, F>, | |
4419 FuncInfo<C *, R> >(param1); | |
4420 } | |
4421 }; | |
4422 | |
4423 template <class R, class C, class P1, class P2, class P3> | |
4424 struct MethodSig3 { | |
4425 template <R (C::*F)(P1, P2, P3)> | |
4426 Func4<R, C *, P1, P2, P3, CallMethod3<R, C, P1, P2, P3, F>, FuncInfo<C *, R> > | |
4427 GetFunc() { | |
4428 return Func4<R, C *, P1, P2, P3, CallMethod3<R, C, P1, P2, P3, F>, | |
4429 FuncInfo<C *, R> >(); | |
4430 } | |
4431 | |
4432 template <R (C::*F)(P1, P2, P3)> | |
4433 BoundFunc4<R, C *, P1, P2, P3, CallMethod3<R, C, P1, P2, P3, F>, | |
4434 FuncInfo<C *, R> > | |
4435 GetFunc(typename remove_constptr<P1>::type param1) { | |
4436 return BoundFunc4<R, C *, P1, P2, P3, CallMethod3<R, C, P1, P2, P3, F>, | |
4437 FuncInfo<C *, R> >(param1); | |
4438 } | |
4439 }; | |
4440 | |
4441 template <class R, class C, class P1, class P2, class P3, class P4> | |
4442 struct MethodSig4 { | |
4443 template <R (C::*F)(P1, P2, P3, P4)> | |
4444 Func5<R, C *, P1, P2, P3, P4, CallMethod4<R, C, P1, P2, P3, P4, F>, | |
4445 FuncInfo<C *, R> > | |
4446 GetFunc() { | |
4447 return Func5<R, C *, P1, P2, P3, P4, CallMethod4<R, C, P1, P2, P3, P4, F>, | |
4448 FuncInfo<C *, R> >(); | |
4449 } | |
4450 | |
4451 template <R (C::*F)(P1, P2, P3, P4)> | |
4452 BoundFunc5<R, C *, P1, P2, P3, P4, CallMethod4<R, C, P1, P2, P3, P4, F>, | |
4453 FuncInfo<C *, R> > | |
4454 GetFunc(typename remove_constptr<P1>::type param1) { | |
4455 return BoundFunc5<R, C *, P1, P2, P3, P4, | |
4456 CallMethod4<R, C, P1, P2, P3, P4, F>, FuncInfo<C *, R> >( | |
4457 param1); | |
4458 } | |
4459 }; | |
4460 | |
4461 template <class R, class C> | |
4462 inline MethodSig0<R, C> MatchFunc(R (C::*f)()) { | |
4463 UPB_UNUSED(f); /* Only used for template parameter deduction. */ | |
4464 return MethodSig0<R, C>(); | |
4465 } | |
4466 | |
4467 template <class R, class C, class P1> | |
4468 inline MethodSig1<R, C, P1> MatchFunc(R (C::*f)(P1)) { | |
4469 UPB_UNUSED(f); /* Only used for template parameter deduction. */ | |
4470 return MethodSig1<R, C, P1>(); | |
4471 } | |
4472 | |
4473 template <class R, class C, class P1, class P2> | |
4474 inline MethodSig2<R, C, P1, P2> MatchFunc(R (C::*f)(P1, P2)) { | |
4475 UPB_UNUSED(f); /* Only used for template parameter deduction. */ | |
4476 return MethodSig2<R, C, P1, P2>(); | |
4477 } | |
4478 | |
4479 template <class R, class C, class P1, class P2, class P3> | |
4480 inline MethodSig3<R, C, P1, P2, P3> MatchFunc(R (C::*f)(P1, P2, P3)) { | |
4481 UPB_UNUSED(f); /* Only used for template parameter deduction. */ | |
4482 return MethodSig3<R, C, P1, P2, P3>(); | |
4483 } | |
4484 | |
4485 template <class R, class C, class P1, class P2, class P3, class P4> | |
4486 inline MethodSig4<R, C, P1, P2, P3, P4> MatchFunc(R (C::*f)(P1, P2, P3, P4)) { | |
4487 UPB_UNUSED(f); /* Only used for template parameter deduction. */ | |
4488 return MethodSig4<R, C, P1, P2, P3, P4>(); | |
4489 } | |
4490 | |
4491 /* MaybeWrapReturn ************************************************************/ | |
4492 | |
4493 /* Template class that attempts to wrap the return value of the function so it | |
4494 * matches the expected type. There are two main adjustments it may make: | |
4495 * | |
4496 * 1. If the function returns void, make it return the expected type and with | |
4497 * a value that always indicates success. | |
4498 * 2. If the function returns bool, make it return the expected type with a | |
4499 * value that indicates success or failure. | |
4500 * | |
4501 * The "expected type" for return is: | |
4502 * 1. void* for start handlers. If the closure parameter has a different type | |
4503 * we will cast it to void* for the return in the success case. | |
4504 * 2. size_t for string buffer handlers. | |
4505 * 3. bool for everything else. */ | |
4506 | |
4507 /* Template parameters are FuncN type and desired return type. */ | |
4508 template <class F, class R, class Enable = void> | |
4509 struct MaybeWrapReturn; | |
4510 | |
4511 /* If the return type matches, return the given function unwrapped. */ | |
4512 template <class F> | |
4513 struct MaybeWrapReturn<F, typename F::Return> { | |
4514 typedef F Func; | |
4515 }; | |
4516 | |
4517 /* Function wrapper that munges the return value from void to (bool)true. */ | |
4518 template <class P1, class P2, void F(P1, P2)> | |
4519 bool ReturnTrue2(P1 p1, P2 p2) { | |
4520 F(p1, p2); | |
4521 return true; | |
4522 } | |
4523 | |
4524 template <class P1, class P2, class P3, void F(P1, P2, P3)> | |
4525 bool ReturnTrue3(P1 p1, P2 p2, P3 p3) { | |
4526 F(p1, p2, p3); | |
4527 return true; | |
4528 } | |
4529 | |
4530 /* Function wrapper that munges the return value from void to (void*)arg1 */ | |
4531 template <class P1, class P2, void F(P1, P2)> | |
4532 void *ReturnClosure2(P1 p1, P2 p2) { | |
4533 F(p1, p2); | |
4534 return p1; | |
4535 } | |
4536 | |
4537 template <class P1, class P2, class P3, void F(P1, P2, P3)> | |
4538 void *ReturnClosure3(P1 p1, P2 p2, P3 p3) { | |
4539 F(p1, p2, p3); | |
4540 return p1; | |
4541 } | |
4542 | |
4543 /* Function wrapper that munges the return value from R to void*. */ | |
4544 template <class R, class P1, class P2, R F(P1, P2)> | |
4545 void *CastReturnToVoidPtr2(P1 p1, P2 p2) { | |
4546 return F(p1, p2); | |
4547 } | |
4548 | |
4549 template <class R, class P1, class P2, class P3, R F(P1, P2, P3)> | |
4550 void *CastReturnToVoidPtr3(P1 p1, P2 p2, P3 p3) { | |
4551 return F(p1, p2, p3); | |
4552 } | |
4553 | |
4554 /* Function wrapper that munges the return value from bool to void*. */ | |
4555 template <class P1, class P2, bool F(P1, P2)> | |
4556 void *ReturnClosureOrBreak2(P1 p1, P2 p2) { | |
4557 return F(p1, p2) ? p1 : UPB_BREAK; | |
4558 } | |
4559 | |
4560 template <class P1, class P2, class P3, bool F(P1, P2, P3)> | |
4561 void *ReturnClosureOrBreak3(P1 p1, P2 p2, P3 p3) { | |
4562 return F(p1, p2, p3) ? p1 : UPB_BREAK; | |
4563 } | |
4564 | |
4565 /* For the string callback, which takes five params, returns the size param. */ | |
4566 template <class P1, class P2, | |
4567 void F(P1, P2, const char *, size_t, const BufferHandle *)> | |
4568 size_t ReturnStringLen(P1 p1, P2 p2, const char *p3, size_t p4, | |
4569 const BufferHandle *p5) { | |
4570 F(p1, p2, p3, p4, p5); | |
4571 return p4; | |
4572 } | |
4573 | |
4574 /* For the string callback, which takes five params, returns the size param or | |
4575 * zero. */ | |
4576 template <class P1, class P2, | |
4577 bool F(P1, P2, const char *, size_t, const BufferHandle *)> | |
4578 size_t ReturnNOr0(P1 p1, P2 p2, const char *p3, size_t p4, | |
4579 const BufferHandle *p5) { | |
4580 return F(p1, p2, p3, p4, p5) ? p4 : 0; | |
4581 } | |
4582 | |
4583 /* If we have a function returning void but want a function returning bool, wrap | |
4584 * it in a function that returns true. */ | |
4585 template <class P1, class P2, void F(P1, P2), class I> | |
4586 struct MaybeWrapReturn<Func2<void, P1, P2, F, I>, bool> { | |
4587 typedef Func2<bool, P1, P2, ReturnTrue2<P1, P2, F>, I> Func; | |
4588 }; | |
4589 | |
4590 template <class P1, class P2, class P3, void F(P1, P2, P3), class I> | |
4591 struct MaybeWrapReturn<Func3<void, P1, P2, P3, F, I>, bool> { | |
4592 typedef Func3<bool, P1, P2, P3, ReturnTrue3<P1, P2, P3, F>, I> Func; | |
4593 }; | |
4594 | |
4595 /* If our function returns void but we want one returning void*, wrap it in a | |
4596 * function that returns the first argument. */ | |
4597 template <class P1, class P2, void F(P1, P2), class I> | |
4598 struct MaybeWrapReturn<Func2<void, P1, P2, F, I>, void *> { | |
4599 typedef Func2<void *, P1, P2, ReturnClosure2<P1, P2, F>, I> Func; | |
4600 }; | |
4601 | |
4602 template <class P1, class P2, class P3, void F(P1, P2, P3), class I> | |
4603 struct MaybeWrapReturn<Func3<void, P1, P2, P3, F, I>, void *> { | |
4604 typedef Func3<void *, P1, P2, P3, ReturnClosure3<P1, P2, P3, F>, I> Func; | |
4605 }; | |
4606 | |
4607 /* If our function returns R* but we want one returning void*, wrap it in a | |
4608 * function that casts to void*. */ | |
4609 template <class R, class P1, class P2, R *F(P1, P2), class I> | |
4610 struct MaybeWrapReturn<Func2<R *, P1, P2, F, I>, void *, | |
4611 typename disable_if_same<R *, void *>::Type> { | |
4612 typedef Func2<void *, P1, P2, CastReturnToVoidPtr2<R *, P1, P2, F>, I> Func; | |
4613 }; | |
4614 | |
4615 template <class R, class P1, class P2, class P3, R *F(P1, P2, P3), class I> | |
4616 struct MaybeWrapReturn<Func3<R *, P1, P2, P3, F, I>, void *, | |
4617 typename disable_if_same<R *, void *>::Type> { | |
4618 typedef Func3<void *, P1, P2, P3, CastReturnToVoidPtr3<R *, P1, P2, P3, F>, I> | |
4619 Func; | |
4620 }; | |
4621 | |
4622 /* If our function returns bool but we want one returning void*, wrap it in a | |
4623 * function that returns either the first param or UPB_BREAK. */ | |
4624 template <class P1, class P2, bool F(P1, P2), class I> | |
4625 struct MaybeWrapReturn<Func2<bool, P1, P2, F, I>, void *> { | |
4626 typedef Func2<void *, P1, P2, ReturnClosureOrBreak2<P1, P2, F>, I> Func; | |
4627 }; | |
4628 | |
4629 template <class P1, class P2, class P3, bool F(P1, P2, P3), class I> | |
4630 struct MaybeWrapReturn<Func3<bool, P1, P2, P3, F, I>, void *> { | |
4631 typedef Func3<void *, P1, P2, P3, ReturnClosureOrBreak3<P1, P2, P3, F>, I> | |
4632 Func; | |
4633 }; | |
4634 | |
4635 /* If our function returns void but we want one returning size_t, wrap it in a | |
4636 * function that returns the size argument. */ | |
4637 template <class P1, class P2, | |
4638 void F(P1, P2, const char *, size_t, const BufferHandle *), class I> | |
4639 struct MaybeWrapReturn< | |
4640 Func5<void, P1, P2, const char *, size_t, const BufferHandle *, F, I>, | |
4641 size_t> { | |
4642 typedef Func5<size_t, P1, P2, const char *, size_t, const BufferHandle *, | |
4643 ReturnStringLen<P1, P2, F>, I> Func; | |
4644 }; | |
4645 | |
4646 /* If our function returns bool but we want one returning size_t, wrap it in a | |
4647 * function that returns either 0 or the buf size. */ | |
4648 template <class P1, class P2, | |
4649 bool F(P1, P2, const char *, size_t, const BufferHandle *), class I> | |
4650 struct MaybeWrapReturn< | |
4651 Func5<bool, P1, P2, const char *, size_t, const BufferHandle *, F, I>, | |
4652 size_t> { | |
4653 typedef Func5<size_t, P1, P2, const char *, size_t, const BufferHandle *, | |
4654 ReturnNOr0<P1, P2, F>, I> Func; | |
4655 }; | |
4656 | |
4657 /* ConvertParams **************************************************************/ | |
4658 | |
4659 /* Template class that converts the function parameters if necessary, and | |
4660 * ignores the HandlerData parameter if appropriate. | |
4661 * | |
4662 * Template parameter is the are FuncN function type. */ | |
4663 template <class F, class T> | |
4664 struct ConvertParams; | |
4665 | |
4666 /* Function that discards the handler data parameter. */ | |
4667 template <class R, class P1, R F(P1)> | |
4668 R IgnoreHandlerData2(void *p1, const void *hd) { | |
4669 UPB_UNUSED(hd); | |
4670 return F(static_cast<P1>(p1)); | |
4671 } | |
4672 | |
4673 template <class R, class P1, class P2Wrapper, class P2Wrapped, | |
4674 R F(P1, P2Wrapped)> | |
4675 R IgnoreHandlerData3(void *p1, const void *hd, P2Wrapper p2) { | |
4676 UPB_UNUSED(hd); | |
4677 return F(static_cast<P1>(p1), p2); | |
4678 } | |
4679 | |
4680 template <class R, class P1, class P2, class P3, R F(P1, P2, P3)> | |
4681 R IgnoreHandlerData4(void *p1, const void *hd, P2 p2, P3 p3) { | |
4682 UPB_UNUSED(hd); | |
4683 return F(static_cast<P1>(p1), p2, p3); | |
4684 } | |
4685 | |
4686 template <class R, class P1, class P2, class P3, class P4, R F(P1, P2, P3, P4)> | |
4687 R IgnoreHandlerData5(void *p1, const void *hd, P2 p2, P3 p3, P4 p4) { | |
4688 UPB_UNUSED(hd); | |
4689 return F(static_cast<P1>(p1), p2, p3, p4); | |
4690 } | |
4691 | |
4692 template <class R, class P1, R F(P1, const char*, size_t)> | |
4693 R IgnoreHandlerDataIgnoreHandle(void *p1, const void *hd, const char *p2, | |
4694 size_t p3, const BufferHandle *handle) { | |
4695 UPB_UNUSED(hd); | |
4696 UPB_UNUSED(handle); | |
4697 return F(static_cast<P1>(p1), p2, p3); | |
4698 } | |
4699 | |
4700 /* Function that casts the handler data parameter. */ | |
4701 template <class R, class P1, class P2, R F(P1, P2)> | |
4702 R CastHandlerData2(void *c, const void *hd) { | |
4703 return F(static_cast<P1>(c), static_cast<P2>(hd)); | |
4704 } | |
4705 | |
4706 template <class R, class P1, class P2, class P3Wrapper, class P3Wrapped, | |
4707 R F(P1, P2, P3Wrapped)> | |
4708 R CastHandlerData3(void *c, const void *hd, P3Wrapper p3) { | |
4709 return F(static_cast<P1>(c), static_cast<P2>(hd), p3); | |
4710 } | |
4711 | |
4712 template <class R, class P1, class P2, class P3, class P4, class P5, | |
4713 R F(P1, P2, P3, P4, P5)> | |
4714 R CastHandlerData5(void *c, const void *hd, P3 p3, P4 p4, P5 p5) { | |
4715 return F(static_cast<P1>(c), static_cast<P2>(hd), p3, p4, p5); | |
4716 } | |
4717 | |
4718 template <class R, class P1, class P2, R F(P1, P2, const char *, size_t)> | |
4719 R CastHandlerDataIgnoreHandle(void *c, const void *hd, const char *p3, | |
4720 size_t p4, const BufferHandle *handle) { | |
4721 UPB_UNUSED(handle); | |
4722 return F(static_cast<P1>(c), static_cast<P2>(hd), p3, p4); | |
4723 } | |
4724 | |
4725 /* For unbound functions, ignore the handler data. */ | |
4726 template <class R, class P1, R F(P1), class I, class T> | |
4727 struct ConvertParams<Func1<R, P1, F, I>, T> { | |
4728 typedef Func2<R, void *, const void *, IgnoreHandlerData2<R, P1, F>, I> Func; | |
4729 }; | |
4730 | |
4731 template <class R, class P1, class P2, R F(P1, P2), class I, | |
4732 class R2, class P1_2, class P2_2, class P3_2> | |
4733 struct ConvertParams<Func2<R, P1, P2, F, I>, | |
4734 R2 (*)(P1_2, P2_2, P3_2)> { | |
4735 typedef Func3<R, void *, const void *, P3_2, | |
4736 IgnoreHandlerData3<R, P1, P3_2, P2, F>, I> Func; | |
4737 }; | |
4738 | |
4739 /* For StringBuffer only; this ignores both the handler data and the | |
4740 * BufferHandle. */ | |
4741 template <class R, class P1, R F(P1, const char *, size_t), class I, class T> | |
4742 struct ConvertParams<Func3<R, P1, const char *, size_t, F, I>, T> { | |
4743 typedef Func5<R, void *, const void *, const char *, size_t, | |
4744 const BufferHandle *, IgnoreHandlerDataIgnoreHandle<R, P1, F>, | |
4745 I> Func; | |
4746 }; | |
4747 | |
4748 template <class R, class P1, class P2, class P3, class P4, R F(P1, P2, P3, P4), | |
4749 class I, class T> | |
4750 struct ConvertParams<Func4<R, P1, P2, P3, P4, F, I>, T> { | |
4751 typedef Func5<R, void *, const void *, P2, P3, P4, | |
4752 IgnoreHandlerData5<R, P1, P2, P3, P4, F>, I> Func; | |
4753 }; | |
4754 | |
4755 /* For bound functions, cast the handler data. */ | |
4756 template <class R, class P1, class P2, R F(P1, P2), class I, class T> | |
4757 struct ConvertParams<BoundFunc2<R, P1, P2, F, I>, T> { | |
4758 typedef Func2<R, void *, const void *, CastHandlerData2<R, P1, P2, F>, I> | |
4759 Func; | |
4760 }; | |
4761 | |
4762 template <class R, class P1, class P2, class P3, R F(P1, P2, P3), class I, | |
4763 class R2, class P1_2, class P2_2, class P3_2> | |
4764 struct ConvertParams<BoundFunc3<R, P1, P2, P3, F, I>, | |
4765 R2 (*)(P1_2, P2_2, P3_2)> { | |
4766 typedef Func3<R, void *, const void *, P3_2, | |
4767 CastHandlerData3<R, P1, P2, P3_2, P3, F>, I> Func; | |
4768 }; | |
4769 | |
4770 /* For StringBuffer only; this ignores the BufferHandle. */ | |
4771 template <class R, class P1, class P2, R F(P1, P2, const char *, size_t), | |
4772 class I, class T> | |
4773 struct ConvertParams<BoundFunc4<R, P1, P2, const char *, size_t, F, I>, T> { | |
4774 typedef Func5<R, void *, const void *, const char *, size_t, | |
4775 const BufferHandle *, CastHandlerDataIgnoreHandle<R, P1, P2, F>, | |
4776 I> Func; | |
4777 }; | |
4778 | |
4779 template <class R, class P1, class P2, class P3, class P4, class P5, | |
4780 R F(P1, P2, P3, P4, P5), class I, class T> | |
4781 struct ConvertParams<BoundFunc5<R, P1, P2, P3, P4, P5, F, I>, T> { | |
4782 typedef Func5<R, void *, const void *, P3, P4, P5, | |
4783 CastHandlerData5<R, P1, P2, P3, P4, P5, F>, I> Func; | |
4784 }; | |
4785 | |
4786 /* utype/ltype are upper/lower-case, ctype is canonical C type, vtype is | |
4787 * variant C type. */ | |
4788 #define TYPE_METHODS(utype, ltype, ctype, vtype) \ | |
4789 template <> struct CanonicalType<vtype> { \ | |
4790 typedef ctype Type; \ | |
4791 }; \ | |
4792 template <> \ | |
4793 inline bool Handlers::SetValueHandler<vtype>( \ | |
4794 const FieldDef *f, \ | |
4795 const Handlers::utype ## Handler& handler) { \ | |
4796 assert(!handler.registered_); \ | |
4797 handler.AddCleanup(this); \ | |
4798 handler.registered_ = true; \ | |
4799 return upb_handlers_set##ltype(this, f, handler.handler_, &handler.attr_); \ | |
4800 } \ | |
4801 | |
4802 TYPE_METHODS(Double, double, double, double) | |
4803 TYPE_METHODS(Float, float, float, float) | |
4804 TYPE_METHODS(UInt64, uint64, uint64_t, UPB_UINT64_T) | |
4805 TYPE_METHODS(UInt32, uint32, uint32_t, UPB_UINT32_T) | |
4806 TYPE_METHODS(Int64, int64, int64_t, UPB_INT64_T) | |
4807 TYPE_METHODS(Int32, int32, int32_t, UPB_INT32_T) | |
4808 TYPE_METHODS(Bool, bool, bool, bool) | |
4809 | |
4810 #ifdef UPB_TWO_32BIT_TYPES | |
4811 TYPE_METHODS(Int32, int32, int32_t, UPB_INT32ALT_T) | |
4812 TYPE_METHODS(UInt32, uint32, uint32_t, UPB_UINT32ALT_T) | |
4813 #endif | |
4814 | |
4815 #ifdef UPB_TWO_64BIT_TYPES | |
4816 TYPE_METHODS(Int64, int64, int64_t, UPB_INT64ALT_T) | |
4817 TYPE_METHODS(UInt64, uint64, uint64_t, UPB_UINT64ALT_T) | |
4818 #endif | |
4819 #undef TYPE_METHODS | |
4820 | |
4821 template <> struct CanonicalType<Status*> { | |
4822 typedef Status* Type; | |
4823 }; | |
4824 | |
4825 /* Type methods that are only one-per-canonical-type and not | |
4826 * one-per-cvariant. */ | |
4827 | |
4828 #define TYPE_METHODS(utype, ctype) \ | |
4829 inline bool Handlers::Set##utype##Handler(const FieldDef *f, \ | |
4830 const utype##Handler &h) { \ | |
4831 return SetValueHandler<ctype>(f, h); \ | |
4832 } \ | |
4833 | |
4834 TYPE_METHODS(Double, double) | |
4835 TYPE_METHODS(Float, float) | |
4836 TYPE_METHODS(UInt64, uint64_t) | |
4837 TYPE_METHODS(UInt32, uint32_t) | |
4838 TYPE_METHODS(Int64, int64_t) | |
4839 TYPE_METHODS(Int32, int32_t) | |
4840 TYPE_METHODS(Bool, bool) | |
4841 #undef TYPE_METHODS | |
4842 | |
4843 template <class F> struct ReturnOf; | |
4844 | |
4845 template <class R, class P1, class P2> | |
4846 struct ReturnOf<R (*)(P1, P2)> { | |
4847 typedef R Return; | |
4848 }; | |
4849 | |
4850 template <class R, class P1, class P2, class P3> | |
4851 struct ReturnOf<R (*)(P1, P2, P3)> { | |
4852 typedef R Return; | |
4853 }; | |
4854 | |
4855 template <class R, class P1, class P2, class P3, class P4> | |
4856 struct ReturnOf<R (*)(P1, P2, P3, P4)> { | |
4857 typedef R Return; | |
4858 }; | |
4859 | |
4860 template <class R, class P1, class P2, class P3, class P4, class P5> | |
4861 struct ReturnOf<R (*)(P1, P2, P3, P4, P5)> { | |
4862 typedef R Return; | |
4863 }; | |
4864 | |
4865 template<class T> const void *UniquePtrForType() { | |
4866 static const char ch = 0; | |
4867 return &ch; | |
4868 } | |
4869 | |
4870 template <class T> | |
4871 template <class F> | |
4872 inline Handler<T>::Handler(F func) | |
4873 : registered_(false), | |
4874 cleanup_data_(func.GetData()), | |
4875 cleanup_func_(func.GetCleanup()) { | |
4876 upb_handlerattr_sethandlerdata(&attr_, func.GetData()); | |
4877 typedef typename ReturnOf<T>::Return Return; | |
4878 typedef typename ConvertParams<F, T>::Func ConvertedParamsFunc; | |
4879 typedef typename MaybeWrapReturn<ConvertedParamsFunc, Return>::Func | |
4880 ReturnWrappedFunc; | |
4881 handler_ = ReturnWrappedFunc().Call; | |
4882 | |
4883 /* Set attributes based on what templates can statically tell us about the | |
4884 * user's function. */ | |
4885 | |
4886 /* If the original function returns void, then we know that we wrapped it to | |
4887 * always return ok. */ | |
4888 bool always_ok = is_same<typename F::FuncInfo::Return, void>::value; | |
4889 attr_.SetAlwaysOk(always_ok); | |
4890 | |
4891 /* Closure parameter and return type. */ | |
4892 attr_.SetClosureType(UniquePtrForType<typename F::FuncInfo::Closure>()); | |
4893 | |
4894 /* We use the closure type (from the first parameter) if the return type is | |
4895 * void or bool, since these are the two cases we wrap to return the closure's | |
4896 * type anyway. | |
4897 * | |
4898 * This is all nonsense for non START* handlers, but it doesn't matter because | |
4899 * in that case the value will be ignored. */ | |
4900 typedef typename FirstUnlessVoidOrBool<typename F::FuncInfo::Return, | |
4901 typename F::FuncInfo::Closure>::value | |
4902 EffectiveReturn; | |
4903 attr_.SetReturnClosureType(UniquePtrForType<EffectiveReturn>()); | |
4904 } | |
4905 | |
4906 template <class T> | |
4907 inline Handler<T>::~Handler() { | |
4908 assert(registered_); | |
4909 } | |
4910 | |
4911 inline HandlerAttributes::HandlerAttributes() { upb_handlerattr_init(this); } | |
4912 inline HandlerAttributes::~HandlerAttributes() { upb_handlerattr_uninit(this); } | |
4913 inline bool HandlerAttributes::SetHandlerData(const void *hd) { | |
4914 return upb_handlerattr_sethandlerdata(this, hd); | |
4915 } | |
4916 inline const void* HandlerAttributes::handler_data() const { | |
4917 return upb_handlerattr_handlerdata(this); | |
4918 } | |
4919 inline bool HandlerAttributes::SetClosureType(const void *type) { | |
4920 return upb_handlerattr_setclosuretype(this, type); | |
4921 } | |
4922 inline const void* HandlerAttributes::closure_type() const { | |
4923 return upb_handlerattr_closuretype(this); | |
4924 } | |
4925 inline bool HandlerAttributes::SetReturnClosureType(const void *type) { | |
4926 return upb_handlerattr_setreturnclosuretype(this, type); | |
4927 } | |
4928 inline const void* HandlerAttributes::return_closure_type() const { | |
4929 return upb_handlerattr_returnclosuretype(this); | |
4930 } | |
4931 inline bool HandlerAttributes::SetAlwaysOk(bool always_ok) { | |
4932 return upb_handlerattr_setalwaysok(this, always_ok); | |
4933 } | |
4934 inline bool HandlerAttributes::always_ok() const { | |
4935 return upb_handlerattr_alwaysok(this); | |
4936 } | |
4937 | |
4938 inline BufferHandle::BufferHandle() { upb_bufhandle_init(this); } | |
4939 inline BufferHandle::~BufferHandle() { upb_bufhandle_uninit(this); } | |
4940 inline const char* BufferHandle::buffer() const { | |
4941 return upb_bufhandle_buf(this); | |
4942 } | |
4943 inline size_t BufferHandle::object_offset() const { | |
4944 return upb_bufhandle_objofs(this); | |
4945 } | |
4946 inline void BufferHandle::SetBuffer(const char* buf, size_t ofs) { | |
4947 upb_bufhandle_setbuf(this, buf, ofs); | |
4948 } | |
4949 template <class T> | |
4950 void BufferHandle::SetAttachedObject(const T* obj) { | |
4951 upb_bufhandle_setobj(this, obj, UniquePtrForType<T>()); | |
4952 } | |
4953 template <class T> | |
4954 const T* BufferHandle::GetAttachedObject() const { | |
4955 return upb_bufhandle_objtype(this) == UniquePtrForType<T>() | |
4956 ? static_cast<const T *>(upb_bufhandle_obj(this)) | |
4957 : NULL; | |
4958 } | |
4959 | |
4960 inline reffed_ptr<Handlers> Handlers::New(const MessageDef *m) { | |
4961 upb_handlers *h = upb_handlers_new(m, &h); | |
4962 return reffed_ptr<Handlers>(h, &h); | |
4963 } | |
4964 inline reffed_ptr<const Handlers> Handlers::NewFrozen( | |
4965 const MessageDef *m, upb_handlers_callback *callback, | |
4966 const void *closure) { | |
4967 const upb_handlers *h = upb_handlers_newfrozen(m, &h, callback, closure); | |
4968 return reffed_ptr<const Handlers>(h, &h); | |
4969 } | |
4970 inline const Status* Handlers::status() { | |
4971 return upb_handlers_status(this); | |
4972 } | |
4973 inline void Handlers::ClearError() { | |
4974 return upb_handlers_clearerr(this); | |
4975 } | |
4976 inline bool Handlers::Freeze(Status *s) { | |
4977 upb::Handlers* h = this; | |
4978 return upb_handlers_freeze(&h, 1, s); | |
4979 } | |
4980 inline bool Handlers::Freeze(Handlers *const *handlers, int n, Status *s) { | |
4981 return upb_handlers_freeze(handlers, n, s); | |
4982 } | |
4983 inline bool Handlers::Freeze(const std::vector<Handlers*>& h, Status* status) { | |
4984 return upb_handlers_freeze((Handlers* const*)&h[0], h.size(), status); | |
4985 } | |
4986 inline const MessageDef *Handlers::message_def() const { | |
4987 return upb_handlers_msgdef(this); | |
4988 } | |
4989 inline bool Handlers::AddCleanup(void *p, upb_handlerfree *func) { | |
4990 return upb_handlers_addcleanup(this, p, func); | |
4991 } | |
4992 inline bool Handlers::SetStartMessageHandler( | |
4993 const Handlers::StartMessageHandler &handler) { | |
4994 assert(!handler.registered_); | |
4995 handler.registered_ = true; | |
4996 handler.AddCleanup(this); | |
4997 return upb_handlers_setstartmsg(this, handler.handler_, &handler.attr_); | |
4998 } | |
4999 inline bool Handlers::SetEndMessageHandler( | |
5000 const Handlers::EndMessageHandler &handler) { | |
5001 assert(!handler.registered_); | |
5002 handler.registered_ = true; | |
5003 handler.AddCleanup(this); | |
5004 return upb_handlers_setendmsg(this, handler.handler_, &handler.attr_); | |
5005 } | |
5006 inline bool Handlers::SetStartStringHandler(const FieldDef *f, | |
5007 const StartStringHandler &handler) { | |
5008 assert(!handler.registered_); | |
5009 handler.registered_ = true; | |
5010 handler.AddCleanup(this); | |
5011 return upb_handlers_setstartstr(this, f, handler.handler_, &handler.attr_); | |
5012 } | |
5013 inline bool Handlers::SetEndStringHandler(const FieldDef *f, | |
5014 const EndFieldHandler &handler) { | |
5015 assert(!handler.registered_); | |
5016 handler.registered_ = true; | |
5017 handler.AddCleanup(this); | |
5018 return upb_handlers_setendstr(this, f, handler.handler_, &handler.attr_); | |
5019 } | |
5020 inline bool Handlers::SetStringHandler(const FieldDef *f, | |
5021 const StringHandler& handler) { | |
5022 assert(!handler.registered_); | |
5023 handler.registered_ = true; | |
5024 handler.AddCleanup(this); | |
5025 return upb_handlers_setstring(this, f, handler.handler_, &handler.attr_); | |
5026 } | |
5027 inline bool Handlers::SetStartSequenceHandler( | |
5028 const FieldDef *f, const StartFieldHandler &handler) { | |
5029 assert(!handler.registered_); | |
5030 handler.registered_ = true; | |
5031 handler.AddCleanup(this); | |
5032 return upb_handlers_setstartseq(this, f, handler.handler_, &handler.attr_); | |
5033 } | |
5034 inline bool Handlers::SetStartSubMessageHandler( | |
5035 const FieldDef *f, const StartFieldHandler &handler) { | |
5036 assert(!handler.registered_); | |
5037 handler.registered_ = true; | |
5038 handler.AddCleanup(this); | |
5039 return upb_handlers_setstartsubmsg(this, f, handler.handler_, &handler.attr_); | |
5040 } | |
5041 inline bool Handlers::SetEndSubMessageHandler(const FieldDef *f, | |
5042 const EndFieldHandler &handler) { | |
5043 assert(!handler.registered_); | |
5044 handler.registered_ = true; | |
5045 handler.AddCleanup(this); | |
5046 return upb_handlers_setendsubmsg(this, f, handler.handler_, &handler.attr_); | |
5047 } | |
5048 inline bool Handlers::SetEndSequenceHandler(const FieldDef *f, | |
5049 const EndFieldHandler &handler) { | |
5050 assert(!handler.registered_); | |
5051 handler.registered_ = true; | |
5052 handler.AddCleanup(this); | |
5053 return upb_handlers_setendseq(this, f, handler.handler_, &handler.attr_); | |
5054 } | |
5055 inline bool Handlers::SetSubHandlers(const FieldDef *f, const Handlers *sub) { | |
5056 return upb_handlers_setsubhandlers(this, f, sub); | |
5057 } | |
5058 inline const Handlers *Handlers::GetSubHandlers(const FieldDef *f) const { | |
5059 return upb_handlers_getsubhandlers(this, f); | |
5060 } | |
5061 inline const Handlers *Handlers::GetSubHandlers(Handlers::Selector sel) const { | |
5062 return upb_handlers_getsubhandlers_sel(this, sel); | |
5063 } | |
5064 inline bool Handlers::GetSelector(const FieldDef *f, Handlers::Type type, | |
5065 Handlers::Selector *s) { | |
5066 return upb_handlers_getselector(f, type, s); | |
5067 } | |
5068 inline Handlers::Selector Handlers::GetEndSelector(Handlers::Selector start) { | |
5069 return upb_handlers_getendselector(start); | |
5070 } | |
5071 inline Handlers::GenericFunction *Handlers::GetHandler( | |
5072 Handlers::Selector selector) { | |
5073 return upb_handlers_gethandler(this, selector); | |
5074 } | |
5075 inline const void *Handlers::GetHandlerData(Handlers::Selector selector) { | |
5076 return upb_handlers_gethandlerdata(this, selector); | |
5077 } | |
5078 | |
5079 inline BytesHandler::BytesHandler() { | |
5080 upb_byteshandler_init(this); | |
5081 } | |
5082 | |
5083 inline BytesHandler::~BytesHandler() {} | |
5084 | |
5085 } /* namespace upb */ | |
5086 | |
5087 #endif /* __cplusplus */ | |
5088 | |
5089 | |
5090 #undef UPB_TWO_32BIT_TYPES | |
5091 #undef UPB_TWO_64BIT_TYPES | |
5092 #undef UPB_INT32_T | |
5093 #undef UPB_UINT32_T | |
5094 #undef UPB_INT32ALT_T | |
5095 #undef UPB_UINT32ALT_T | |
5096 #undef UPB_INT64_T | |
5097 #undef UPB_UINT64_T | |
5098 #undef UPB_INT64ALT_T | |
5099 #undef UPB_UINT64ALT_T | |
5100 | |
5101 #endif /* UPB_HANDLERS_INL_H_ */ | |
5102 | |
5103 #endif /* UPB_HANDLERS_H */ | |
5104 /* | |
5105 ** upb::Environment (upb_env) | |
5106 ** | |
5107 ** A upb::Environment provides a means for injecting malloc and an | |
5108 ** error-reporting callback into encoders/decoders. This allows them to be | |
5109 ** independent of nearly all assumptions about their actual environment. | |
5110 ** | |
5111 ** It is also a container for allocating the encoders/decoders themselves that | |
5112 ** insulates clients from knowing their actual size. This provides ABI | |
5113 ** compatibility even if the size of the objects change. And this allows the | |
5114 ** structure definitions to be in the .c files instead of the .h files, making | |
5115 ** the .h files smaller and more readable. | |
5116 */ | |
5117 | |
5118 | |
5119 #ifndef UPB_ENV_H_ | |
5120 #define UPB_ENV_H_ | |
5121 | |
5122 #ifdef __cplusplus | |
5123 namespace upb { | |
5124 class Environment; | |
5125 class SeededAllocator; | |
5126 } | |
5127 #endif | |
5128 | |
5129 UPB_DECLARE_TYPE(upb::Environment, upb_env) | |
5130 UPB_DECLARE_TYPE(upb::SeededAllocator, upb_seededalloc) | |
5131 | |
5132 typedef void *upb_alloc_func(void *ud, void *ptr, size_t oldsize, size_t size); | |
5133 typedef void upb_cleanup_func(void *ud); | |
5134 typedef bool upb_error_func(void *ud, const upb_status *status); | |
5135 | |
5136 #ifdef __cplusplus | |
5137 | |
5138 /* An environment is *not* thread-safe. */ | |
5139 class upb::Environment { | |
5140 public: | |
5141 Environment(); | |
5142 ~Environment(); | |
5143 | |
5144 /* Set a custom memory allocation function for the environment. May ONLY | |
5145 * be called before any calls to Malloc()/Realloc()/AddCleanup() below. | |
5146 * If this is not called, the system realloc() function will be used. | |
5147 * The given user pointer "ud" will be passed to the allocation function. | |
5148 * | |
5149 * The allocation function will not receive corresponding "free" calls. it | |
5150 * must ensure that the memory is valid for the lifetime of the Environment, | |
5151 * but it may be reclaimed any time thereafter. The likely usage is that | |
5152 * "ud" points to a stateful allocator, and that the allocator frees all | |
5153 * memory, arena-style, when it is destroyed. In this case the allocator must | |
5154 * outlive the Environment. Another possibility is that the allocation | |
5155 * function returns GC-able memory that is guaranteed to be GC-rooted for the | |
5156 * life of the Environment. */ | |
5157 void SetAllocationFunction(upb_alloc_func* alloc, void* ud); | |
5158 | |
5159 template<class T> | |
5160 void SetAllocator(T* allocator) { | |
5161 SetAllocationFunction(allocator->GetAllocationFunction(), allocator); | |
5162 } | |
5163 | |
5164 /* Set a custom error reporting function. */ | |
5165 void SetErrorFunction(upb_error_func* func, void* ud); | |
5166 | |
5167 /* Set the error reporting function to simply copy the status to the given | |
5168 * status and abort. */ | |
5169 void ReportErrorsTo(Status* status); | |
5170 | |
5171 /* Returns true if all allocations and AddCleanup() calls have succeeded, | |
5172 * and no errors were reported with ReportError() (except ones that recovered | |
5173 * successfully). */ | |
5174 bool ok() const; | |
5175 | |
5176 /* Functions for use by encoders/decoders. **********************************/ | |
5177 | |
5178 /* Reports an error to this environment's callback, returning true if | |
5179 * the caller should try to recover. */ | |
5180 bool ReportError(const Status* status); | |
5181 | |
5182 /* Allocate memory. Uses the environment's allocation function. | |
5183 * | |
5184 * There is no need to free(). All memory will be freed automatically, but is | |
5185 * guaranteed to outlive the Environment. */ | |
5186 void* Malloc(size_t size); | |
5187 | |
5188 /* Reallocate memory. Preserves "oldsize" bytes from the existing buffer | |
5189 * Requires: oldsize <= existing_size. | |
5190 * | |
5191 * TODO(haberman): should we also enforce that oldsize <= size? */ | |
5192 void* Realloc(void* ptr, size_t oldsize, size_t size); | |
5193 | |
5194 /* Add a cleanup function to run when the environment is destroyed. | |
5195 * Returns false on out-of-memory. | |
5196 * | |
5197 * The first call to AddCleanup() after SetAllocationFunction() is guaranteed | |
5198 * to return true -- this makes it possible to robustly set a cleanup handler | |
5199 * for a custom allocation function. */ | |
5200 bool AddCleanup(upb_cleanup_func* func, void* ud); | |
5201 | |
5202 /* Total number of bytes that have been allocated. It is undefined what | |
5203 * Realloc() does to this counter. */ | |
5204 size_t BytesAllocated() const; | |
5205 | |
5206 private: | |
5207 UPB_DISALLOW_COPY_AND_ASSIGN(Environment) | |
5208 | |
5209 #else | |
5210 struct upb_env { | |
5211 #endif /* __cplusplus */ | |
5212 | |
5213 bool ok_; | |
5214 size_t bytes_allocated; | |
5215 | |
5216 /* Alloc function. */ | |
5217 upb_alloc_func *alloc; | |
5218 void *alloc_ud; | |
5219 | |
5220 /* Error-reporting function. */ | |
5221 upb_error_func *err; | |
5222 void *err_ud; | |
5223 | |
5224 /* Userdata for default alloc func. */ | |
5225 void *default_alloc_ud; | |
5226 | |
5227 /* Cleanup entries. Pointer to a cleanup_ent, defined in env.c */ | |
5228 void *cleanup_head; | |
5229 | |
5230 /* For future expansion, since the size of this struct is exposed to users. */ | |
5231 void *future1; | |
5232 void *future2; | |
5233 }; | |
5234 | |
5235 UPB_BEGIN_EXTERN_C | |
5236 | |
5237 void upb_env_init(upb_env *e); | |
5238 void upb_env_uninit(upb_env *e); | |
5239 void upb_env_setallocfunc(upb_env *e, upb_alloc_func *func, void *ud); | |
5240 void upb_env_seterrorfunc(upb_env *e, upb_error_func *func, void *ud); | |
5241 void upb_env_reporterrorsto(upb_env *e, upb_status *status); | |
5242 bool upb_env_ok(const upb_env *e); | |
5243 bool upb_env_reporterror(upb_env *e, const upb_status *status); | |
5244 void *upb_env_malloc(upb_env *e, size_t size); | |
5245 void *upb_env_realloc(upb_env *e, void *ptr, size_t oldsize, size_t size); | |
5246 bool upb_env_addcleanup(upb_env *e, upb_cleanup_func *func, void *ud); | |
5247 size_t upb_env_bytesallocated(const upb_env *e); | |
5248 | |
5249 UPB_END_EXTERN_C | |
5250 | |
5251 #ifdef __cplusplus | |
5252 | |
5253 /* An allocator that allocates from an initial memory region (likely the stack) | |
5254 * before falling back to another allocator. */ | |
5255 class upb::SeededAllocator { | |
5256 public: | |
5257 SeededAllocator(void *mem, size_t len); | |
5258 ~SeededAllocator(); | |
5259 | |
5260 /* Set a custom fallback memory allocation function for the allocator, to use | |
5261 * once the initial region runs out. | |
5262 * | |
5263 * May ONLY be called before GetAllocationFunction(). If this is not | |
5264 * called, the system realloc() will be the fallback allocator. */ | |
5265 void SetFallbackAllocator(upb_alloc_func *alloc, void *ud); | |
5266 | |
5267 /* Gets the allocation function for this allocator. */ | |
5268 upb_alloc_func* GetAllocationFunction(); | |
5269 | |
5270 private: | |
5271 UPB_DISALLOW_COPY_AND_ASSIGN(SeededAllocator) | |
5272 | |
5273 #else | |
5274 struct upb_seededalloc { | |
5275 #endif /* __cplusplus */ | |
5276 | |
5277 /* Fallback alloc function. */ | |
5278 upb_alloc_func *alloc; | |
5279 upb_cleanup_func *alloc_cleanup; | |
5280 void *alloc_ud; | |
5281 bool need_cleanup; | |
5282 bool returned_allocfunc; | |
5283 | |
5284 /* Userdata for default alloc func. */ | |
5285 void *default_alloc_ud; | |
5286 | |
5287 /* Pointers for the initial memory region. */ | |
5288 char *mem_base; | |
5289 char *mem_ptr; | |
5290 char *mem_limit; | |
5291 | |
5292 /* For future expansion, since the size of this struct is exposed to users. */ | |
5293 void *future1; | |
5294 void *future2; | |
5295 }; | |
5296 | |
5297 UPB_BEGIN_EXTERN_C | |
5298 | |
5299 void upb_seededalloc_init(upb_seededalloc *a, void *mem, size_t len); | |
5300 void upb_seededalloc_uninit(upb_seededalloc *a); | |
5301 void upb_seededalloc_setfallbackalloc(upb_seededalloc *a, upb_alloc_func *func, | |
5302 void *ud); | |
5303 upb_alloc_func *upb_seededalloc_getallocfunc(upb_seededalloc *a); | |
5304 | |
5305 UPB_END_EXTERN_C | |
5306 | |
5307 #ifdef __cplusplus | |
5308 | |
5309 namespace upb { | |
5310 | |
5311 inline Environment::Environment() { | |
5312 upb_env_init(this); | |
5313 } | |
5314 inline Environment::~Environment() { | |
5315 upb_env_uninit(this); | |
5316 } | |
5317 inline void Environment::SetAllocationFunction(upb_alloc_func *alloc, | |
5318 void *ud) { | |
5319 upb_env_setallocfunc(this, alloc, ud); | |
5320 } | |
5321 inline void Environment::SetErrorFunction(upb_error_func *func, void *ud) { | |
5322 upb_env_seterrorfunc(this, func, ud); | |
5323 } | |
5324 inline void Environment::ReportErrorsTo(Status* status) { | |
5325 upb_env_reporterrorsto(this, status); | |
5326 } | |
5327 inline bool Environment::ok() const { | |
5328 return upb_env_ok(this); | |
5329 } | |
5330 inline bool Environment::ReportError(const Status* status) { | |
5331 return upb_env_reporterror(this, status); | |
5332 } | |
5333 inline void *Environment::Malloc(size_t size) { | |
5334 return upb_env_malloc(this, size); | |
5335 } | |
5336 inline void *Environment::Realloc(void *ptr, size_t oldsize, size_t size) { | |
5337 return upb_env_realloc(this, ptr, oldsize, size); | |
5338 } | |
5339 inline bool Environment::AddCleanup(upb_cleanup_func *func, void *ud) { | |
5340 return upb_env_addcleanup(this, func, ud); | |
5341 } | |
5342 inline size_t Environment::BytesAllocated() const { | |
5343 return upb_env_bytesallocated(this); | |
5344 } | |
5345 | |
5346 inline SeededAllocator::SeededAllocator(void *mem, size_t len) { | |
5347 upb_seededalloc_init(this, mem, len); | |
5348 } | |
5349 inline SeededAllocator::~SeededAllocator() { | |
5350 upb_seededalloc_uninit(this); | |
5351 } | |
5352 inline void SeededAllocator::SetFallbackAllocator(upb_alloc_func *alloc, | |
5353 void *ud) { | |
5354 upb_seededalloc_setfallbackalloc(this, alloc, ud); | |
5355 } | |
5356 inline upb_alloc_func *SeededAllocator::GetAllocationFunction() { | |
5357 return upb_seededalloc_getallocfunc(this); | |
5358 } | |
5359 | |
5360 } /* namespace upb */ | |
5361 | |
5362 #endif /* __cplusplus */ | |
5363 | |
5364 #endif /* UPB_ENV_H_ */ | |
5365 /* | |
5366 ** upb::Sink (upb_sink) | |
5367 ** upb::BytesSink (upb_bytessink) | |
5368 ** | |
5369 ** A upb_sink is an object that binds a upb_handlers object to some runtime | |
5370 ** state. It is the object that can actually receive data via the upb_handlers | |
5371 ** interface. | |
5372 ** | |
5373 ** Unlike upb_def and upb_handlers, upb_sink is never frozen, immutable, or | |
5374 ** thread-safe. You can create as many of them as you want, but each one may | |
5375 ** only be used in a single thread at a time. | |
5376 ** | |
5377 ** If we compare with class-based OOP, a you can think of a upb_def as an | |
5378 ** abstract base class, a upb_handlers as a concrete derived class, and a | |
5379 ** upb_sink as an object (class instance). | |
5380 */ | |
5381 | |
5382 #ifndef UPB_SINK_H | |
5383 #define UPB_SINK_H | |
5384 | |
5385 | |
5386 #ifdef __cplusplus | |
5387 namespace upb { | |
5388 class BufferSource; | |
5389 class BytesSink; | |
5390 class Sink; | |
5391 } | |
5392 #endif | |
5393 | |
5394 UPB_DECLARE_TYPE(upb::BufferSource, upb_bufsrc) | |
5395 UPB_DECLARE_TYPE(upb::BytesSink, upb_bytessink) | |
5396 UPB_DECLARE_TYPE(upb::Sink, upb_sink) | |
5397 | |
5398 #ifdef __cplusplus | |
5399 | |
5400 /* A upb::Sink is an object that binds a upb::Handlers object to some runtime | |
5401 * state. It represents an endpoint to which data can be sent. | |
5402 * | |
5403 * TODO(haberman): right now all of these functions take selectors. Should they | |
5404 * take selectorbase instead? | |
5405 * | |
5406 * ie. instead of calling: | |
5407 * sink->StartString(FOO_FIELD_START_STRING, ...) | |
5408 * a selector base would let you say: | |
5409 * sink->StartString(FOO_FIELD, ...) | |
5410 * | |
5411 * This would make call sites a little nicer and require emitting fewer selector | |
5412 * definitions in .h files. | |
5413 * | |
5414 * But the current scheme has the benefit that you can retrieve a function | |
5415 * pointer for any handler with handlers->GetHandler(selector), without having | |
5416 * to have a separate GetHandler() function for each handler type. The JIT | |
5417 * compiler uses this. To accommodate we'd have to expose a separate | |
5418 * GetHandler() for every handler type. | |
5419 * | |
5420 * Also to ponder: selectors right now are independent of a specific Handlers | |
5421 * instance. In other words, they allocate a number to every possible handler | |
5422 * that *could* be registered, without knowing anything about what handlers | |
5423 * *are* registered. That means that using selectors as table offsets prohibits | |
5424 * us from compacting the handler table at Freeze() time. If the table is very | |
5425 * sparse, this could be wasteful. | |
5426 * | |
5427 * Having another selector-like thing that is specific to a Handlers instance | |
5428 * would allow this compacting, but then it would be impossible to write code | |
5429 * ahead-of-time that can be bound to any Handlers instance at runtime. For | |
5430 * example, a .proto file parser written as straight C will not know what | |
5431 * Handlers it will be bound to, so when it calls sink->StartString() what | |
5432 * selector will it pass? It needs a selector like we have today, that is | |
5433 * independent of any particular upb::Handlers. | |
5434 * | |
5435 * Is there a way then to allow Handlers table compaction? */ | |
5436 class upb::Sink { | |
5437 public: | |
5438 /* Constructor with no initialization; must be Reset() before use. */ | |
5439 Sink() {} | |
5440 | |
5441 /* Constructs a new sink for the given frozen handlers and closure. | |
5442 * | |
5443 * TODO: once the Handlers know the expected closure type, verify that T | |
5444 * matches it. */ | |
5445 template <class T> Sink(const Handlers* handlers, T* closure); | |
5446 | |
5447 /* Resets the value of the sink. */ | |
5448 template <class T> void Reset(const Handlers* handlers, T* closure); | |
5449 | |
5450 /* Returns the top-level object that is bound to this sink. | |
5451 * | |
5452 * TODO: once the Handlers know the expected closure type, verify that T | |
5453 * matches it. */ | |
5454 template <class T> T* GetObject() const; | |
5455 | |
5456 /* Functions for pushing data into the sink. | |
5457 * | |
5458 * These return false if processing should stop (either due to error or just | |
5459 * to suspend). | |
5460 * | |
5461 * These may not be called from within one of the same sink's handlers (in | |
5462 * other words, handlers are not re-entrant). */ | |
5463 | |
5464 /* Should be called at the start and end of every message; both the top-level | |
5465 * message and submessages. This means that submessages should use the | |
5466 * following sequence: | |
5467 * sink->StartSubMessage(startsubmsg_selector); | |
5468 * sink->StartMessage(); | |
5469 * // ... | |
5470 * sink->EndMessage(&status); | |
5471 * sink->EndSubMessage(endsubmsg_selector); */ | |
5472 bool StartMessage(); | |
5473 bool EndMessage(Status* status); | |
5474 | |
5475 /* Putting of individual values. These work for both repeated and | |
5476 * non-repeated fields, but for repeated fields you must wrap them in | |
5477 * calls to StartSequence()/EndSequence(). */ | |
5478 bool PutInt32(Handlers::Selector s, int32_t val); | |
5479 bool PutInt64(Handlers::Selector s, int64_t val); | |
5480 bool PutUInt32(Handlers::Selector s, uint32_t val); | |
5481 bool PutUInt64(Handlers::Selector s, uint64_t val); | |
5482 bool PutFloat(Handlers::Selector s, float val); | |
5483 bool PutDouble(Handlers::Selector s, double val); | |
5484 bool PutBool(Handlers::Selector s, bool val); | |
5485 | |
5486 /* Putting of string/bytes values. Each string can consist of zero or more | |
5487 * non-contiguous buffers of data. | |
5488 * | |
5489 * For StartString(), the function will write a sink for the string to "sub." | |
5490 * The sub-sink must be used for any/all PutStringBuffer() calls. */ | |
5491 bool StartString(Handlers::Selector s, size_t size_hint, Sink* sub); | |
5492 size_t PutStringBuffer(Handlers::Selector s, const char *buf, size_t len, | |
5493 const BufferHandle *handle); | |
5494 bool EndString(Handlers::Selector s); | |
5495 | |
5496 /* For submessage fields. | |
5497 * | |
5498 * For StartSubMessage(), the function will write a sink for the string to | |
5499 * "sub." The sub-sink must be used for any/all handlers called within the | |
5500 * submessage. */ | |
5501 bool StartSubMessage(Handlers::Selector s, Sink* sub); | |
5502 bool EndSubMessage(Handlers::Selector s); | |
5503 | |
5504 /* For repeated fields of any type, the sequence of values must be wrapped in | |
5505 * these calls. | |
5506 * | |
5507 * For StartSequence(), the function will write a sink for the string to | |
5508 * "sub." The sub-sink must be used for any/all handlers called within the | |
5509 * sequence. */ | |
5510 bool StartSequence(Handlers::Selector s, Sink* sub); | |
5511 bool EndSequence(Handlers::Selector s); | |
5512 | |
5513 /* Copy and assign specifically allowed. | |
5514 * We don't even bother making these members private because so many | |
5515 * functions need them and this is mainly just a dumb data container anyway. | |
5516 */ | |
5517 #else | |
5518 struct upb_sink { | |
5519 #endif | |
5520 const upb_handlers *handlers; | |
5521 void *closure; | |
5522 }; | |
5523 | |
5524 #ifdef __cplusplus | |
5525 class upb::BytesSink { | |
5526 public: | |
5527 BytesSink() {} | |
5528 | |
5529 /* Constructs a new sink for the given frozen handlers and closure. | |
5530 * | |
5531 * TODO(haberman): once the Handlers know the expected closure type, verify | |
5532 * that T matches it. */ | |
5533 template <class T> BytesSink(const BytesHandler* handler, T* closure); | |
5534 | |
5535 /* Resets the value of the sink. */ | |
5536 template <class T> void Reset(const BytesHandler* handler, T* closure); | |
5537 | |
5538 bool Start(size_t size_hint, void **subc); | |
5539 size_t PutBuffer(void *subc, const char *buf, size_t len, | |
5540 const BufferHandle *handle); | |
5541 bool End(); | |
5542 #else | |
5543 struct upb_bytessink { | |
5544 #endif | |
5545 const upb_byteshandler *handler; | |
5546 void *closure; | |
5547 }; | |
5548 | |
5549 #ifdef __cplusplus | |
5550 | |
5551 /* A class for pushing a flat buffer of data to a BytesSink. | |
5552 * You can construct an instance of this to get a resumable source, | |
5553 * or just call the static PutBuffer() to do a non-resumable push all in one | |
5554 * go. */ | |
5555 class upb::BufferSource { | |
5556 public: | |
5557 BufferSource(); | |
5558 BufferSource(const char* buf, size_t len, BytesSink* sink); | |
5559 | |
5560 /* Returns true if the entire buffer was pushed successfully. Otherwise the | |
5561 * next call to PutNext() will resume where the previous one left off. | |
5562 * TODO(haberman): implement this. */ | |
5563 bool PutNext(); | |
5564 | |
5565 /* A static version; with this version is it not possible to resume in the | |
5566 * case of failure or a partially-consumed buffer. */ | |
5567 static bool PutBuffer(const char* buf, size_t len, BytesSink* sink); | |
5568 | |
5569 template <class T> static bool PutBuffer(const T& str, BytesSink* sink) { | |
5570 return PutBuffer(str.c_str(), str.size(), sink); | |
5571 } | |
5572 #else | |
5573 struct upb_bufsrc { | |
5574 char dummy; | |
5575 #endif | |
5576 }; | |
5577 | |
5578 UPB_BEGIN_EXTERN_C | |
5579 | |
5580 /* Inline definitions. */ | |
5581 | |
5582 UPB_INLINE void upb_bytessink_reset(upb_bytessink *s, const upb_byteshandler *h, | |
5583 void *closure) { | |
5584 s->handler = h; | |
5585 s->closure = closure; | |
5586 } | |
5587 | |
5588 UPB_INLINE bool upb_bytessink_start(upb_bytessink *s, size_t size_hint, | |
5589 void **subc) { | |
5590 typedef upb_startstr_handlerfunc func; | |
5591 func *start; | |
5592 *subc = s->closure; | |
5593 if (!s->handler) return true; | |
5594 start = (func *)s->handler->table[UPB_STARTSTR_SELECTOR].func; | |
5595 | |
5596 if (!start) return true; | |
5597 *subc = start(s->closure, upb_handlerattr_handlerdata( | |
5598 &s->handler->table[UPB_STARTSTR_SELECTOR].attr), | |
5599 size_hint); | |
5600 return *subc != NULL; | |
5601 } | |
5602 | |
5603 UPB_INLINE size_t upb_bytessink_putbuf(upb_bytessink *s, void *subc, | |
5604 const char *buf, size_t size, | |
5605 const upb_bufhandle* handle) { | |
5606 typedef upb_string_handlerfunc func; | |
5607 func *putbuf; | |
5608 if (!s->handler) return true; | |
5609 putbuf = (func *)s->handler->table[UPB_STRING_SELECTOR].func; | |
5610 | |
5611 if (!putbuf) return true; | |
5612 return putbuf(subc, upb_handlerattr_handlerdata( | |
5613 &s->handler->table[UPB_STRING_SELECTOR].attr), | |
5614 buf, size, handle); | |
5615 } | |
5616 | |
5617 UPB_INLINE bool upb_bytessink_end(upb_bytessink *s) { | |
5618 typedef upb_endfield_handlerfunc func; | |
5619 func *end; | |
5620 if (!s->handler) return true; | |
5621 end = (func *)s->handler->table[UPB_ENDSTR_SELECTOR].func; | |
5622 | |
5623 if (!end) return true; | |
5624 return end(s->closure, | |
5625 upb_handlerattr_handlerdata( | |
5626 &s->handler->table[UPB_ENDSTR_SELECTOR].attr)); | |
5627 } | |
5628 | |
5629 UPB_INLINE bool upb_bufsrc_putbuf(const char *buf, size_t len, | |
5630 upb_bytessink *sink) { | |
5631 void *subc; | |
5632 bool ret; | |
5633 upb_bufhandle handle; | |
5634 upb_bufhandle_init(&handle); | |
5635 upb_bufhandle_setbuf(&handle, buf, 0); | |
5636 ret = upb_bytessink_start(sink, len, &subc); | |
5637 if (ret && len != 0) { | |
5638 ret = (upb_bytessink_putbuf(sink, subc, buf, len, &handle) == len); | |
5639 } | |
5640 if (ret) { | |
5641 ret = upb_bytessink_end(sink); | |
5642 } | |
5643 upb_bufhandle_uninit(&handle); | |
5644 return ret; | |
5645 } | |
5646 | |
5647 #define PUTVAL(type, ctype) \ | |
5648 UPB_INLINE bool upb_sink_put##type(upb_sink *s, upb_selector_t sel, \ | |
5649 ctype val) { \ | |
5650 typedef upb_##type##_handlerfunc functype; \ | |
5651 functype *func; \ | |
5652 const void *hd; \ | |
5653 if (!s->handlers) return true; \ | |
5654 func = (functype *)upb_handlers_gethandler(s->handlers, sel); \ | |
5655 if (!func) return true; \ | |
5656 hd = upb_handlers_gethandlerdata(s->handlers, sel); \ | |
5657 return func(s->closure, hd, val); \ | |
5658 } | |
5659 | |
5660 PUTVAL(int32, int32_t) | |
5661 PUTVAL(int64, int64_t) | |
5662 PUTVAL(uint32, uint32_t) | |
5663 PUTVAL(uint64, uint64_t) | |
5664 PUTVAL(float, float) | |
5665 PUTVAL(double, double) | |
5666 PUTVAL(bool, bool) | |
5667 #undef PUTVAL | |
5668 | |
5669 UPB_INLINE void upb_sink_reset(upb_sink *s, const upb_handlers *h, void *c) { | |
5670 s->handlers = h; | |
5671 s->closure = c; | |
5672 } | |
5673 | |
5674 UPB_INLINE size_t upb_sink_putstring(upb_sink *s, upb_selector_t sel, | |
5675 const char *buf, size_t n, | |
5676 const upb_bufhandle *handle) { | |
5677 typedef upb_string_handlerfunc func; | |
5678 func *handler; | |
5679 const void *hd; | |
5680 if (!s->handlers) return n; | |
5681 handler = (func *)upb_handlers_gethandler(s->handlers, sel); | |
5682 | |
5683 if (!handler) return n; | |
5684 hd = upb_handlers_gethandlerdata(s->handlers, sel); | |
5685 return handler(s->closure, hd, buf, n, handle); | |
5686 } | |
5687 | |
5688 UPB_INLINE bool upb_sink_startmsg(upb_sink *s) { | |
5689 typedef upb_startmsg_handlerfunc func; | |
5690 func *startmsg; | |
5691 const void *hd; | |
5692 if (!s->handlers) return true; | |
5693 startmsg = (func*)upb_handlers_gethandler(s->handlers, UPB_STARTMSG_SELECTOR); | |
5694 | |
5695 if (!startmsg) return true; | |
5696 hd = upb_handlers_gethandlerdata(s->handlers, UPB_STARTMSG_SELECTOR); | |
5697 return startmsg(s->closure, hd); | |
5698 } | |
5699 | |
5700 UPB_INLINE bool upb_sink_endmsg(upb_sink *s, upb_status *status) { | |
5701 typedef upb_endmsg_handlerfunc func; | |
5702 func *endmsg; | |
5703 const void *hd; | |
5704 if (!s->handlers) return true; | |
5705 endmsg = (func *)upb_handlers_gethandler(s->handlers, UPB_ENDMSG_SELECTOR); | |
5706 | |
5707 if (!endmsg) return true; | |
5708 hd = upb_handlers_gethandlerdata(s->handlers, UPB_ENDMSG_SELECTOR); | |
5709 return endmsg(s->closure, hd, status); | |
5710 } | |
5711 | |
5712 UPB_INLINE bool upb_sink_startseq(upb_sink *s, upb_selector_t sel, | |
5713 upb_sink *sub) { | |
5714 typedef upb_startfield_handlerfunc func; | |
5715 func *startseq; | |
5716 const void *hd; | |
5717 sub->closure = s->closure; | |
5718 sub->handlers = s->handlers; | |
5719 if (!s->handlers) return true; | |
5720 startseq = (func*)upb_handlers_gethandler(s->handlers, sel); | |
5721 | |
5722 if (!startseq) return true; | |
5723 hd = upb_handlers_gethandlerdata(s->handlers, sel); | |
5724 sub->closure = startseq(s->closure, hd); | |
5725 return sub->closure ? true : false; | |
5726 } | |
5727 | |
5728 UPB_INLINE bool upb_sink_endseq(upb_sink *s, upb_selector_t sel) { | |
5729 typedef upb_endfield_handlerfunc func; | |
5730 func *endseq; | |
5731 const void *hd; | |
5732 if (!s->handlers) return true; | |
5733 endseq = (func*)upb_handlers_gethandler(s->handlers, sel); | |
5734 | |
5735 if (!endseq) return true; | |
5736 hd = upb_handlers_gethandlerdata(s->handlers, sel); | |
5737 return endseq(s->closure, hd); | |
5738 } | |
5739 | |
5740 UPB_INLINE bool upb_sink_startstr(upb_sink *s, upb_selector_t sel, | |
5741 size_t size_hint, upb_sink *sub) { | |
5742 typedef upb_startstr_handlerfunc func; | |
5743 func *startstr; | |
5744 const void *hd; | |
5745 sub->closure = s->closure; | |
5746 sub->handlers = s->handlers; | |
5747 if (!s->handlers) return true; | |
5748 startstr = (func*)upb_handlers_gethandler(s->handlers, sel); | |
5749 | |
5750 if (!startstr) return true; | |
5751 hd = upb_handlers_gethandlerdata(s->handlers, sel); | |
5752 sub->closure = startstr(s->closure, hd, size_hint); | |
5753 return sub->closure ? true : false; | |
5754 } | |
5755 | |
5756 UPB_INLINE bool upb_sink_endstr(upb_sink *s, upb_selector_t sel) { | |
5757 typedef upb_endfield_handlerfunc func; | |
5758 func *endstr; | |
5759 const void *hd; | |
5760 if (!s->handlers) return true; | |
5761 endstr = (func*)upb_handlers_gethandler(s->handlers, sel); | |
5762 | |
5763 if (!endstr) return true; | |
5764 hd = upb_handlers_gethandlerdata(s->handlers, sel); | |
5765 return endstr(s->closure, hd); | |
5766 } | |
5767 | |
5768 UPB_INLINE bool upb_sink_startsubmsg(upb_sink *s, upb_selector_t sel, | |
5769 upb_sink *sub) { | |
5770 typedef upb_startfield_handlerfunc func; | |
5771 func *startsubmsg; | |
5772 const void *hd; | |
5773 sub->closure = s->closure; | |
5774 if (!s->handlers) { | |
5775 sub->handlers = NULL; | |
5776 return true; | |
5777 } | |
5778 sub->handlers = upb_handlers_getsubhandlers_sel(s->handlers, sel); | |
5779 startsubmsg = (func*)upb_handlers_gethandler(s->handlers, sel); | |
5780 | |
5781 if (!startsubmsg) return true; | |
5782 hd = upb_handlers_gethandlerdata(s->handlers, sel); | |
5783 sub->closure = startsubmsg(s->closure, hd); | |
5784 return sub->closure ? true : false; | |
5785 } | |
5786 | |
5787 UPB_INLINE bool upb_sink_endsubmsg(upb_sink *s, upb_selector_t sel) { | |
5788 typedef upb_endfield_handlerfunc func; | |
5789 func *endsubmsg; | |
5790 const void *hd; | |
5791 if (!s->handlers) return true; | |
5792 endsubmsg = (func*)upb_handlers_gethandler(s->handlers, sel); | |
5793 | |
5794 if (!endsubmsg) return s->closure; | |
5795 hd = upb_handlers_gethandlerdata(s->handlers, sel); | |
5796 return endsubmsg(s->closure, hd); | |
5797 } | |
5798 | |
5799 UPB_END_EXTERN_C | |
5800 | |
5801 #ifdef __cplusplus | |
5802 | |
5803 namespace upb { | |
5804 | |
5805 template <class T> Sink::Sink(const Handlers* handlers, T* closure) { | |
5806 upb_sink_reset(this, handlers, closure); | |
5807 } | |
5808 template <class T> | |
5809 inline void Sink::Reset(const Handlers* handlers, T* closure) { | |
5810 upb_sink_reset(this, handlers, closure); | |
5811 } | |
5812 inline bool Sink::StartMessage() { | |
5813 return upb_sink_startmsg(this); | |
5814 } | |
5815 inline bool Sink::EndMessage(Status* status) { | |
5816 return upb_sink_endmsg(this, status); | |
5817 } | |
5818 inline bool Sink::PutInt32(Handlers::Selector sel, int32_t val) { | |
5819 return upb_sink_putint32(this, sel, val); | |
5820 } | |
5821 inline bool Sink::PutInt64(Handlers::Selector sel, int64_t val) { | |
5822 return upb_sink_putint64(this, sel, val); | |
5823 } | |
5824 inline bool Sink::PutUInt32(Handlers::Selector sel, uint32_t val) { | |
5825 return upb_sink_putuint32(this, sel, val); | |
5826 } | |
5827 inline bool Sink::PutUInt64(Handlers::Selector sel, uint64_t val) { | |
5828 return upb_sink_putuint64(this, sel, val); | |
5829 } | |
5830 inline bool Sink::PutFloat(Handlers::Selector sel, float val) { | |
5831 return upb_sink_putfloat(this, sel, val); | |
5832 } | |
5833 inline bool Sink::PutDouble(Handlers::Selector sel, double val) { | |
5834 return upb_sink_putdouble(this, sel, val); | |
5835 } | |
5836 inline bool Sink::PutBool(Handlers::Selector sel, bool val) { | |
5837 return upb_sink_putbool(this, sel, val); | |
5838 } | |
5839 inline bool Sink::StartString(Handlers::Selector sel, size_t size_hint, | |
5840 Sink *sub) { | |
5841 return upb_sink_startstr(this, sel, size_hint, sub); | |
5842 } | |
5843 inline size_t Sink::PutStringBuffer(Handlers::Selector sel, const char *buf, | |
5844 size_t len, const BufferHandle* handle) { | |
5845 return upb_sink_putstring(this, sel, buf, len, handle); | |
5846 } | |
5847 inline bool Sink::EndString(Handlers::Selector sel) { | |
5848 return upb_sink_endstr(this, sel); | |
5849 } | |
5850 inline bool Sink::StartSubMessage(Handlers::Selector sel, Sink* sub) { | |
5851 return upb_sink_startsubmsg(this, sel, sub); | |
5852 } | |
5853 inline bool Sink::EndSubMessage(Handlers::Selector sel) { | |
5854 return upb_sink_endsubmsg(this, sel); | |
5855 } | |
5856 inline bool Sink::StartSequence(Handlers::Selector sel, Sink* sub) { | |
5857 return upb_sink_startseq(this, sel, sub); | |
5858 } | |
5859 inline bool Sink::EndSequence(Handlers::Selector sel) { | |
5860 return upb_sink_endseq(this, sel); | |
5861 } | |
5862 | |
5863 template <class T> | |
5864 BytesSink::BytesSink(const BytesHandler* handler, T* closure) { | |
5865 Reset(handler, closure); | |
5866 } | |
5867 | |
5868 template <class T> | |
5869 void BytesSink::Reset(const BytesHandler *handler, T *closure) { | |
5870 upb_bytessink_reset(this, handler, closure); | |
5871 } | |
5872 inline bool BytesSink::Start(size_t size_hint, void **subc) { | |
5873 return upb_bytessink_start(this, size_hint, subc); | |
5874 } | |
5875 inline size_t BytesSink::PutBuffer(void *subc, const char *buf, size_t len, | |
5876 const BufferHandle *handle) { | |
5877 return upb_bytessink_putbuf(this, subc, buf, len, handle); | |
5878 } | |
5879 inline bool BytesSink::End() { | |
5880 return upb_bytessink_end(this); | |
5881 } | |
5882 | |
5883 inline bool BufferSource::PutBuffer(const char *buf, size_t len, | |
5884 BytesSink *sink) { | |
5885 return upb_bufsrc_putbuf(buf, len, sink); | |
5886 } | |
5887 | |
5888 } /* namespace upb */ | |
5889 #endif | |
5890 | |
5891 #endif | |
5892 /* | |
5893 ** For handlers that do very tiny, very simple operations, the function call | |
5894 ** overhead of calling a handler can be significant. This file allows the | |
5895 ** user to define handlers that do something very simple like store the value | |
5896 ** to memory and/or set a hasbit. JIT compilers can then special-case these | |
5897 ** handlers and emit specialized code for them instead of actually calling the | |
5898 ** handler. | |
5899 ** | |
5900 ** The functionality is very simple/limited right now but may expand to be able | |
5901 ** to call another function. | |
5902 */ | |
5903 | |
5904 #ifndef UPB_SHIM_H | |
5905 #define UPB_SHIM_H | |
5906 | |
5907 | |
5908 typedef struct { | |
5909 size_t offset; | |
5910 int32_t hasbit; | |
5911 } upb_shim_data; | |
5912 | |
5913 #ifdef __cplusplus | |
5914 | |
5915 namespace upb { | |
5916 | |
5917 struct Shim { | |
5918 typedef upb_shim_data Data; | |
5919 | |
5920 /* Sets a handler for the given field that writes the value to the given | |
5921 * offset and, if hasbit >= 0, sets a bit at the given bit offset. Returns | |
5922 * true if the handler was set successfully. */ | |
5923 static bool Set(Handlers *h, const FieldDef *f, size_t ofs, int32_t hasbit); | |
5924 | |
5925 /* If this handler is a shim, returns the corresponding upb::Shim::Data and | |
5926 * stores the type in "type". Otherwise returns NULL. */ | |
5927 static const Data* GetData(const Handlers* h, Handlers::Selector s, | |
5928 FieldDef::Type* type); | |
5929 }; | |
5930 | |
5931 } /* namespace upb */ | |
5932 | |
5933 #endif | |
5934 | |
5935 UPB_BEGIN_EXTERN_C | |
5936 | |
5937 /* C API. */ | |
5938 bool upb_shim_set(upb_handlers *h, const upb_fielddef *f, size_t offset, | |
5939 int32_t hasbit); | |
5940 const upb_shim_data *upb_shim_getdata(const upb_handlers *h, upb_selector_t s, | |
5941 upb_fieldtype_t *type); | |
5942 | |
5943 UPB_END_EXTERN_C | |
5944 | |
5945 #ifdef __cplusplus | |
5946 /* C++ Wrappers. */ | |
5947 namespace upb { | |
5948 inline bool Shim::Set(Handlers* h, const FieldDef* f, size_t ofs, | |
5949 int32_t hasbit) { | |
5950 return upb_shim_set(h, f, ofs, hasbit); | |
5951 } | |
5952 inline const Shim::Data* Shim::GetData(const Handlers* h, Handlers::Selector s, | |
5953 FieldDef::Type* type) { | |
5954 return upb_shim_getdata(h, s, type); | |
5955 } | |
5956 } /* namespace upb */ | |
5957 #endif | |
5958 | |
5959 #endif /* UPB_SHIM_H */ | |
5960 /* | |
5961 ** upb::SymbolTable (upb_symtab) | |
5962 ** | |
5963 ** A symtab (symbol table) stores a name->def map of upb_defs. Clients could | |
5964 ** always create such tables themselves, but upb_symtab has logic for resolving | |
5965 ** symbolic references, and in particular, for keeping a whole set of consistent | |
5966 ** defs when replacing some subset of those defs. This logic is nontrivial. | |
5967 ** | |
5968 ** This is a mixed C/C++ interface that offers a full API to both languages. | |
5969 ** See the top-level README for more information. | |
5970 */ | |
5971 | |
5972 #ifndef UPB_SYMTAB_H_ | |
5973 #define UPB_SYMTAB_H_ | |
5974 | |
5975 | |
5976 #ifdef __cplusplus | |
5977 #include <vector> | |
5978 namespace upb { class SymbolTable; } | |
5979 #endif | |
5980 | |
5981 UPB_DECLARE_DERIVED_TYPE(upb::SymbolTable, upb::RefCounted, | |
5982 upb_symtab, upb_refcounted) | |
5983 | |
5984 typedef struct { | |
5985 UPB_PRIVATE_FOR_CPP | |
5986 upb_strtable_iter iter; | |
5987 upb_deftype_t type; | |
5988 } upb_symtab_iter; | |
5989 | |
5990 #ifdef __cplusplus | |
5991 | |
5992 /* Non-const methods in upb::SymbolTable are NOT thread-safe. */ | |
5993 class upb::SymbolTable { | |
5994 public: | |
5995 /* Returns a new symbol table with a single ref owned by "owner." | |
5996 * Returns NULL if memory allocation failed. */ | |
5997 static reffed_ptr<SymbolTable> New(); | |
5998 | |
5999 /* Include RefCounted base methods. */ | |
6000 UPB_REFCOUNTED_CPPMETHODS | |
6001 | |
6002 /* For all lookup functions, the returned pointer is not owned by the | |
6003 * caller; it may be invalidated by any non-const call or unref of the | |
6004 * SymbolTable! To protect against this, take a ref if desired. */ | |
6005 | |
6006 /* Freezes the symbol table: prevents further modification of it. | |
6007 * After the Freeze() operation is successful, the SymbolTable must only be | |
6008 * accessed via a const pointer. | |
6009 * | |
6010 * Unlike with upb::MessageDef/upb::EnumDef/etc, freezing a SymbolTable is not | |
6011 * a necessary step in using a SymbolTable. If you have no need for it to be | |
6012 * immutable, there is no need to freeze it ever. However sometimes it is | |
6013 * useful, and SymbolTables that are statically compiled into the binary are | |
6014 * always frozen by nature. */ | |
6015 void Freeze(); | |
6016 | |
6017 /* Resolves the given symbol using the rules described in descriptor.proto, | |
6018 * namely: | |
6019 * | |
6020 * If the name starts with a '.', it is fully-qualified. Otherwise, | |
6021 * C++-like scoping rules are used to find the type (i.e. first the nested | |
6022 * types within this message are searched, then within the parent, on up | |
6023 * to the root namespace). | |
6024 * | |
6025 * If not found, returns NULL. */ | |
6026 const Def* Resolve(const char* base, const char* sym) const; | |
6027 | |
6028 /* Finds an entry in the symbol table with this exact name. If not found, | |
6029 * returns NULL. */ | |
6030 const Def* Lookup(const char *sym) const; | |
6031 const MessageDef* LookupMessage(const char *sym) const; | |
6032 const EnumDef* LookupEnum(const char *sym) const; | |
6033 | |
6034 /* TODO: introduce a C++ iterator, but make it nice and templated so that if | |
6035 * you ask for an iterator of MessageDef the iterated elements are strongly | |
6036 * typed as MessageDef*. */ | |
6037 | |
6038 /* Adds the given mutable defs to the symtab, resolving all symbols | |
6039 * (including enum default values) and finalizing the defs. Only one def per | |
6040 * name may be in the list, but defs can replace existing defs in the symtab. | |
6041 * All defs must have a name -- anonymous defs are not allowed. Anonymous | |
6042 * defs can still be frozen by calling upb_def_freeze() directly. | |
6043 * | |
6044 * Any existing defs that can reach defs that are being replaced will | |
6045 * themselves be replaced also, so that the resulting set of defs is fully | |
6046 * consistent. | |
6047 * | |
6048 * This logic implemented in this method is a convenience; ultimately it | |
6049 * calls some combination of upb_fielddef_setsubdef(), upb_def_dup(), and | |
6050 * upb_freeze(), any of which the client could call themself. However, since | |
6051 * the logic for doing so is nontrivial, we provide it here. | |
6052 * | |
6053 * The entire operation either succeeds or fails. If the operation fails, | |
6054 * the symtab is unchanged, false is returned, and status indicates the | |
6055 * error. The caller passes a ref on all defs to the symtab (even if the | |
6056 * operation fails). | |
6057 * | |
6058 * TODO(haberman): currently failure will leave the symtab unchanged, but may | |
6059 * leave the defs themselves partially resolved. Does this matter? If so we | |
6060 * could do a prepass that ensures that all symbols are resolvable and bail | |
6061 * if not, so we don't mutate anything until we know the operation will | |
6062 * succeed. | |
6063 * | |
6064 * TODO(haberman): since the defs must be mutable, refining a frozen def | |
6065 * requires making mutable copies of the entire tree. This is wasteful if | |
6066 * only a few messages are changing. We may want to add a way of adding a | |
6067 * tree of frozen defs to the symtab (perhaps an alternate constructor where | |
6068 * you pass the root of the tree?) */ | |
6069 bool Add(Def*const* defs, int n, void* ref_donor, upb_status* status); | |
6070 | |
6071 bool Add(const std::vector<Def*>& defs, void *owner, Status* status) { | |
6072 return Add((Def*const*)&defs[0], defs.size(), owner, status); | |
6073 } | |
6074 | |
6075 private: | |
6076 UPB_DISALLOW_POD_OPS(SymbolTable, upb::SymbolTable) | |
6077 }; | |
6078 | |
6079 #endif /* __cplusplus */ | |
6080 | |
6081 UPB_BEGIN_EXTERN_C | |
6082 | |
6083 /* Native C API. */ | |
6084 | |
6085 /* Include refcounted methods like upb_symtab_ref(). */ | |
6086 UPB_REFCOUNTED_CMETHODS(upb_symtab, upb_symtab_upcast) | |
6087 | |
6088 upb_symtab *upb_symtab_new(const void *owner); | |
6089 void upb_symtab_freeze(upb_symtab *s); | |
6090 const upb_def *upb_symtab_resolve(const upb_symtab *s, const char *base, | |
6091 const char *sym); | |
6092 const upb_def *upb_symtab_lookup(const upb_symtab *s, const char *sym); | |
6093 const upb_msgdef *upb_symtab_lookupmsg(const upb_symtab *s, const char *sym); | |
6094 const upb_enumdef *upb_symtab_lookupenum(const upb_symtab *s, const char *sym); | |
6095 bool upb_symtab_add(upb_symtab *s, upb_def *const*defs, int n, void *ref_donor, | |
6096 upb_status *status); | |
6097 | |
6098 /* upb_symtab_iter i; | |
6099 * for(upb_symtab_begin(&i, s, type); !upb_symtab_done(&i); | |
6100 * upb_symtab_next(&i)) { | |
6101 * const upb_def *def = upb_symtab_iter_def(&i); | |
6102 * // ... | |
6103 * } | |
6104 * | |
6105 * For C we don't have separate iterators for const and non-const. | |
6106 * It is the caller's responsibility to cast the upb_fielddef* to | |
6107 * const if the upb_msgdef* is const. */ | |
6108 void upb_symtab_begin(upb_symtab_iter *iter, const upb_symtab *s, | |
6109 upb_deftype_t type); | |
6110 void upb_symtab_next(upb_symtab_iter *iter); | |
6111 bool upb_symtab_done(const upb_symtab_iter *iter); | |
6112 const upb_def *upb_symtab_iter_def(const upb_symtab_iter *iter); | |
6113 | |
6114 UPB_END_EXTERN_C | |
6115 | |
6116 #ifdef __cplusplus | |
6117 /* C++ inline wrappers. */ | |
6118 namespace upb { | |
6119 inline reffed_ptr<SymbolTable> SymbolTable::New() { | |
6120 upb_symtab *s = upb_symtab_new(&s); | |
6121 return reffed_ptr<SymbolTable>(s, &s); | |
6122 } | |
6123 | |
6124 inline void SymbolTable::Freeze() { | |
6125 return upb_symtab_freeze(this); | |
6126 } | |
6127 inline const Def *SymbolTable::Resolve(const char *base, | |
6128 const char *sym) const { | |
6129 return upb_symtab_resolve(this, base, sym); | |
6130 } | |
6131 inline const Def* SymbolTable::Lookup(const char *sym) const { | |
6132 return upb_symtab_lookup(this, sym); | |
6133 } | |
6134 inline const MessageDef *SymbolTable::LookupMessage(const char *sym) const { | |
6135 return upb_symtab_lookupmsg(this, sym); | |
6136 } | |
6137 inline bool SymbolTable::Add( | |
6138 Def*const* defs, int n, void* ref_donor, upb_status* status) { | |
6139 return upb_symtab_add(this, (upb_def*const*)defs, n, ref_donor, status); | |
6140 } | |
6141 } /* namespace upb */ | |
6142 #endif | |
6143 | |
6144 #endif /* UPB_SYMTAB_H_ */ | |
6145 /* | |
6146 ** upb::descriptor::Reader (upb_descreader) | |
6147 ** | |
6148 ** Provides a way of building upb::Defs from data in descriptor.proto format. | |
6149 */ | |
6150 | |
6151 #ifndef UPB_DESCRIPTOR_H | |
6152 #define UPB_DESCRIPTOR_H | |
6153 | |
6154 | |
6155 #ifdef __cplusplus | |
6156 namespace upb { | |
6157 namespace descriptor { | |
6158 class Reader; | |
6159 } /* namespace descriptor */ | |
6160 } /* namespace upb */ | |
6161 #endif | |
6162 | |
6163 UPB_DECLARE_TYPE(upb::descriptor::Reader, upb_descreader) | |
6164 | |
6165 #ifdef __cplusplus | |
6166 | |
6167 /* Class that receives descriptor data according to the descriptor.proto schema | |
6168 * and use it to build upb::Defs corresponding to that schema. */ | |
6169 class upb::descriptor::Reader { | |
6170 public: | |
6171 /* These handlers must have come from NewHandlers() and must outlive the | |
6172 * Reader. | |
6173 * | |
6174 * TODO: generate the handlers statically (like we do with the | |
6175 * descriptor.proto defs) so that there is no need to pass this parameter (or | |
6176 * to build/memory-manage the handlers at runtime at all). Unfortunately this | |
6177 * is a bit tricky to implement for Handlers, but necessary to simplify this | |
6178 * interface. */ | |
6179 static Reader* Create(Environment* env, const Handlers* handlers); | |
6180 | |
6181 /* The reader's input; this is where descriptor.proto data should be sent. */ | |
6182 Sink* input(); | |
6183 | |
6184 /* Returns an array of all defs that have been parsed, and transfers ownership | |
6185 * of them to "owner". The number of defs is stored in *n. Ownership of the | |
6186 * returned array is retained and is invalidated by any other call into | |
6187 * Reader. | |
6188 * | |
6189 * These defs are not frozen or resolved; they are ready to be added to a | |
6190 * symtab. */ | |
6191 upb::Def** GetDefs(void* owner, int* n); | |
6192 | |
6193 /* Builds and returns handlers for the reader, owned by "owner." */ | |
6194 static Handlers* NewHandlers(const void* owner); | |
6195 | |
6196 private: | |
6197 UPB_DISALLOW_POD_OPS(Reader, upb::descriptor::Reader) | |
6198 }; | |
6199 | |
6200 #endif | |
6201 | |
6202 UPB_BEGIN_EXTERN_C | |
6203 | |
6204 /* C API. */ | |
6205 upb_descreader *upb_descreader_create(upb_env *e, const upb_handlers *h); | |
6206 upb_sink *upb_descreader_input(upb_descreader *r); | |
6207 upb_def **upb_descreader_getdefs(upb_descreader *r, void *owner, int *n); | |
6208 const upb_handlers *upb_descreader_newhandlers(const void *owner); | |
6209 | |
6210 UPB_END_EXTERN_C | |
6211 | |
6212 #ifdef __cplusplus | |
6213 /* C++ implementation details. ************************************************/ | |
6214 namespace upb { | |
6215 namespace descriptor { | |
6216 inline Reader* Reader::Create(Environment* e, const Handlers *h) { | |
6217 return upb_descreader_create(e, h); | |
6218 } | |
6219 inline Sink* Reader::input() { return upb_descreader_input(this); } | |
6220 inline upb::Def** Reader::GetDefs(void* owner, int* n) { | |
6221 return upb_descreader_getdefs(this, owner, n); | |
6222 } | |
6223 } /* namespace descriptor */ | |
6224 } /* namespace upb */ | |
6225 #endif | |
6226 | |
6227 #endif /* UPB_DESCRIPTOR_H */ | |
6228 /* This file contains accessors for a set of compiled-in defs. | |
6229 * Note that unlike Google's protobuf, it does *not* define | |
6230 * generated classes or any other kind of data structure for | |
6231 * actually storing protobufs. It only contains *defs* which | |
6232 * let you reflect over a protobuf *schema*. | |
6233 */ | |
6234 /* This file was generated by upbc (the upb compiler). | |
6235 * Do not edit -- your changes will be discarded when the file is | |
6236 * regenerated. */ | |
6237 | |
6238 #ifndef GOOGLE_PROTOBUF_DESCRIPTOR_UPB_H_ | |
6239 #define GOOGLE_PROTOBUF_DESCRIPTOR_UPB_H_ | |
6240 | |
6241 | |
6242 #ifdef __cplusplus | |
6243 UPB_BEGIN_EXTERN_C | |
6244 #endif | |
6245 | |
6246 /* Enums */ | |
6247 | |
6248 typedef enum { | |
6249 GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_LABEL_OPTIONAL = 1, | |
6250 GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_LABEL_REQUIRED = 2, | |
6251 GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_LABEL_REPEATED = 3 | |
6252 } google_protobuf_FieldDescriptorProto_Label; | |
6253 | |
6254 typedef enum { | |
6255 GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_DOUBLE = 1, | |
6256 GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_FLOAT = 2, | |
6257 GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_INT64 = 3, | |
6258 GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_UINT64 = 4, | |
6259 GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_INT32 = 5, | |
6260 GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_FIXED64 = 6, | |
6261 GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_FIXED32 = 7, | |
6262 GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_BOOL = 8, | |
6263 GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_STRING = 9, | |
6264 GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_GROUP = 10, | |
6265 GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_MESSAGE = 11, | |
6266 GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_BYTES = 12, | |
6267 GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_UINT32 = 13, | |
6268 GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_ENUM = 14, | |
6269 GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_SFIXED32 = 15, | |
6270 GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_SFIXED64 = 16, | |
6271 GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_SINT32 = 17, | |
6272 GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_SINT64 = 18 | |
6273 } google_protobuf_FieldDescriptorProto_Type; | |
6274 | |
6275 typedef enum { | |
6276 GOOGLE_PROTOBUF_FIELDOPTIONS_STRING = 0, | |
6277 GOOGLE_PROTOBUF_FIELDOPTIONS_CORD = 1, | |
6278 GOOGLE_PROTOBUF_FIELDOPTIONS_STRING_PIECE = 2 | |
6279 } google_protobuf_FieldOptions_CType; | |
6280 | |
6281 typedef enum { | |
6282 GOOGLE_PROTOBUF_FILEOPTIONS_SPEED = 1, | |
6283 GOOGLE_PROTOBUF_FILEOPTIONS_CODE_SIZE = 2, | |
6284 GOOGLE_PROTOBUF_FILEOPTIONS_LITE_RUNTIME = 3 | |
6285 } google_protobuf_FileOptions_OptimizeMode; | |
6286 | |
6287 /* Selectors */ | |
6288 | |
6289 /* google.protobuf.DescriptorProto */ | |
6290 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_FIELD_STARTSUBMSG 2 | |
6291 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NESTED_TYPE_STARTSUBMSG 3 | |
6292 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_ENUM_TYPE_STARTSUBMSG 4 | |
6293 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_RANGE_STARTSUBMSG 5 | |
6294 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_STARTSUBMSG 6 | |
6295 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_OPTIONS_STARTSUBMSG 7 | |
6296 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_FIELD_STARTSEQ 8 | |
6297 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_FIELD_ENDSEQ 9 | |
6298 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_FIELD_ENDSUBMSG 10 | |
6299 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NESTED_TYPE_STARTSEQ 11 | |
6300 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NESTED_TYPE_ENDSEQ 12 | |
6301 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NESTED_TYPE_ENDSUBMSG 13 | |
6302 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_ENUM_TYPE_STARTSEQ 14 | |
6303 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_ENUM_TYPE_ENDSEQ 15 | |
6304 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_ENUM_TYPE_ENDSUBMSG 16 | |
6305 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_RANGE_STARTSEQ 17 | |
6306 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_RANGE_ENDSEQ 18 | |
6307 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_RANGE_ENDSUBMSG 19 | |
6308 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_STARTSEQ 20 | |
6309 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_ENDSEQ 21 | |
6310 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_ENDSUBMSG 22 | |
6311 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_OPTIONS_ENDSUBMSG 23 | |
6312 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NAME_STRING 24 | |
6313 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NAME_STARTSTR 25 | |
6314 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NAME_ENDSTR 26 | |
6315 | |
6316 /* google.protobuf.DescriptorProto.ExtensionRange */ | |
6317 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSIONRANGE_START_INT32 2 | |
6318 #define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSIONRANGE_END_INT32 3 | |
6319 | |
6320 /* google.protobuf.EnumDescriptorProto */ | |
6321 #define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_VALUE_STARTSUBMSG 2 | |
6322 #define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_OPTIONS_STARTSUBMSG 3 | |
6323 #define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_VALUE_STARTSEQ 4 | |
6324 #define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_VALUE_ENDSEQ 5 | |
6325 #define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_VALUE_ENDSUBMSG 6 | |
6326 #define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_OPTIONS_ENDSUBMSG 7 | |
6327 #define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_NAME_STRING 8 | |
6328 #define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_NAME_STARTSTR 9 | |
6329 #define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_NAME_ENDSTR 10 | |
6330 | |
6331 /* google.protobuf.EnumOptions */ | |
6332 #define SEL_GOOGLE_PROTOBUF_ENUMOPTIONS_UNINTERPRETED_OPTION_STARTSUBMSG 2 | |
6333 #define SEL_GOOGLE_PROTOBUF_ENUMOPTIONS_UNINTERPRETED_OPTION_STARTSEQ 3 | |
6334 #define SEL_GOOGLE_PROTOBUF_ENUMOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4 | |
6335 #define SEL_GOOGLE_PROTOBUF_ENUMOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5 | |
6336 #define SEL_GOOGLE_PROTOBUF_ENUMOPTIONS_ALLOW_ALIAS_BOOL 6 | |
6337 | |
6338 /* google.protobuf.EnumValueDescriptorProto */ | |
6339 #define SEL_GOOGLE_PROTOBUF_ENUMVALUEDESCRIPTORPROTO_OPTIONS_STARTSUBMSG 2 | |
6340 #define SEL_GOOGLE_PROTOBUF_ENUMVALUEDESCRIPTORPROTO_OPTIONS_ENDSUBMSG 3 | |
6341 #define SEL_GOOGLE_PROTOBUF_ENUMVALUEDESCRIPTORPROTO_NAME_STRING 4 | |
6342 #define SEL_GOOGLE_PROTOBUF_ENUMVALUEDESCRIPTORPROTO_NAME_STARTSTR 5 | |
6343 #define SEL_GOOGLE_PROTOBUF_ENUMVALUEDESCRIPTORPROTO_NAME_ENDSTR 6 | |
6344 #define SEL_GOOGLE_PROTOBUF_ENUMVALUEDESCRIPTORPROTO_NUMBER_INT32 7 | |
6345 | |
6346 /* google.protobuf.EnumValueOptions */ | |
6347 #define SEL_GOOGLE_PROTOBUF_ENUMVALUEOPTIONS_UNINTERPRETED_OPTION_STARTSUBMSG 2 | |
6348 #define SEL_GOOGLE_PROTOBUF_ENUMVALUEOPTIONS_UNINTERPRETED_OPTION_STARTSEQ 3 | |
6349 #define SEL_GOOGLE_PROTOBUF_ENUMVALUEOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4 | |
6350 #define SEL_GOOGLE_PROTOBUF_ENUMVALUEOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5 | |
6351 | |
6352 /* google.protobuf.FieldDescriptorProto */ | |
6353 #define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_OPTIONS_STARTSUBMSG 2 | |
6354 #define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_OPTIONS_ENDSUBMSG 3 | |
6355 #define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_NAME_STRING 4 | |
6356 #define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_NAME_STARTSTR 5 | |
6357 #define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_NAME_ENDSTR 6 | |
6358 #define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_EXTENDEE_STRING 7 | |
6359 #define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_EXTENDEE_STARTSTR 8 | |
6360 #define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_EXTENDEE_ENDSTR 9 | |
6361 #define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_NUMBER_INT32 10 | |
6362 #define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_LABEL_INT32 11 | |
6363 #define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_INT32 12 | |
6364 #define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_NAME_STRING 13 | |
6365 #define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_NAME_STARTSTR 14 | |
6366 #define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_NAME_ENDSTR 15 | |
6367 #define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_DEFAULT_VALUE_STRING 16 | |
6368 #define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_DEFAULT_VALUE_STARTSTR 17 | |
6369 #define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_DEFAULT_VALUE_ENDSTR 18 | |
6370 | |
6371 /* google.protobuf.FieldOptions */ | |
6372 #define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_UNINTERPRETED_OPTION_STARTSUBMSG 2 | |
6373 #define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_UNINTERPRETED_OPTION_STARTSEQ 3 | |
6374 #define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4 | |
6375 #define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5 | |
6376 #define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_CTYPE_INT32 6 | |
6377 #define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_PACKED_BOOL 7 | |
6378 #define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_DEPRECATED_BOOL 8 | |
6379 #define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_LAZY_BOOL 9 | |
6380 #define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_EXPERIMENTAL_MAP_KEY_STRING 10 | |
6381 #define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_EXPERIMENTAL_MAP_KEY_STARTSTR 11 | |
6382 #define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_EXPERIMENTAL_MAP_KEY_ENDSTR 12 | |
6383 #define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_WEAK_BOOL 13 | |
6384 | |
6385 /* google.protobuf.FileDescriptorProto */ | |
6386 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_MESSAGE_TYPE_STARTSUBMSG 2 | |
6387 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_ENUM_TYPE_STARTSUBMSG 3 | |
6388 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_SERVICE_STARTSUBMSG 4 | |
6389 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_EXTENSION_STARTSUBMSG 5 | |
6390 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_OPTIONS_STARTSUBMSG 6 | |
6391 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_SOURCE_CODE_INFO_STARTSUBMSG 7 | |
6392 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_MESSAGE_TYPE_STARTSEQ 8 | |
6393 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_MESSAGE_TYPE_ENDSEQ 9 | |
6394 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_MESSAGE_TYPE_ENDSUBMSG 10 | |
6395 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_ENUM_TYPE_STARTSEQ 11 | |
6396 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_ENUM_TYPE_ENDSEQ 12 | |
6397 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_ENUM_TYPE_ENDSUBMSG 13 | |
6398 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_SERVICE_STARTSEQ 14 | |
6399 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_SERVICE_ENDSEQ 15 | |
6400 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_SERVICE_ENDSUBMSG 16 | |
6401 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_EXTENSION_STARTSEQ 17 | |
6402 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_EXTENSION_ENDSEQ 18 | |
6403 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_EXTENSION_ENDSUBMSG 19 | |
6404 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_OPTIONS_ENDSUBMSG 20 | |
6405 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_SOURCE_CODE_INFO_ENDSUBMSG 21 | |
6406 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_NAME_STRING 22 | |
6407 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_NAME_STARTSTR 23 | |
6408 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_NAME_ENDSTR 24 | |
6409 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_PACKAGE_STRING 25 | |
6410 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_PACKAGE_STARTSTR 26 | |
6411 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_PACKAGE_ENDSTR 27 | |
6412 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_DEPENDENCY_STARTSEQ 28 | |
6413 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_DEPENDENCY_ENDSEQ 29 | |
6414 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_DEPENDENCY_STRING 30 | |
6415 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_DEPENDENCY_STARTSTR 31 | |
6416 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_DEPENDENCY_ENDSTR 32 | |
6417 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_PUBLIC_DEPENDENCY_STARTSEQ 33 | |
6418 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_PUBLIC_DEPENDENCY_ENDSEQ 34 | |
6419 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_PUBLIC_DEPENDENCY_INT32 35 | |
6420 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_WEAK_DEPENDENCY_STARTSEQ 36 | |
6421 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_WEAK_DEPENDENCY_ENDSEQ 37 | |
6422 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_WEAK_DEPENDENCY_INT32 38 | |
6423 | |
6424 /* google.protobuf.FileDescriptorSet */ | |
6425 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORSET_FILE_STARTSUBMSG 2 | |
6426 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORSET_FILE_STARTSEQ 3 | |
6427 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORSET_FILE_ENDSEQ 4 | |
6428 #define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORSET_FILE_ENDSUBMSG 5 | |
6429 | |
6430 /* google.protobuf.FileOptions */ | |
6431 #define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_UNINTERPRETED_OPTION_STARTSUBMSG 2 | |
6432 #define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_UNINTERPRETED_OPTION_STARTSEQ 3 | |
6433 #define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4 | |
6434 #define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5 | |
6435 #define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_PACKAGE_STRING 6 | |
6436 #define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_PACKAGE_STARTSTR 7 | |
6437 #define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_PACKAGE_ENDSTR 8 | |
6438 #define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_OUTER_CLASSNAME_STRING 9 | |
6439 #define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_OUTER_CLASSNAME_STARTSTR 10 | |
6440 #define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_OUTER_CLASSNAME_ENDSTR 11 | |
6441 #define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_OPTIMIZE_FOR_INT32 12 | |
6442 #define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_MULTIPLE_FILES_BOOL 13 | |
6443 #define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_GO_PACKAGE_STRING 14 | |
6444 #define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_GO_PACKAGE_STARTSTR 15 | |
6445 #define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_GO_PACKAGE_ENDSTR 16 | |
6446 #define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_CC_GENERIC_SERVICES_BOOL 17 | |
6447 #define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_GENERIC_SERVICES_BOOL 18 | |
6448 #define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_PY_GENERIC_SERVICES_BOOL 19 | |
6449 #define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_GENERATE_EQUALS_AND_HASH_BOOL 20 | |
6450 | |
6451 /* google.protobuf.MessageOptions */ | |
6452 #define SEL_GOOGLE_PROTOBUF_MESSAGEOPTIONS_UNINTERPRETED_OPTION_STARTSUBMSG 2 | |
6453 #define SEL_GOOGLE_PROTOBUF_MESSAGEOPTIONS_UNINTERPRETED_OPTION_STARTSEQ 3 | |
6454 #define SEL_GOOGLE_PROTOBUF_MESSAGEOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4 | |
6455 #define SEL_GOOGLE_PROTOBUF_MESSAGEOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5 | |
6456 #define SEL_GOOGLE_PROTOBUF_MESSAGEOPTIONS_MESSAGE_SET_WIRE_FORMAT_BOOL 6 | |
6457 #define SEL_GOOGLE_PROTOBUF_MESSAGEOPTIONS_NO_STANDARD_DESCRIPTOR_ACCESSOR_BOOL
7 | |
6458 | |
6459 /* google.protobuf.MethodDescriptorProto */ | |
6460 #define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_OPTIONS_STARTSUBMSG 2 | |
6461 #define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_OPTIONS_ENDSUBMSG 3 | |
6462 #define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_NAME_STRING 4 | |
6463 #define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_NAME_STARTSTR 5 | |
6464 #define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_NAME_ENDSTR 6 | |
6465 #define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_INPUT_TYPE_STRING 7 | |
6466 #define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_INPUT_TYPE_STARTSTR 8 | |
6467 #define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_INPUT_TYPE_ENDSTR 9 | |
6468 #define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_OUTPUT_TYPE_STRING 10 | |
6469 #define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_OUTPUT_TYPE_STARTSTR 11 | |
6470 #define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_OUTPUT_TYPE_ENDSTR 12 | |
6471 | |
6472 /* google.protobuf.MethodOptions */ | |
6473 #define SEL_GOOGLE_PROTOBUF_METHODOPTIONS_UNINTERPRETED_OPTION_STARTSUBMSG 2 | |
6474 #define SEL_GOOGLE_PROTOBUF_METHODOPTIONS_UNINTERPRETED_OPTION_STARTSEQ 3 | |
6475 #define SEL_GOOGLE_PROTOBUF_METHODOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4 | |
6476 #define SEL_GOOGLE_PROTOBUF_METHODOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5 | |
6477 | |
6478 /* google.protobuf.ServiceDescriptorProto */ | |
6479 #define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_METHOD_STARTSUBMSG 2 | |
6480 #define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_OPTIONS_STARTSUBMSG 3 | |
6481 #define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_METHOD_STARTSEQ 4 | |
6482 #define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_METHOD_ENDSEQ 5 | |
6483 #define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_METHOD_ENDSUBMSG 6 | |
6484 #define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_OPTIONS_ENDSUBMSG 7 | |
6485 #define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_NAME_STRING 8 | |
6486 #define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_NAME_STARTSTR 9 | |
6487 #define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_NAME_ENDSTR 10 | |
6488 | |
6489 /* google.protobuf.ServiceOptions */ | |
6490 #define SEL_GOOGLE_PROTOBUF_SERVICEOPTIONS_UNINTERPRETED_OPTION_STARTSUBMSG 2 | |
6491 #define SEL_GOOGLE_PROTOBUF_SERVICEOPTIONS_UNINTERPRETED_OPTION_STARTSEQ 3 | |
6492 #define SEL_GOOGLE_PROTOBUF_SERVICEOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4 | |
6493 #define SEL_GOOGLE_PROTOBUF_SERVICEOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5 | |
6494 | |
6495 /* google.protobuf.SourceCodeInfo */ | |
6496 #define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_STARTSUBMSG 2 | |
6497 #define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_STARTSEQ 3 | |
6498 #define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_ENDSEQ 4 | |
6499 #define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_ENDSUBMSG 5 | |
6500 | |
6501 /* google.protobuf.SourceCodeInfo.Location */ | |
6502 #define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_PATH_STARTSEQ 2 | |
6503 #define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_PATH_ENDSEQ 3 | |
6504 #define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_PATH_INT32 4 | |
6505 #define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_SPAN_STARTSEQ 5 | |
6506 #define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_SPAN_ENDSEQ 6 | |
6507 #define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_SPAN_INT32 7 | |
6508 #define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_LEADING_COMMENTS_STRING 8 | |
6509 #define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_LEADING_COMMENTS_STARTSTR 9 | |
6510 #define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_LEADING_COMMENTS_ENDSTR 10 | |
6511 #define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_TRAILING_COMMENTS_STRING 11 | |
6512 #define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_TRAILING_COMMENTS_STARTSTR 1
2 | |
6513 #define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_TRAILING_COMMENTS_ENDSTR 13 | |
6514 | |
6515 /* google.protobuf.UninterpretedOption */ | |
6516 #define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NAME_STARTSUBMSG 2 | |
6517 #define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NAME_STARTSEQ 3 | |
6518 #define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NAME_ENDSEQ 4 | |
6519 #define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NAME_ENDSUBMSG 5 | |
6520 #define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_IDENTIFIER_VALUE_STRING 6 | |
6521 #define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_IDENTIFIER_VALUE_STARTSTR 7 | |
6522 #define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_IDENTIFIER_VALUE_ENDSTR 8 | |
6523 #define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_POSITIVE_INT_VALUE_UINT64 9 | |
6524 #define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NEGATIVE_INT_VALUE_INT64 10 | |
6525 #define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_DOUBLE_VALUE_DOUBLE 11 | |
6526 #define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_STRING_VALUE_STRING 12 | |
6527 #define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_STRING_VALUE_STARTSTR 13 | |
6528 #define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_STRING_VALUE_ENDSTR 14 | |
6529 #define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_AGGREGATE_VALUE_STRING 15 | |
6530 #define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_AGGREGATE_VALUE_STARTSTR 16 | |
6531 #define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_AGGREGATE_VALUE_ENDSTR 17 | |
6532 | |
6533 /* google.protobuf.UninterpretedOption.NamePart */ | |
6534 #define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NAMEPART_NAME_PART_STRING 2 | |
6535 #define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NAMEPART_NAME_PART_STARTSTR 3 | |
6536 #define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NAMEPART_NAME_PART_ENDSTR 4 | |
6537 #define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NAMEPART_IS_EXTENSION_BOOL 5 | |
6538 | |
6539 const upb_symtab *upbdefs_google_protobuf_descriptor(const void *owner); | |
6540 | |
6541 /* MessageDefs */ | |
6542 UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_DescriptorProto(const upb_s
ymtab *s) { | |
6543 const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.DescriptorProto
"); | |
6544 assert(m); | |
6545 return m; | |
6546 } | |
6547 UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_DescriptorProto_ExtensionRa
nge(const upb_symtab *s) { | |
6548 const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.DescriptorProto
.ExtensionRange"); | |
6549 assert(m); | |
6550 return m; | |
6551 } | |
6552 UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_EnumDescriptorProto(const u
pb_symtab *s) { | |
6553 const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.EnumDescriptorP
roto"); | |
6554 assert(m); | |
6555 return m; | |
6556 } | |
6557 UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_EnumOptions(const upb_symta
b *s) { | |
6558 const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.EnumOptions"); | |
6559 assert(m); | |
6560 return m; | |
6561 } | |
6562 UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_EnumValueDescriptorProto(co
nst upb_symtab *s) { | |
6563 const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.EnumValueDescri
ptorProto"); | |
6564 assert(m); | |
6565 return m; | |
6566 } | |
6567 UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_EnumValueOptions(const upb_
symtab *s) { | |
6568 const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.EnumValueOption
s"); | |
6569 assert(m); | |
6570 return m; | |
6571 } | |
6572 UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_FieldDescriptorProto(const
upb_symtab *s) { | |
6573 const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.FieldDescriptor
Proto"); | |
6574 assert(m); | |
6575 return m; | |
6576 } | |
6577 UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_FieldOptions(const upb_symt
ab *s) { | |
6578 const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.FieldOptions"); | |
6579 assert(m); | |
6580 return m; | |
6581 } | |
6582 UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_FileDescriptorProto(const u
pb_symtab *s) { | |
6583 const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.FileDescriptorP
roto"); | |
6584 assert(m); | |
6585 return m; | |
6586 } | |
6587 UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_FileDescriptorSet(const upb
_symtab *s) { | |
6588 const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.FileDescriptorS
et"); | |
6589 assert(m); | |
6590 return m; | |
6591 } | |
6592 UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_FileOptions(const upb_symta
b *s) { | |
6593 const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.FileOptions"); | |
6594 assert(m); | |
6595 return m; | |
6596 } | |
6597 UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_MessageOptions(const upb_sy
mtab *s) { | |
6598 const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.MessageOptions"
); | |
6599 assert(m); | |
6600 return m; | |
6601 } | |
6602 UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_MethodDescriptorProto(const
upb_symtab *s) { | |
6603 const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.MethodDescripto
rProto"); | |
6604 assert(m); | |
6605 return m; | |
6606 } | |
6607 UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_MethodOptions(const upb_sym
tab *s) { | |
6608 const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.MethodOptions")
; | |
6609 assert(m); | |
6610 return m; | |
6611 } | |
6612 UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_ServiceDescriptorProto(cons
t upb_symtab *s) { | |
6613 const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.ServiceDescript
orProto"); | |
6614 assert(m); | |
6615 return m; | |
6616 } | |
6617 UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_ServiceOptions(const upb_sy
mtab *s) { | |
6618 const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.ServiceOptions"
); | |
6619 assert(m); | |
6620 return m; | |
6621 } | |
6622 UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_SourceCodeInfo(const upb_sy
mtab *s) { | |
6623 const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.SourceCodeInfo"
); | |
6624 assert(m); | |
6625 return m; | |
6626 } | |
6627 UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_SourceCodeInfo_Location(con
st upb_symtab *s) { | |
6628 const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.SourceCodeInfo.
Location"); | |
6629 assert(m); | |
6630 return m; | |
6631 } | |
6632 UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_UninterpretedOption(const u
pb_symtab *s) { | |
6633 const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.UninterpretedOp
tion"); | |
6634 assert(m); | |
6635 return m; | |
6636 } | |
6637 UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_UninterpretedOption_NamePar
t(const upb_symtab *s) { | |
6638 const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.UninterpretedOp
tion.NamePart"); | |
6639 assert(m); | |
6640 return m; | |
6641 } | |
6642 | |
6643 | |
6644 /* EnumDefs */ | |
6645 UPB_INLINE const upb_enumdef *upbdefs_google_protobuf_FieldDescriptorProto_Label
(const upb_symtab *s) { | |
6646 const upb_enumdef *e = upb_symtab_lookupenum(s, "google.protobuf.FieldDescript
orProto.Label"); | |
6647 assert(e); | |
6648 return e; | |
6649 } | |
6650 UPB_INLINE const upb_enumdef *upbdefs_google_protobuf_FieldDescriptorProto_Type(
const upb_symtab *s) { | |
6651 const upb_enumdef *e = upb_symtab_lookupenum(s, "google.protobuf.FieldDescript
orProto.Type"); | |
6652 assert(e); | |
6653 return e; | |
6654 } | |
6655 UPB_INLINE const upb_enumdef *upbdefs_google_protobuf_FieldOptions_CType(const u
pb_symtab *s) { | |
6656 const upb_enumdef *e = upb_symtab_lookupenum(s, "google.protobuf.FieldOptions.
CType"); | |
6657 assert(e); | |
6658 return e; | |
6659 } | |
6660 UPB_INLINE const upb_enumdef *upbdefs_google_protobuf_FileOptions_OptimizeMode(c
onst upb_symtab *s) { | |
6661 const upb_enumdef *e = upb_symtab_lookupenum(s, "google.protobuf.FileOptions.O
ptimizeMode"); | |
6662 assert(e); | |
6663 return e; | |
6664 } | |
6665 | |
6666 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_Extension
Range_end(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_
DescriptorProto_ExtensionRange(s), 2); } | |
6667 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_Extension
Range_start(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobu
f_DescriptorProto_ExtensionRange(s), 1); } | |
6668 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_enum_type
(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_Descripto
rProto(s), 4); } | |
6669 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_extension
(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_Descripto
rProto(s), 6); } | |
6670 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_extension
_range(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_Des
criptorProto(s), 5); } | |
6671 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_field(con
st upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorPro
to(s), 2); } | |
6672 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_name(cons
t upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProt
o(s), 1); } | |
6673 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_nested_ty
pe(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_Descrip
torProto(s), 3); } | |
6674 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_options(c
onst upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorP
roto(s), 7); } | |
6675 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumDescriptorProto_name(
const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumDescri
ptorProto(s), 1); } | |
6676 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumDescriptorProto_optio
ns(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumDes
criptorProto(s), 3); } | |
6677 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumDescriptorProto_value
(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumDescr
iptorProto(s), 2); } | |
6678 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumOptions_allow_alias(c
onst upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumOptions
(s), 2); } | |
6679 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumOptions_uninterpreted
_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_En
umOptions(s), 999); } | |
6680 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueDescriptorProto_
name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumV
alueDescriptorProto(s), 1); } | |
6681 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueDescriptorProto_
number(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_Enu
mValueDescriptorProto(s), 2); } | |
6682 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueDescriptorProto_
options(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_En
umValueDescriptorProto(s), 3); } | |
6683 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueOptions_uninterp
reted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protob
uf_EnumValueOptions(s), 999); } | |
6684 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_defa
ult_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_
FieldDescriptorProto(s), 7); } | |
6685 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_exte
ndee(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_Field
DescriptorProto(s), 2); } | |
6686 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_labe
l(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDes
criptorProto(s), 4); } | |
6687 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_name
(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDesc
riptorProto(s), 1); } | |
6688 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_numb
er(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDe
scriptorProto(s), 3); } | |
6689 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_opti
ons(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldD
escriptorProto(s), 8); } | |
6690 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_type
(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDesc
riptorProto(s), 5); } | |
6691 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_type
_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_Fiel
dDescriptorProto(s), 6); } | |
6692 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_ctype(const
upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s),
1); } | |
6693 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_deprecated(c
onst upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOption
s(s), 3); } | |
6694 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_experimental
_map_key(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_F
ieldOptions(s), 9); } | |
6695 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_lazy(const u
pb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s),
5); } | |
6696 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_packed(const
upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s)
, 2); } | |
6697 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_uninterprete
d_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_F
ieldOptions(s), 999); } | |
6698 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_weak(const u
pb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s),
10); } | |
6699 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_depen
dency(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_File
DescriptorProto(s), 3); } | |
6700 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_enum_
type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileD
escriptorProto(s), 5); } | |
6701 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_exten
sion(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileD
escriptorProto(s), 7); } | |
6702 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_messa
ge_type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_Fi
leDescriptorProto(s), 4); } | |
6703 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_name(
const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescri
ptorProto(s), 1); } | |
6704 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_optio
ns(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDes
criptorProto(s), 8); } | |
6705 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_packa
ge(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDes
criptorProto(s), 2); } | |
6706 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_publi
c_dependency(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protob
uf_FileDescriptorProto(s), 10); } | |
6707 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_servi
ce(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDes
criptorProto(s), 6); } | |
6708 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_sourc
e_code_info(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobu
f_FileDescriptorProto(s), 9); } | |
6709 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_weak_
dependency(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf
_FileDescriptorProto(s), 11); } | |
6710 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorSet_file(co
nst upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescript
orSet(s), 1); } | |
6711 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_cc_generic_se
rvices(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_Fil
eOptions(s), 16); } | |
6712 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_go_package(co
nst upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(
s), 11); } | |
6713 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_java_generate
_equals_and_hash(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_pr
otobuf_FileOptions(s), 20); } | |
6714 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_java_generic_
services(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_F
ileOptions(s), 17); } | |
6715 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_java_multiple
_files(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_Fil
eOptions(s), 10); } | |
6716 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_java_outer_cl
assname(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_Fi
leOptions(s), 8); } | |
6717 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_java_package(
const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOption
s(s), 1); } | |
6718 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_optimize_for(
const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOption
s(s), 9); } | |
6719 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_py_generic_se
rvices(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_Fil
eOptions(s), 18); } | |
6720 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_uninterpreted
_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_Fi
leOptions(s), 999); } | |
6721 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_message_se
t_wire_format(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_proto
buf_MessageOptions(s), 1); } | |
6722 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_no_standar
d_descriptor_accessor(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_goog
le_protobuf_MessageOptions(s), 2); } | |
6723 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_uninterpre
ted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf
_MessageOptions(s), 999); } | |
6724 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_inp
ut_type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_Me
thodDescriptorProto(s), 2); } | |
6725 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_nam
e(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MethodDe
scriptorProto(s), 1); } | |
6726 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_opt
ions(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_Metho
dDescriptorProto(s), 4); } | |
6727 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_out
put_type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_M
ethodDescriptorProto(s), 3); } | |
6728 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodOptions_uninterpret
ed_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_
MethodOptions(s), 999); } | |
6729 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceDescriptorProto_me
thod(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_Servi
ceDescriptorProto(s), 2); } | |
6730 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceDescriptorProto_na
me(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_Service
DescriptorProto(s), 1); } | |
6731 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceDescriptorProto_op
tions(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_Serv
iceDescriptorProto(s), 3); } | |
6732 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceOptions_uninterpre
ted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf
_ServiceOptions(s), 999); } | |
6733 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_l
eading_comments(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_pro
tobuf_SourceCodeInfo_Location(s), 3); } | |
6734 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_p
ath(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_Source
CodeInfo_Location(s), 1); } | |
6735 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_s
pan(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_Source
CodeInfo_Location(s), 2); } | |
6736 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_t
railing_comments(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_pr
otobuf_SourceCodeInfo_Location(s), 4); } | |
6737 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_location(c
onst upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_SourceCodeI
nfo(s), 1); } | |
6738 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_NameP
art_is_extension(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_pr
otobuf_UninterpretedOption_NamePart(s), 2); } | |
6739 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_NameP
art_name_part(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_proto
buf_UninterpretedOption_NamePart(s), 1); } | |
6740 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_aggre
gate_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf
_UninterpretedOption(s), 8); } | |
6741 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_doubl
e_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_Un
interpretedOption(s), 6); } | |
6742 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_ident
ifier_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobu
f_UninterpretedOption(s), 3); } | |
6743 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_name(
const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_Uninterpre
tedOption(s), 2); } | |
6744 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_negat
ive_int_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_proto
buf_UninterpretedOption(s), 5); } | |
6745 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_posit
ive_int_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_proto
buf_UninterpretedOption(s), 4); } | |
6746 UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_strin
g_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_Un
interpretedOption(s), 7); } | |
6747 | |
6748 UPB_END_EXTERN_C | |
6749 | |
6750 #ifdef __cplusplus | |
6751 | |
6752 namespace upbdefs { | |
6753 namespace google { | |
6754 namespace protobuf { | |
6755 namespace descriptor { | |
6756 inline upb::reffed_ptr<const upb::SymbolTable> SymbolTable() { | |
6757 const upb::SymbolTable* s = upbdefs_google_protobuf_descriptor(&s); | |
6758 return upb::reffed_ptr<const upb::SymbolTable>(s, &s); | |
6759 } | |
6760 } /* namespace descriptor */ | |
6761 } /* namespace protobuf */ | |
6762 } /* namespace google */ | |
6763 | |
6764 #define RETURN_REFFED(type, func) \ | |
6765 const type* obj = func(upbdefs::google::protobuf::descriptor::SymbolTable().
get()); \ | |
6766 return upb::reffed_ptr<const type>(obj); | |
6767 | |
6768 namespace google { | |
6769 namespace protobuf { | |
6770 namespace DescriptorProto { | |
6771 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::
MessageDef, upbdefs_google_protobuf_DescriptorProto) } | |
6772 inline upb::reffed_ptr<const upb::FieldDef> enum_type() { RETURN_REFFED(upb::Fie
ldDef, upbdefs_google_protobuf_DescriptorProto_enum_type) } | |
6773 inline upb::reffed_ptr<const upb::FieldDef> extension() { RETURN_REFFED(upb::Fie
ldDef, upbdefs_google_protobuf_DescriptorProto_extension) } | |
6774 inline upb::reffed_ptr<const upb::FieldDef> extension_range() { RETURN_REFFED(up
b::FieldDef, upbdefs_google_protobuf_DescriptorProto_extension_range) } | |
6775 inline upb::reffed_ptr<const upb::FieldDef> field() { RETURN_REFFED(upb::FieldDe
f, upbdefs_google_protobuf_DescriptorProto_field) } | |
6776 inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef
, upbdefs_google_protobuf_DescriptorProto_name) } | |
6777 inline upb::reffed_ptr<const upb::FieldDef> nested_type() { RETURN_REFFED(upb::F
ieldDef, upbdefs_google_protobuf_DescriptorProto_nested_type) } | |
6778 inline upb::reffed_ptr<const upb::FieldDef> options() { RETURN_REFFED(upb::Field
Def, upbdefs_google_protobuf_DescriptorProto_options) } | |
6779 } /* namespace DescriptorProto */ | |
6780 } /* namespace protobuf */ | |
6781 } /* namespace google */ | |
6782 | |
6783 namespace google { | |
6784 namespace protobuf { | |
6785 namespace DescriptorProto { | |
6786 namespace ExtensionRange { | |
6787 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::
MessageDef, upbdefs_google_protobuf_DescriptorProto_ExtensionRange) } | |
6788 inline upb::reffed_ptr<const upb::FieldDef> end() { RETURN_REFFED(upb::FieldDef,
upbdefs_google_protobuf_DescriptorProto_ExtensionRange_end) } | |
6789 inline upb::reffed_ptr<const upb::FieldDef> start() { RETURN_REFFED(upb::FieldDe
f, upbdefs_google_protobuf_DescriptorProto_ExtensionRange_start) } | |
6790 } /* namespace ExtensionRange */ | |
6791 } /* namespace DescriptorProto */ | |
6792 } /* namespace protobuf */ | |
6793 } /* namespace google */ | |
6794 | |
6795 namespace google { | |
6796 namespace protobuf { | |
6797 namespace EnumDescriptorProto { | |
6798 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::
MessageDef, upbdefs_google_protobuf_EnumDescriptorProto) } | |
6799 inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef
, upbdefs_google_protobuf_EnumDescriptorProto_name) } | |
6800 inline upb::reffed_ptr<const upb::FieldDef> options() { RETURN_REFFED(upb::Field
Def, upbdefs_google_protobuf_EnumDescriptorProto_options) } | |
6801 inline upb::reffed_ptr<const upb::FieldDef> value() { RETURN_REFFED(upb::FieldDe
f, upbdefs_google_protobuf_EnumDescriptorProto_value) } | |
6802 } /* namespace EnumDescriptorProto */ | |
6803 } /* namespace protobuf */ | |
6804 } /* namespace google */ | |
6805 | |
6806 namespace google { | |
6807 namespace protobuf { | |
6808 namespace EnumOptions { | |
6809 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::
MessageDef, upbdefs_google_protobuf_EnumOptions) } | |
6810 inline upb::reffed_ptr<const upb::FieldDef> allow_alias() { RETURN_REFFED(upb::F
ieldDef, upbdefs_google_protobuf_EnumOptions_allow_alias) } | |
6811 inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFF
ED(upb::FieldDef, upbdefs_google_protobuf_EnumOptions_uninterpreted_option) } | |
6812 } /* namespace EnumOptions */ | |
6813 } /* namespace protobuf */ | |
6814 } /* namespace google */ | |
6815 | |
6816 namespace google { | |
6817 namespace protobuf { | |
6818 namespace EnumValueDescriptorProto { | |
6819 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::
MessageDef, upbdefs_google_protobuf_EnumValueDescriptorProto) } | |
6820 inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef
, upbdefs_google_protobuf_EnumValueDescriptorProto_name) } | |
6821 inline upb::reffed_ptr<const upb::FieldDef> number() { RETURN_REFFED(upb::FieldD
ef, upbdefs_google_protobuf_EnumValueDescriptorProto_number) } | |
6822 inline upb::reffed_ptr<const upb::FieldDef> options() { RETURN_REFFED(upb::Field
Def, upbdefs_google_protobuf_EnumValueDescriptorProto_options) } | |
6823 } /* namespace EnumValueDescriptorProto */ | |
6824 } /* namespace protobuf */ | |
6825 } /* namespace google */ | |
6826 | |
6827 namespace google { | |
6828 namespace protobuf { | |
6829 namespace EnumValueOptions { | |
6830 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::
MessageDef, upbdefs_google_protobuf_EnumValueOptions) } | |
6831 inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFF
ED(upb::FieldDef, upbdefs_google_protobuf_EnumValueOptions_uninterpreted_option)
} | |
6832 } /* namespace EnumValueOptions */ | |
6833 } /* namespace protobuf */ | |
6834 } /* namespace google */ | |
6835 | |
6836 namespace google { | |
6837 namespace protobuf { | |
6838 namespace FieldDescriptorProto { | |
6839 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::
MessageDef, upbdefs_google_protobuf_FieldDescriptorProto) } | |
6840 inline upb::reffed_ptr<const upb::FieldDef> default_value() { RETURN_REFFED(upb:
:FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_default_value) } | |
6841 inline upb::reffed_ptr<const upb::FieldDef> extendee() { RETURN_REFFED(upb::Fiel
dDef, upbdefs_google_protobuf_FieldDescriptorProto_extendee) } | |
6842 inline upb::reffed_ptr<const upb::FieldDef> label() { RETURN_REFFED(upb::FieldDe
f, upbdefs_google_protobuf_FieldDescriptorProto_label) } | |
6843 inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef
, upbdefs_google_protobuf_FieldDescriptorProto_name) } | |
6844 inline upb::reffed_ptr<const upb::FieldDef> number() { RETURN_REFFED(upb::FieldD
ef, upbdefs_google_protobuf_FieldDescriptorProto_number) } | |
6845 inline upb::reffed_ptr<const upb::FieldDef> options() { RETURN_REFFED(upb::Field
Def, upbdefs_google_protobuf_FieldDescriptorProto_options) } | |
6846 inline upb::reffed_ptr<const upb::FieldDef> type() { RETURN_REFFED(upb::FieldDef
, upbdefs_google_protobuf_FieldDescriptorProto_type) } | |
6847 inline upb::reffed_ptr<const upb::FieldDef> type_name() { RETURN_REFFED(upb::Fie
ldDef, upbdefs_google_protobuf_FieldDescriptorProto_type_name) } | |
6848 inline upb::reffed_ptr<const upb::EnumDef> Label() { RETURN_REFFED(upb::EnumDef,
upbdefs_google_protobuf_FieldDescriptorProto_Label) } | |
6849 inline upb::reffed_ptr<const upb::EnumDef> Type() { RETURN_REFFED(upb::EnumDef,
upbdefs_google_protobuf_FieldDescriptorProto_Type) } | |
6850 } /* namespace FieldDescriptorProto */ | |
6851 } /* namespace protobuf */ | |
6852 } /* namespace google */ | |
6853 | |
6854 namespace google { | |
6855 namespace protobuf { | |
6856 namespace FieldOptions { | |
6857 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::
MessageDef, upbdefs_google_protobuf_FieldOptions) } | |
6858 inline upb::reffed_ptr<const upb::FieldDef> ctype() { RETURN_REFFED(upb::FieldDe
f, upbdefs_google_protobuf_FieldOptions_ctype) } | |
6859 inline upb::reffed_ptr<const upb::FieldDef> deprecated() { RETURN_REFFED(upb::Fi
eldDef, upbdefs_google_protobuf_FieldOptions_deprecated) } | |
6860 inline upb::reffed_ptr<const upb::FieldDef> experimental_map_key() { RETURN_REFF
ED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_experimental_map_key) } | |
6861 inline upb::reffed_ptr<const upb::FieldDef> lazy() { RETURN_REFFED(upb::FieldDef
, upbdefs_google_protobuf_FieldOptions_lazy) } | |
6862 inline upb::reffed_ptr<const upb::FieldDef> packed() { RETURN_REFFED(upb::FieldD
ef, upbdefs_google_protobuf_FieldOptions_packed) } | |
6863 inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFF
ED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_uninterpreted_option) } | |
6864 inline upb::reffed_ptr<const upb::FieldDef> weak() { RETURN_REFFED(upb::FieldDef
, upbdefs_google_protobuf_FieldOptions_weak) } | |
6865 inline upb::reffed_ptr<const upb::EnumDef> CType() { RETURN_REFFED(upb::EnumDef,
upbdefs_google_protobuf_FieldOptions_CType) } | |
6866 } /* namespace FieldOptions */ | |
6867 } /* namespace protobuf */ | |
6868 } /* namespace google */ | |
6869 | |
6870 namespace google { | |
6871 namespace protobuf { | |
6872 namespace FileDescriptorProto { | |
6873 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::
MessageDef, upbdefs_google_protobuf_FileDescriptorProto) } | |
6874 inline upb::reffed_ptr<const upb::FieldDef> dependency() { RETURN_REFFED(upb::Fi
eldDef, upbdefs_google_protobuf_FileDescriptorProto_dependency) } | |
6875 inline upb::reffed_ptr<const upb::FieldDef> enum_type() { RETURN_REFFED(upb::Fie
ldDef, upbdefs_google_protobuf_FileDescriptorProto_enum_type) } | |
6876 inline upb::reffed_ptr<const upb::FieldDef> extension() { RETURN_REFFED(upb::Fie
ldDef, upbdefs_google_protobuf_FileDescriptorProto_extension) } | |
6877 inline upb::reffed_ptr<const upb::FieldDef> message_type() { RETURN_REFFED(upb::
FieldDef, upbdefs_google_protobuf_FileDescriptorProto_message_type) } | |
6878 inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef
, upbdefs_google_protobuf_FileDescriptorProto_name) } | |
6879 inline upb::reffed_ptr<const upb::FieldDef> options() { RETURN_REFFED(upb::Field
Def, upbdefs_google_protobuf_FileDescriptorProto_options) } | |
6880 inline upb::reffed_ptr<const upb::FieldDef> package() { RETURN_REFFED(upb::Field
Def, upbdefs_google_protobuf_FileDescriptorProto_package) } | |
6881 inline upb::reffed_ptr<const upb::FieldDef> public_dependency() { RETURN_REFFED(
upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_public_dependency) } | |
6882 inline upb::reffed_ptr<const upb::FieldDef> service() { RETURN_REFFED(upb::Field
Def, upbdefs_google_protobuf_FileDescriptorProto_service) } | |
6883 inline upb::reffed_ptr<const upb::FieldDef> source_code_info() { RETURN_REFFED(u
pb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_source_code_info) } | |
6884 inline upb::reffed_ptr<const upb::FieldDef> weak_dependency() { RETURN_REFFED(up
b::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_weak_dependency) } | |
6885 } /* namespace FileDescriptorProto */ | |
6886 } /* namespace protobuf */ | |
6887 } /* namespace google */ | |
6888 | |
6889 namespace google { | |
6890 namespace protobuf { | |
6891 namespace FileDescriptorSet { | |
6892 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::
MessageDef, upbdefs_google_protobuf_FileDescriptorSet) } | |
6893 inline upb::reffed_ptr<const upb::FieldDef> file() { RETURN_REFFED(upb::FieldDef
, upbdefs_google_protobuf_FileDescriptorSet_file) } | |
6894 } /* namespace FileDescriptorSet */ | |
6895 } /* namespace protobuf */ | |
6896 } /* namespace google */ | |
6897 | |
6898 namespace google { | |
6899 namespace protobuf { | |
6900 namespace FileOptions { | |
6901 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::
MessageDef, upbdefs_google_protobuf_FileOptions) } | |
6902 inline upb::reffed_ptr<const upb::FieldDef> cc_generic_services() { RETURN_REFFE
D(upb::FieldDef, upbdefs_google_protobuf_FileOptions_cc_generic_services) } | |
6903 inline upb::reffed_ptr<const upb::FieldDef> go_package() { RETURN_REFFED(upb::Fi
eldDef, upbdefs_google_protobuf_FileOptions_go_package) } | |
6904 inline upb::reffed_ptr<const upb::FieldDef> java_generate_equals_and_hash() { RE
TURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_java_generate_equ
als_and_hash) } | |
6905 inline upb::reffed_ptr<const upb::FieldDef> java_generic_services() { RETURN_REF
FED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_java_generic_services) } | |
6906 inline upb::reffed_ptr<const upb::FieldDef> java_multiple_files() { RETURN_REFFE
D(upb::FieldDef, upbdefs_google_protobuf_FileOptions_java_multiple_files) } | |
6907 inline upb::reffed_ptr<const upb::FieldDef> java_outer_classname() { RETURN_REFF
ED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_java_outer_classname) } | |
6908 inline upb::reffed_ptr<const upb::FieldDef> java_package() { RETURN_REFFED(upb::
FieldDef, upbdefs_google_protobuf_FileOptions_java_package) } | |
6909 inline upb::reffed_ptr<const upb::FieldDef> optimize_for() { RETURN_REFFED(upb::
FieldDef, upbdefs_google_protobuf_FileOptions_optimize_for) } | |
6910 inline upb::reffed_ptr<const upb::FieldDef> py_generic_services() { RETURN_REFFE
D(upb::FieldDef, upbdefs_google_protobuf_FileOptions_py_generic_services) } | |
6911 inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFF
ED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_uninterpreted_option) } | |
6912 inline upb::reffed_ptr<const upb::EnumDef> OptimizeMode() { RETURN_REFFED(upb::E
numDef, upbdefs_google_protobuf_FileOptions_OptimizeMode) } | |
6913 } /* namespace FileOptions */ | |
6914 } /* namespace protobuf */ | |
6915 } /* namespace google */ | |
6916 | |
6917 namespace google { | |
6918 namespace protobuf { | |
6919 namespace MessageOptions { | |
6920 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::
MessageDef, upbdefs_google_protobuf_MessageOptions) } | |
6921 inline upb::reffed_ptr<const upb::FieldDef> message_set_wire_format() { RETURN_R
EFFED(upb::FieldDef, upbdefs_google_protobuf_MessageOptions_message_set_wire_for
mat) } | |
6922 inline upb::reffed_ptr<const upb::FieldDef> no_standard_descriptor_accessor() {
RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MessageOptions_no_standard_
descriptor_accessor) } | |
6923 inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFF
ED(upb::FieldDef, upbdefs_google_protobuf_MessageOptions_uninterpreted_option) } | |
6924 } /* namespace MessageOptions */ | |
6925 } /* namespace protobuf */ | |
6926 } /* namespace google */ | |
6927 | |
6928 namespace google { | |
6929 namespace protobuf { | |
6930 namespace MethodDescriptorProto { | |
6931 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::
MessageDef, upbdefs_google_protobuf_MethodDescriptorProto) } | |
6932 inline upb::reffed_ptr<const upb::FieldDef> input_type() { RETURN_REFFED(upb::Fi
eldDef, upbdefs_google_protobuf_MethodDescriptorProto_input_type) } | |
6933 inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef
, upbdefs_google_protobuf_MethodDescriptorProto_name) } | |
6934 inline upb::reffed_ptr<const upb::FieldDef> options() { RETURN_REFFED(upb::Field
Def, upbdefs_google_protobuf_MethodDescriptorProto_options) } | |
6935 inline upb::reffed_ptr<const upb::FieldDef> output_type() { RETURN_REFFED(upb::F
ieldDef, upbdefs_google_protobuf_MethodDescriptorProto_output_type) } | |
6936 } /* namespace MethodDescriptorProto */ | |
6937 } /* namespace protobuf */ | |
6938 } /* namespace google */ | |
6939 | |
6940 namespace google { | |
6941 namespace protobuf { | |
6942 namespace MethodOptions { | |
6943 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::
MessageDef, upbdefs_google_protobuf_MethodOptions) } | |
6944 inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFF
ED(upb::FieldDef, upbdefs_google_protobuf_MethodOptions_uninterpreted_option) } | |
6945 } /* namespace MethodOptions */ | |
6946 } /* namespace protobuf */ | |
6947 } /* namespace google */ | |
6948 | |
6949 namespace google { | |
6950 namespace protobuf { | |
6951 namespace ServiceDescriptorProto { | |
6952 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::
MessageDef, upbdefs_google_protobuf_ServiceDescriptorProto) } | |
6953 inline upb::reffed_ptr<const upb::FieldDef> method() { RETURN_REFFED(upb::FieldD
ef, upbdefs_google_protobuf_ServiceDescriptorProto_method) } | |
6954 inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef
, upbdefs_google_protobuf_ServiceDescriptorProto_name) } | |
6955 inline upb::reffed_ptr<const upb::FieldDef> options() { RETURN_REFFED(upb::Field
Def, upbdefs_google_protobuf_ServiceDescriptorProto_options) } | |
6956 } /* namespace ServiceDescriptorProto */ | |
6957 } /* namespace protobuf */ | |
6958 } /* namespace google */ | |
6959 | |
6960 namespace google { | |
6961 namespace protobuf { | |
6962 namespace ServiceOptions { | |
6963 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::
MessageDef, upbdefs_google_protobuf_ServiceOptions) } | |
6964 inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFF
ED(upb::FieldDef, upbdefs_google_protobuf_ServiceOptions_uninterpreted_option) } | |
6965 } /* namespace ServiceOptions */ | |
6966 } /* namespace protobuf */ | |
6967 } /* namespace google */ | |
6968 | |
6969 namespace google { | |
6970 namespace protobuf { | |
6971 namespace SourceCodeInfo { | |
6972 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::
MessageDef, upbdefs_google_protobuf_SourceCodeInfo) } | |
6973 inline upb::reffed_ptr<const upb::FieldDef> location() { RETURN_REFFED(upb::Fiel
dDef, upbdefs_google_protobuf_SourceCodeInfo_location) } | |
6974 } /* namespace SourceCodeInfo */ | |
6975 } /* namespace protobuf */ | |
6976 } /* namespace google */ | |
6977 | |
6978 namespace google { | |
6979 namespace protobuf { | |
6980 namespace SourceCodeInfo { | |
6981 namespace Location { | |
6982 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::
MessageDef, upbdefs_google_protobuf_SourceCodeInfo_Location) } | |
6983 inline upb::reffed_ptr<const upb::FieldDef> leading_comments() { RETURN_REFFED(u
pb::FieldDef, upbdefs_google_protobuf_SourceCodeInfo_Location_leading_comments)
} | |
6984 inline upb::reffed_ptr<const upb::FieldDef> path() { RETURN_REFFED(upb::FieldDef
, upbdefs_google_protobuf_SourceCodeInfo_Location_path) } | |
6985 inline upb::reffed_ptr<const upb::FieldDef> span() { RETURN_REFFED(upb::FieldDef
, upbdefs_google_protobuf_SourceCodeInfo_Location_span) } | |
6986 inline upb::reffed_ptr<const upb::FieldDef> trailing_comments() { RETURN_REFFED(
upb::FieldDef, upbdefs_google_protobuf_SourceCodeInfo_Location_trailing_comments
) } | |
6987 } /* namespace Location */ | |
6988 } /* namespace SourceCodeInfo */ | |
6989 } /* namespace protobuf */ | |
6990 } /* namespace google */ | |
6991 | |
6992 namespace google { | |
6993 namespace protobuf { | |
6994 namespace UninterpretedOption { | |
6995 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::
MessageDef, upbdefs_google_protobuf_UninterpretedOption) } | |
6996 inline upb::reffed_ptr<const upb::FieldDef> aggregate_value() { RETURN_REFFED(up
b::FieldDef, upbdefs_google_protobuf_UninterpretedOption_aggregate_value) } | |
6997 inline upb::reffed_ptr<const upb::FieldDef> double_value() { RETURN_REFFED(upb::
FieldDef, upbdefs_google_protobuf_UninterpretedOption_double_value) } | |
6998 inline upb::reffed_ptr<const upb::FieldDef> identifier_value() { RETURN_REFFED(u
pb::FieldDef, upbdefs_google_protobuf_UninterpretedOption_identifier_value) } | |
6999 inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef
, upbdefs_google_protobuf_UninterpretedOption_name) } | |
7000 inline upb::reffed_ptr<const upb::FieldDef> negative_int_value() { RETURN_REFFED
(upb::FieldDef, upbdefs_google_protobuf_UninterpretedOption_negative_int_value)
} | |
7001 inline upb::reffed_ptr<const upb::FieldDef> positive_int_value() { RETURN_REFFED
(upb::FieldDef, upbdefs_google_protobuf_UninterpretedOption_positive_int_value)
} | |
7002 inline upb::reffed_ptr<const upb::FieldDef> string_value() { RETURN_REFFED(upb::
FieldDef, upbdefs_google_protobuf_UninterpretedOption_string_value) } | |
7003 } /* namespace UninterpretedOption */ | |
7004 } /* namespace protobuf */ | |
7005 } /* namespace google */ | |
7006 | |
7007 namespace google { | |
7008 namespace protobuf { | |
7009 namespace UninterpretedOption { | |
7010 namespace NamePart { | |
7011 inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::
MessageDef, upbdefs_google_protobuf_UninterpretedOption_NamePart) } | |
7012 inline upb::reffed_ptr<const upb::FieldDef> is_extension() { RETURN_REFFED(upb::
FieldDef, upbdefs_google_protobuf_UninterpretedOption_NamePart_is_extension) } | |
7013 inline upb::reffed_ptr<const upb::FieldDef> name_part() { RETURN_REFFED(upb::Fie
ldDef, upbdefs_google_protobuf_UninterpretedOption_NamePart_name_part) } | |
7014 } /* namespace NamePart */ | |
7015 } /* namespace UninterpretedOption */ | |
7016 } /* namespace protobuf */ | |
7017 } /* namespace google */ | |
7018 | |
7019 } /* namespace upbdefs */ | |
7020 | |
7021 | |
7022 #undef RETURN_REFFED | |
7023 #endif /* __cplusplus */ | |
7024 | |
7025 #endif /* GOOGLE_PROTOBUF_DESCRIPTOR_UPB_H_ */ | |
7026 /* | |
7027 ** Internal-only definitions for the decoder. | |
7028 */ | |
7029 | |
7030 #ifndef UPB_DECODER_INT_H_ | |
7031 #define UPB_DECODER_INT_H_ | |
7032 | |
7033 #include <stdlib.h> | |
7034 /* | |
7035 ** upb::pb::Decoder | |
7036 ** | |
7037 ** A high performance, streaming, resumable decoder for the binary protobuf | |
7038 ** format. | |
7039 ** | |
7040 ** This interface works the same regardless of what decoder backend is being | |
7041 ** used. A client of this class does not need to know whether decoding is using | |
7042 ** a JITted decoder (DynASM, LLVM, etc) or an interpreted decoder. By default, | |
7043 ** it will always use the fastest available decoder. However, you can call | |
7044 ** set_allow_jit(false) to disable any JIT decoder that might be available. | |
7045 ** This is primarily useful for testing purposes. | |
7046 */ | |
7047 | |
7048 #ifndef UPB_DECODER_H_ | |
7049 #define UPB_DECODER_H_ | |
7050 | |
7051 | |
7052 #ifdef __cplusplus | |
7053 namespace upb { | |
7054 namespace pb { | |
7055 class CodeCache; | |
7056 class Decoder; | |
7057 class DecoderMethod; | |
7058 class DecoderMethodOptions; | |
7059 } /* namespace pb */ | |
7060 } /* namespace upb */ | |
7061 #endif | |
7062 | |
7063 UPB_DECLARE_TYPE(upb::pb::CodeCache, upb_pbcodecache) | |
7064 UPB_DECLARE_TYPE(upb::pb::Decoder, upb_pbdecoder) | |
7065 UPB_DECLARE_TYPE(upb::pb::DecoderMethodOptions, upb_pbdecodermethodopts) | |
7066 | |
7067 UPB_DECLARE_DERIVED_TYPE(upb::pb::DecoderMethod, upb::RefCounted, | |
7068 upb_pbdecodermethod, upb_refcounted) | |
7069 | |
7070 #ifdef __cplusplus | |
7071 | |
7072 /* The parameters one uses to construct a DecoderMethod. | |
7073 * TODO(haberman): move allowjit here? Seems more convenient for users. | |
7074 * TODO(haberman): move this to be heap allocated for ABI stability. */ | |
7075 class upb::pb::DecoderMethodOptions { | |
7076 public: | |
7077 /* Parameter represents the destination handlers that this method will push | |
7078 * to. */ | |
7079 explicit DecoderMethodOptions(const Handlers* dest_handlers); | |
7080 | |
7081 /* Should the decoder push submessages to lazy handlers for fields that have | |
7082 * them? The caller should set this iff the lazy handlers expect data that is | |
7083 * in protobuf binary format and the caller wishes to lazy parse it. */ | |
7084 void set_lazy(bool lazy); | |
7085 #else | |
7086 struct upb_pbdecodermethodopts { | |
7087 #endif | |
7088 const upb_handlers *handlers; | |
7089 bool lazy; | |
7090 }; | |
7091 | |
7092 #ifdef __cplusplus | |
7093 | |
7094 /* Represents the code to parse a protobuf according to a destination | |
7095 * Handlers. */ | |
7096 class upb::pb::DecoderMethod { | |
7097 public: | |
7098 /* Include base methods from upb::ReferenceCounted. */ | |
7099 UPB_REFCOUNTED_CPPMETHODS | |
7100 | |
7101 /* The destination handlers that are statically bound to this method. | |
7102 * This method is only capable of outputting to a sink that uses these | |
7103 * handlers. */ | |
7104 const Handlers* dest_handlers() const; | |
7105 | |
7106 /* The input handlers for this decoder method. */ | |
7107 const BytesHandler* input_handler() const; | |
7108 | |
7109 /* Whether this method is native. */ | |
7110 bool is_native() const; | |
7111 | |
7112 /* Convenience method for generating a DecoderMethod without explicitly | |
7113 * creating a CodeCache. */ | |
7114 static reffed_ptr<const DecoderMethod> New(const DecoderMethodOptions& opts); | |
7115 | |
7116 private: | |
7117 UPB_DISALLOW_POD_OPS(DecoderMethod, upb::pb::DecoderMethod) | |
7118 }; | |
7119 | |
7120 #endif | |
7121 | |
7122 /* Preallocation hint: decoder won't allocate more bytes than this when first | |
7123 * constructed. This hint may be an overestimate for some build configurations. | |
7124 * But if the decoder library is upgraded without recompiling the application, | |
7125 * it may be an underestimate. */ | |
7126 #define UPB_PB_DECODER_SIZE 4400 | |
7127 | |
7128 #ifdef __cplusplus | |
7129 | |
7130 /* A Decoder receives binary protobuf data on its input sink and pushes the | |
7131 * decoded data to its output sink. */ | |
7132 class upb::pb::Decoder { | |
7133 public: | |
7134 /* Constructs a decoder instance for the given method, which must outlive this | |
7135 * decoder. Any errors during parsing will be set on the given status, which | |
7136 * must also outlive this decoder. | |
7137 * | |
7138 * The sink must match the given method. */ | |
7139 static Decoder* Create(Environment* env, const DecoderMethod* method, | |
7140 Sink* output); | |
7141 | |
7142 /* Returns the DecoderMethod this decoder is parsing from. */ | |
7143 const DecoderMethod* method() const; | |
7144 | |
7145 /* The sink on which this decoder receives input. */ | |
7146 BytesSink* input(); | |
7147 | |
7148 /* Returns number of bytes successfully parsed. | |
7149 * | |
7150 * This can be useful for determining the stream position where an error | |
7151 * occurred. | |
7152 * | |
7153 * This value may not be up-to-date when called from inside a parsing | |
7154 * callback. */ | |
7155 uint64_t BytesParsed() const; | |
7156 | |
7157 /* Gets/sets the parsing nexting limit. If the total number of nested | |
7158 * submessages and repeated fields hits this limit, parsing will fail. This | |
7159 * is a resource limit that controls the amount of memory used by the parsing | |
7160 * stack. | |
7161 * | |
7162 * Setting the limit will fail if the parser is currently suspended at a depth | |
7163 * greater than this, or if memory allocation of the stack fails. */ | |
7164 size_t max_nesting() const; | |
7165 bool set_max_nesting(size_t max); | |
7166 | |
7167 void Reset(); | |
7168 | |
7169 static const size_t kSize = UPB_PB_DECODER_SIZE; | |
7170 | |
7171 private: | |
7172 UPB_DISALLOW_POD_OPS(Decoder, upb::pb::Decoder) | |
7173 }; | |
7174 | |
7175 #endif /* __cplusplus */ | |
7176 | |
7177 #ifdef __cplusplus | |
7178 | |
7179 /* A class for caching protobuf processing code, whether bytecode for the | |
7180 * interpreted decoder or machine code for the JIT. | |
7181 * | |
7182 * This class is not thread-safe. | |
7183 * | |
7184 * TODO(haberman): move this to be heap allocated for ABI stability. */ | |
7185 class upb::pb::CodeCache { | |
7186 public: | |
7187 CodeCache(); | |
7188 ~CodeCache(); | |
7189 | |
7190 /* Whether the cache is allowed to generate machine code. Defaults to true. | |
7191 * There is no real reason to turn it off except for testing or if you are | |
7192 * having a specific problem with the JIT. | |
7193 * | |
7194 * Note that allow_jit = true does not *guarantee* that the code will be JIT | |
7195 * compiled. If this platform is not supported or the JIT was not compiled | |
7196 * in, the code may still be interpreted. */ | |
7197 bool allow_jit() const; | |
7198 | |
7199 /* This may only be called when the object is first constructed, and prior to | |
7200 * any code generation, otherwise returns false and does nothing. */ | |
7201 bool set_allow_jit(bool allow); | |
7202 | |
7203 /* Returns a DecoderMethod that can push data to the given handlers. | |
7204 * If a suitable method already exists, it will be returned from the cache. | |
7205 * | |
7206 * Specifying the destination handlers here allows the DecoderMethod to be | |
7207 * statically bound to the destination handlers if possible, which can allow | |
7208 * more efficient decoding. However the returned method may or may not | |
7209 * actually be statically bound. But in all cases, the returned method can | |
7210 * push data to the given handlers. */ | |
7211 const DecoderMethod *GetDecoderMethod(const DecoderMethodOptions& opts); | |
7212 | |
7213 /* If/when someone needs to explicitly create a dynamically-bound | |
7214 * DecoderMethod*, we can add a method to get it here. */ | |
7215 | |
7216 private: | |
7217 UPB_DISALLOW_COPY_AND_ASSIGN(CodeCache) | |
7218 #else | |
7219 struct upb_pbcodecache { | |
7220 #endif | |
7221 bool allow_jit_; | |
7222 | |
7223 /* Array of mgroups. */ | |
7224 upb_inttable groups; | |
7225 }; | |
7226 | |
7227 UPB_BEGIN_EXTERN_C | |
7228 | |
7229 upb_pbdecoder *upb_pbdecoder_create(upb_env *e, | |
7230 const upb_pbdecodermethod *method, | |
7231 upb_sink *output); | |
7232 const upb_pbdecodermethod *upb_pbdecoder_method(const upb_pbdecoder *d); | |
7233 upb_bytessink *upb_pbdecoder_input(upb_pbdecoder *d); | |
7234 uint64_t upb_pbdecoder_bytesparsed(const upb_pbdecoder *d); | |
7235 size_t upb_pbdecoder_maxnesting(const upb_pbdecoder *d); | |
7236 bool upb_pbdecoder_setmaxnesting(upb_pbdecoder *d, size_t max); | |
7237 void upb_pbdecoder_reset(upb_pbdecoder *d); | |
7238 | |
7239 void upb_pbdecodermethodopts_init(upb_pbdecodermethodopts *opts, | |
7240 const upb_handlers *h); | |
7241 void upb_pbdecodermethodopts_setlazy(upb_pbdecodermethodopts *opts, bool lazy); | |
7242 | |
7243 | |
7244 /* Include refcounted methods like upb_pbdecodermethod_ref(). */ | |
7245 UPB_REFCOUNTED_CMETHODS(upb_pbdecodermethod, upb_pbdecodermethod_upcast) | |
7246 | |
7247 const upb_handlers *upb_pbdecodermethod_desthandlers( | |
7248 const upb_pbdecodermethod *m); | |
7249 const upb_byteshandler *upb_pbdecodermethod_inputhandler( | |
7250 const upb_pbdecodermethod *m); | |
7251 bool upb_pbdecodermethod_isnative(const upb_pbdecodermethod *m); | |
7252 const upb_pbdecodermethod *upb_pbdecodermethod_new( | |
7253 const upb_pbdecodermethodopts *opts, const void *owner); | |
7254 | |
7255 void upb_pbcodecache_init(upb_pbcodecache *c); | |
7256 void upb_pbcodecache_uninit(upb_pbcodecache *c); | |
7257 bool upb_pbcodecache_allowjit(const upb_pbcodecache *c); | |
7258 bool upb_pbcodecache_setallowjit(upb_pbcodecache *c, bool allow); | |
7259 const upb_pbdecodermethod *upb_pbcodecache_getdecodermethod( | |
7260 upb_pbcodecache *c, const upb_pbdecodermethodopts *opts); | |
7261 | |
7262 UPB_END_EXTERN_C | |
7263 | |
7264 #ifdef __cplusplus | |
7265 | |
7266 namespace upb { | |
7267 | |
7268 namespace pb { | |
7269 | |
7270 /* static */ | |
7271 inline Decoder* Decoder::Create(Environment* env, const DecoderMethod* m, | |
7272 Sink* sink) { | |
7273 return upb_pbdecoder_create(env, m, sink); | |
7274 } | |
7275 inline const DecoderMethod* Decoder::method() const { | |
7276 return upb_pbdecoder_method(this); | |
7277 } | |
7278 inline BytesSink* Decoder::input() { | |
7279 return upb_pbdecoder_input(this); | |
7280 } | |
7281 inline uint64_t Decoder::BytesParsed() const { | |
7282 return upb_pbdecoder_bytesparsed(this); | |
7283 } | |
7284 inline size_t Decoder::max_nesting() const { | |
7285 return upb_pbdecoder_maxnesting(this); | |
7286 } | |
7287 inline bool Decoder::set_max_nesting(size_t max) { | |
7288 return upb_pbdecoder_setmaxnesting(this, max); | |
7289 } | |
7290 inline void Decoder::Reset() { upb_pbdecoder_reset(this); } | |
7291 | |
7292 inline DecoderMethodOptions::DecoderMethodOptions(const Handlers* h) { | |
7293 upb_pbdecodermethodopts_init(this, h); | |
7294 } | |
7295 inline void DecoderMethodOptions::set_lazy(bool lazy) { | |
7296 upb_pbdecodermethodopts_setlazy(this, lazy); | |
7297 } | |
7298 | |
7299 inline const Handlers* DecoderMethod::dest_handlers() const { | |
7300 return upb_pbdecodermethod_desthandlers(this); | |
7301 } | |
7302 inline const BytesHandler* DecoderMethod::input_handler() const { | |
7303 return upb_pbdecodermethod_inputhandler(this); | |
7304 } | |
7305 inline bool DecoderMethod::is_native() const { | |
7306 return upb_pbdecodermethod_isnative(this); | |
7307 } | |
7308 /* static */ | |
7309 inline reffed_ptr<const DecoderMethod> DecoderMethod::New( | |
7310 const DecoderMethodOptions &opts) { | |
7311 const upb_pbdecodermethod *m = upb_pbdecodermethod_new(&opts, &m); | |
7312 return reffed_ptr<const DecoderMethod>(m, &m); | |
7313 } | |
7314 | |
7315 inline CodeCache::CodeCache() { | |
7316 upb_pbcodecache_init(this); | |
7317 } | |
7318 inline CodeCache::~CodeCache() { | |
7319 upb_pbcodecache_uninit(this); | |
7320 } | |
7321 inline bool CodeCache::allow_jit() const { | |
7322 return upb_pbcodecache_allowjit(this); | |
7323 } | |
7324 inline bool CodeCache::set_allow_jit(bool allow) { | |
7325 return upb_pbcodecache_setallowjit(this, allow); | |
7326 } | |
7327 inline const DecoderMethod *CodeCache::GetDecoderMethod( | |
7328 const DecoderMethodOptions& opts) { | |
7329 return upb_pbcodecache_getdecodermethod(this, &opts); | |
7330 } | |
7331 | |
7332 } /* namespace pb */ | |
7333 } /* namespace upb */ | |
7334 | |
7335 #endif /* __cplusplus */ | |
7336 | |
7337 #endif /* UPB_DECODER_H_ */ | |
7338 | |
7339 /* C++ names are not actually used since this type isn't exposed to users. */ | |
7340 #ifdef __cplusplus | |
7341 namespace upb { | |
7342 namespace pb { | |
7343 class MessageGroup; | |
7344 } /* namespace pb */ | |
7345 } /* namespace upb */ | |
7346 #endif | |
7347 UPB_DECLARE_DERIVED_TYPE(upb::pb::MessageGroup, upb::RefCounted, | |
7348 mgroup, upb_refcounted) | |
7349 | |
7350 /* Opcode definitions. The canonical meaning of each opcode is its | |
7351 * implementation in the interpreter (the JIT is written to match this). | |
7352 * | |
7353 * All instructions have the opcode in the low byte. | |
7354 * Instruction format for most instructions is: | |
7355 * | |
7356 * +-------------------+--------+ | |
7357 * | arg (24) | op (8) | | |
7358 * +-------------------+--------+ | |
7359 * | |
7360 * Exceptions are indicated below. A few opcodes are multi-word. */ | |
7361 typedef enum { | |
7362 /* Opcodes 1-8, 13, 15-18 parse their respective descriptor types. | |
7363 * Arg for all of these is the upb selector for this field. */ | |
7364 #define T(type) OP_PARSE_ ## type = UPB_DESCRIPTOR_TYPE_ ## type | |
7365 T(DOUBLE), T(FLOAT), T(INT64), T(UINT64), T(INT32), T(FIXED64), T(FIXED32), | |
7366 T(BOOL), T(UINT32), T(SFIXED32), T(SFIXED64), T(SINT32), T(SINT64), | |
7367 #undef T | |
7368 OP_STARTMSG = 9, /* No arg. */ | |
7369 OP_ENDMSG = 10, /* No arg. */ | |
7370 OP_STARTSEQ = 11, | |
7371 OP_ENDSEQ = 12, | |
7372 OP_STARTSUBMSG = 14, | |
7373 OP_ENDSUBMSG = 19, | |
7374 OP_STARTSTR = 20, | |
7375 OP_STRING = 21, | |
7376 OP_ENDSTR = 22, | |
7377 | |
7378 OP_PUSHTAGDELIM = 23, /* No arg. */ | |
7379 OP_PUSHLENDELIM = 24, /* No arg. */ | |
7380 OP_POP = 25, /* No arg. */ | |
7381 OP_SETDELIM = 26, /* No arg. */ | |
7382 OP_SETBIGGROUPNUM = 27, /* two words: | |
7383 * | unused (24) | opc (8) | | |
7384 * | groupnum (32) | */ | |
7385 OP_CHECKDELIM = 28, | |
7386 OP_CALL = 29, | |
7387 OP_RET = 30, | |
7388 OP_BRANCH = 31, | |
7389 | |
7390 /* Different opcodes depending on how many bytes expected. */ | |
7391 OP_TAG1 = 32, /* | match tag (16) | jump target (8) | opc (8) | */ | |
7392 OP_TAG2 = 33, /* | match tag (16) | jump target (8) | opc (8) | */ | |
7393 OP_TAGN = 34, /* three words: */ | |
7394 /* | unused (16) | jump target(8) | opc (8) | */ | |
7395 /* | match tag 1 (32) | */ | |
7396 /* | match tag 2 (32) | */ | |
7397 | |
7398 OP_SETDISPATCH = 35, /* N words: */ | |
7399 /* | unused (24) | opc | */ | |
7400 /* | upb_inttable* (32 or 64) | */ | |
7401 | |
7402 OP_DISPATCH = 36, /* No arg. */ | |
7403 | |
7404 OP_HALT = 37 /* No arg. */ | |
7405 } opcode; | |
7406 | |
7407 #define OP_MAX OP_HALT | |
7408 | |
7409 UPB_INLINE opcode getop(uint32_t instr) { return instr & 0xff; } | |
7410 | |
7411 /* Method group; represents a set of decoder methods that had their code | |
7412 * emitted together, and must therefore be freed together. Immutable once | |
7413 * created. It is possible we may want to expose this to users at some point. | |
7414 * | |
7415 * Overall ownership of Decoder objects looks like this: | |
7416 * | |
7417 * +----------+ | |
7418 * | | <---> DecoderMethod | |
7419 * | method | | |
7420 * CodeCache ---> | group | <---> DecoderMethod | |
7421 * | | | |
7422 * | (mgroup) | <---> DecoderMethod | |
7423 * +----------+ | |
7424 */ | |
7425 struct mgroup { | |
7426 upb_refcounted base; | |
7427 | |
7428 /* Maps upb_msgdef/upb_handlers -> upb_pbdecodermethod. We own refs on the | |
7429 * methods. */ | |
7430 upb_inttable methods; | |
7431 | |
7432 /* When we add the ability to link to previously existing mgroups, we'll | |
7433 * need an array of mgroups we reference here, and own refs on them. */ | |
7434 | |
7435 /* The bytecode for our methods, if any exists. Owned by us. */ | |
7436 uint32_t *bytecode; | |
7437 uint32_t *bytecode_end; | |
7438 | |
7439 #ifdef UPB_USE_JIT_X64 | |
7440 /* JIT-generated machine code, if any. */ | |
7441 upb_string_handlerfunc *jit_code; | |
7442 /* The size of the jit_code (required to munmap()). */ | |
7443 size_t jit_size; | |
7444 char *debug_info; | |
7445 void *dl; | |
7446 #endif | |
7447 }; | |
7448 | |
7449 /* The maximum that any submessages can be nested. Matches proto2's limit. | |
7450 * This specifies the size of the decoder's statically-sized array and therefore | |
7451 * setting it high will cause the upb::pb::Decoder object to be larger. | |
7452 * | |
7453 * If necessary we can add a runtime-settable property to Decoder that allow | |
7454 * this to be larger than the compile-time setting, but this would add | |
7455 * complexity, particularly since we would have to decide how/if to give users | |
7456 * the ability to set a custom memory allocation function. */ | |
7457 #define UPB_DECODER_MAX_NESTING 64 | |
7458 | |
7459 /* Internal-only struct used by the decoder. */ | |
7460 typedef struct { | |
7461 /* Space optimization note: we store two pointers here that the JIT | |
7462 * doesn't need at all; the upb_handlers* inside the sink and | |
7463 * the dispatch table pointer. We can optimze so that the JIT uses | |
7464 * smaller stack frames than the interpreter. The only thing we need | |
7465 * to guarantee is that the fallback routines can find end_ofs. */ | |
7466 upb_sink sink; | |
7467 | |
7468 /* The absolute stream offset of the end-of-frame delimiter. | |
7469 * Non-delimited frames (groups and non-packed repeated fields) reuse the | |
7470 * delimiter of their parent, even though the frame may not end there. | |
7471 * | |
7472 * NOTE: the JIT stores a slightly different value here for non-top frames. | |
7473 * It stores the value relative to the end of the enclosed message. But the | |
7474 * top frame is still stored the same way, which is important for ensuring | |
7475 * that calls from the JIT into C work correctly. */ | |
7476 uint64_t end_ofs; | |
7477 const uint32_t *base; | |
7478 | |
7479 /* 0 indicates a length-delimited field. | |
7480 * A positive number indicates a known group. | |
7481 * A negative number indicates an unknown group. */ | |
7482 int32_t groupnum; | |
7483 upb_inttable *dispatch; /* Not used by the JIT. */ | |
7484 } upb_pbdecoder_frame; | |
7485 | |
7486 struct upb_pbdecodermethod { | |
7487 upb_refcounted base; | |
7488 | |
7489 /* While compiling, the base is relative in "ofs", after compiling it is | |
7490 * absolute in "ptr". */ | |
7491 union { | |
7492 uint32_t ofs; /* PC offset of method. */ | |
7493 void *ptr; /* Pointer to bytecode or machine code for this method. */ | |
7494 } code_base; | |
7495 | |
7496 /* The decoder method group to which this method belongs. We own a ref. | |
7497 * Owning a ref on the entire group is more coarse-grained than is strictly | |
7498 * necessary; all we truly require is that methods we directly reference | |
7499 * outlive us, while the group could contain many other messages we don't | |
7500 * require. But the group represents the messages that were | |
7501 * allocated+compiled together, so it makes the most sense to free them | |
7502 * together also. */ | |
7503 const upb_refcounted *group; | |
7504 | |
7505 /* Whether this method is native code or bytecode. */ | |
7506 bool is_native_; | |
7507 | |
7508 /* The handler one calls to invoke this method. */ | |
7509 upb_byteshandler input_handler_; | |
7510 | |
7511 /* The destination handlers this method is bound to. We own a ref. */ | |
7512 const upb_handlers *dest_handlers_; | |
7513 | |
7514 /* Dispatch table -- used by both bytecode decoder and JIT when encountering a | |
7515 * field number that wasn't the one we were expecting to see. See | |
7516 * decoder.int.h for the layout of this table. */ | |
7517 upb_inttable dispatch; | |
7518 }; | |
7519 | |
7520 struct upb_pbdecoder { | |
7521 upb_env *env; | |
7522 | |
7523 /* Our input sink. */ | |
7524 upb_bytessink input_; | |
7525 | |
7526 /* The decoder method we are parsing with (owned). */ | |
7527 const upb_pbdecodermethod *method_; | |
7528 | |
7529 size_t call_len; | |
7530 const uint32_t *pc, *last; | |
7531 | |
7532 /* Current input buffer and its stream offset. */ | |
7533 const char *buf, *ptr, *end, *checkpoint; | |
7534 | |
7535 /* End of the delimited region, relative to ptr, NULL if not in this buf. */ | |
7536 const char *delim_end; | |
7537 | |
7538 /* End of the delimited region, relative to ptr, end if not in this buf. */ | |
7539 const char *data_end; | |
7540 | |
7541 /* Overall stream offset of "buf." */ | |
7542 uint64_t bufstart_ofs; | |
7543 | |
7544 /* Buffer for residual bytes not parsed from the previous buffer. | |
7545 * The maximum number of residual bytes we require is 12; a five-byte | |
7546 * unknown tag plus an eight-byte value, less one because the value | |
7547 * is only a partial value. */ | |
7548 char residual[12]; | |
7549 char *residual_end; | |
7550 | |
7551 /* Stores the user buffer passed to our decode function. */ | |
7552 const char *buf_param; | |
7553 size_t size_param; | |
7554 const upb_bufhandle *handle; | |
7555 | |
7556 /* Our internal stack. */ | |
7557 upb_pbdecoder_frame *stack, *top, *limit; | |
7558 const uint32_t **callstack; | |
7559 size_t stack_size; | |
7560 | |
7561 upb_status *status; | |
7562 | |
7563 #ifdef UPB_USE_JIT_X64 | |
7564 /* Used momentarily by the generated code to store a value while a user | |
7565 * function is called. */ | |
7566 uint32_t tmp_len; | |
7567 | |
7568 const void *saved_rsp; | |
7569 #endif | |
7570 }; | |
7571 | |
7572 /* Decoder entry points; used as handlers. */ | |
7573 void *upb_pbdecoder_startbc(void *closure, const void *pc, size_t size_hint); | |
7574 void *upb_pbdecoder_startjit(void *closure, const void *hd, size_t size_hint); | |
7575 size_t upb_pbdecoder_decode(void *closure, const void *hd, const char *buf, | |
7576 size_t size, const upb_bufhandle *handle); | |
7577 bool upb_pbdecoder_end(void *closure, const void *handler_data); | |
7578 | |
7579 /* Decoder-internal functions that the JIT calls to handle fallback paths. */ | |
7580 int32_t upb_pbdecoder_resume(upb_pbdecoder *d, void *p, const char *buf, | |
7581 size_t size, const upb_bufhandle *handle); | |
7582 size_t upb_pbdecoder_suspend(upb_pbdecoder *d); | |
7583 int32_t upb_pbdecoder_skipunknown(upb_pbdecoder *d, int32_t fieldnum, | |
7584 uint8_t wire_type); | |
7585 int32_t upb_pbdecoder_checktag_slow(upb_pbdecoder *d, uint64_t expected); | |
7586 int32_t upb_pbdecoder_decode_varint_slow(upb_pbdecoder *d, uint64_t *u64); | |
7587 int32_t upb_pbdecoder_decode_f32(upb_pbdecoder *d, uint32_t *u32); | |
7588 int32_t upb_pbdecoder_decode_f64(upb_pbdecoder *d, uint64_t *u64); | |
7589 void upb_pbdecoder_seterr(upb_pbdecoder *d, const char *msg); | |
7590 | |
7591 /* Error messages that are shared between the bytecode and JIT decoders. */ | |
7592 extern const char *kPbDecoderStackOverflow; | |
7593 | |
7594 /* Access to decoderplan members needed by the decoder. */ | |
7595 const char *upb_pbdecoder_getopname(unsigned int op); | |
7596 | |
7597 /* JIT codegen entry point. */ | |
7598 void upb_pbdecoder_jit(mgroup *group); | |
7599 void upb_pbdecoder_freejit(mgroup *group); | |
7600 UPB_REFCOUNTED_CMETHODS(mgroup, mgroup_upcast) | |
7601 | |
7602 /* A special label that means "do field dispatch for this message and branch to | |
7603 * wherever that takes you." */ | |
7604 #define LABEL_DISPATCH 0 | |
7605 | |
7606 /* A special slot in the dispatch table that stores the epilogue (ENDMSG and/or | |
7607 * RET) for branching to when we find an appropriate ENDGROUP tag. */ | |
7608 #define DISPATCH_ENDMSG 0 | |
7609 | |
7610 /* It's important to use this invalid wire type instead of 0 (which is a valid | |
7611 * wire type). */ | |
7612 #define NO_WIRE_TYPE 0xff | |
7613 | |
7614 /* The dispatch table layout is: | |
7615 * [field number] -> [ 48-bit offset ][ 8-bit wt2 ][ 8-bit wt1 ] | |
7616 * | |
7617 * If wt1 matches, jump to the 48-bit offset. If wt2 matches, lookup | |
7618 * (UPB_MAX_FIELDNUMBER + fieldnum) and jump there. | |
7619 * | |
7620 * We need two wire types because of packed/non-packed compatibility. A | |
7621 * primitive repeated field can use either wire type and be valid. While we | |
7622 * could key the table on fieldnum+wiretype, the table would be 8x sparser. | |
7623 * | |
7624 * Storing two wire types in the primary value allows us to quickly rule out | |
7625 * the second wire type without needing to do a separate lookup (this case is | |
7626 * less common than an unknown field). */ | |
7627 UPB_INLINE uint64_t upb_pbdecoder_packdispatch(uint64_t ofs, uint8_t wt1, | |
7628 uint8_t wt2) { | |
7629 return (ofs << 16) | (wt2 << 8) | wt1; | |
7630 } | |
7631 | |
7632 UPB_INLINE void upb_pbdecoder_unpackdispatch(uint64_t dispatch, uint64_t *ofs, | |
7633 uint8_t *wt1, uint8_t *wt2) { | |
7634 *wt1 = (uint8_t)dispatch; | |
7635 *wt2 = (uint8_t)(dispatch >> 8); | |
7636 *ofs = dispatch >> 16; | |
7637 } | |
7638 | |
7639 /* All of the functions in decoder.c that return int32_t return values according | |
7640 * to the following scheme: | |
7641 * 1. negative values indicate a return code from the following list. | |
7642 * 2. positive values indicate that error or end of buffer was hit, and | |
7643 * that the decode function should immediately return the given value | |
7644 * (the decoder state has already been suspended and is ready to be | |
7645 * resumed). */ | |
7646 #define DECODE_OK -1 | |
7647 #define DECODE_MISMATCH -2 /* Used only from checktag_slow(). */ | |
7648 #define DECODE_ENDGROUP -3 /* Used only from checkunknown(). */ | |
7649 | |
7650 #define CHECK_RETURN(x) { int32_t ret = x; if (ret >= 0) return ret; } | |
7651 | |
7652 #endif /* UPB_DECODER_INT_H_ */ | |
7653 /* | |
7654 ** A number of routines for varint manipulation (we keep them all around to | |
7655 ** have multiple approaches available for benchmarking). | |
7656 */ | |
7657 | |
7658 #ifndef UPB_VARINT_DECODER_H_ | |
7659 #define UPB_VARINT_DECODER_H_ | |
7660 | |
7661 #include <assert.h> | |
7662 #include <stdint.h> | |
7663 #include <string.h> | |
7664 | |
7665 #ifdef __cplusplus | |
7666 extern "C" { | |
7667 #endif | |
7668 | |
7669 /* A list of types as they are encoded on-the-wire. */ | |
7670 typedef enum { | |
7671 UPB_WIRE_TYPE_VARINT = 0, | |
7672 UPB_WIRE_TYPE_64BIT = 1, | |
7673 UPB_WIRE_TYPE_DELIMITED = 2, | |
7674 UPB_WIRE_TYPE_START_GROUP = 3, | |
7675 UPB_WIRE_TYPE_END_GROUP = 4, | |
7676 UPB_WIRE_TYPE_32BIT = 5 | |
7677 } upb_wiretype_t; | |
7678 | |
7679 #define UPB_MAX_WIRE_TYPE 5 | |
7680 | |
7681 /* The maximum number of bytes that it takes to encode a 64-bit varint. | |
7682 * Note that with a better encoding this could be 9 (TODO: write up a | |
7683 * wiki document about this). */ | |
7684 #define UPB_PB_VARINT_MAX_LEN 10 | |
7685 | |
7686 /* Array of the "native" (ie. non-packed-repeated) wire type for the given a | |
7687 * descriptor type (upb_descriptortype_t). */ | |
7688 extern const uint8_t upb_pb_native_wire_types[]; | |
7689 | |
7690 /* Zig-zag encoding/decoding **************************************************/ | |
7691 | |
7692 UPB_INLINE int32_t upb_zzdec_32(uint32_t n) { | |
7693 return (n >> 1) ^ -(int32_t)(n & 1); | |
7694 } | |
7695 UPB_INLINE int64_t upb_zzdec_64(uint64_t n) { | |
7696 return (n >> 1) ^ -(int64_t)(n & 1); | |
7697 } | |
7698 UPB_INLINE uint32_t upb_zzenc_32(int32_t n) { return (n << 1) ^ (n >> 31); } | |
7699 UPB_INLINE uint64_t upb_zzenc_64(int64_t n) { return (n << 1) ^ (n >> 63); } | |
7700 | |
7701 /* Decoding *******************************************************************/ | |
7702 | |
7703 /* All decoding functions return this struct by value. */ | |
7704 typedef struct { | |
7705 const char *p; /* NULL if the varint was unterminated. */ | |
7706 uint64_t val; | |
7707 } upb_decoderet; | |
7708 | |
7709 UPB_INLINE upb_decoderet upb_decoderet_make(const char *p, uint64_t val) { | |
7710 upb_decoderet ret; | |
7711 ret.p = p; | |
7712 ret.val = val; | |
7713 return ret; | |
7714 } | |
7715 | |
7716 /* Four functions for decoding a varint of at most eight bytes. They are all | |
7717 * functionally identical, but are implemented in different ways and likely have | |
7718 * different performance profiles. We keep them around for performance testing. | |
7719 * | |
7720 * Note that these functions may not read byte-by-byte, so they must not be used | |
7721 * unless there are at least eight bytes left in the buffer! */ | |
7722 upb_decoderet upb_vdecode_max8_branch32(upb_decoderet r); | |
7723 upb_decoderet upb_vdecode_max8_branch64(upb_decoderet r); | |
7724 upb_decoderet upb_vdecode_max8_wright(upb_decoderet r); | |
7725 upb_decoderet upb_vdecode_max8_massimino(upb_decoderet r); | |
7726 | |
7727 /* Template for a function that checks the first two bytes with branching | |
7728 * and dispatches 2-10 bytes with a separate function. Note that this may read | |
7729 * up to 10 bytes, so it must not be used unless there are at least ten bytes | |
7730 * left in the buffer! */ | |
7731 #define UPB_VARINT_DECODER_CHECK2(name, decode_max8_function) \ | |
7732 UPB_INLINE upb_decoderet upb_vdecode_check2_ ## name(const char *_p) { \ | |
7733 uint8_t *p = (uint8_t*)_p; \ | |
7734 upb_decoderet r; \ | |
7735 if ((*p & 0x80) == 0) { \ | |
7736 /* Common case: one-byte varint. */ \ | |
7737 return upb_decoderet_make(_p + 1, *p & 0x7fU); \ | |
7738 } \ | |
7739 r = upb_decoderet_make(_p + 2, (*p & 0x7fU) | ((*(p + 1) & 0x7fU) << 7)); \ | |
7740 if ((*(p + 1) & 0x80) == 0) { \ | |
7741 /* Two-byte varint. */ \ | |
7742 return r; \ | |
7743 } \ | |
7744 /* Longer varint, fallback to out-of-line function. */ \ | |
7745 return decode_max8_function(r); \ | |
7746 } | |
7747 | |
7748 UPB_VARINT_DECODER_CHECK2(branch32, upb_vdecode_max8_branch32) | |
7749 UPB_VARINT_DECODER_CHECK2(branch64, upb_vdecode_max8_branch64) | |
7750 UPB_VARINT_DECODER_CHECK2(wright, upb_vdecode_max8_wright) | |
7751 UPB_VARINT_DECODER_CHECK2(massimino, upb_vdecode_max8_massimino) | |
7752 #undef UPB_VARINT_DECODER_CHECK2 | |
7753 | |
7754 /* Our canonical functions for decoding varints, based on the currently | |
7755 * favored best-performing implementations. */ | |
7756 UPB_INLINE upb_decoderet upb_vdecode_fast(const char *p) { | |
7757 if (sizeof(long) == 8) | |
7758 return upb_vdecode_check2_branch64(p); | |
7759 else | |
7760 return upb_vdecode_check2_branch32(p); | |
7761 } | |
7762 | |
7763 UPB_INLINE upb_decoderet upb_vdecode_max8_fast(upb_decoderet r) { | |
7764 return upb_vdecode_max8_massimino(r); | |
7765 } | |
7766 | |
7767 | |
7768 /* Encoding *******************************************************************/ | |
7769 | |
7770 UPB_INLINE int upb_value_size(uint64_t val) { | |
7771 #ifdef __GNUC__ | |
7772 int high_bit = 63 - __builtin_clzll(val); /* 0-based, undef if val == 0. */ | |
7773 #else | |
7774 int high_bit = 0; | |
7775 uint64_t tmp = val; | |
7776 while(tmp >>= 1) high_bit++; | |
7777 #endif | |
7778 return val == 0 ? 1 : high_bit / 8 + 1; | |
7779 } | |
7780 | |
7781 /* Encodes a 64-bit varint into buf (which must be >=UPB_PB_VARINT_MAX_LEN | |
7782 * bytes long), returning how many bytes were used. | |
7783 * | |
7784 * TODO: benchmark and optimize if necessary. */ | |
7785 UPB_INLINE size_t upb_vencode64(uint64_t val, char *buf) { | |
7786 size_t i; | |
7787 if (val == 0) { buf[0] = 0; return 1; } | |
7788 i = 0; | |
7789 while (val) { | |
7790 uint8_t byte = val & 0x7fU; | |
7791 val >>= 7; | |
7792 if (val) byte |= 0x80U; | |
7793 buf[i++] = byte; | |
7794 } | |
7795 return i; | |
7796 } | |
7797 | |
7798 UPB_INLINE size_t upb_varint_size(uint64_t val) { | |
7799 char buf[UPB_PB_VARINT_MAX_LEN]; | |
7800 return upb_vencode64(val, buf); | |
7801 } | |
7802 | |
7803 /* Encodes a 32-bit varint, *not* sign-extended. */ | |
7804 UPB_INLINE uint64_t upb_vencode32(uint32_t val) { | |
7805 char buf[UPB_PB_VARINT_MAX_LEN]; | |
7806 size_t bytes = upb_vencode64(val, buf); | |
7807 uint64_t ret = 0; | |
7808 assert(bytes <= 5); | |
7809 memcpy(&ret, buf, bytes); | |
7810 assert(ret <= 0xffffffffffU); | |
7811 return ret; | |
7812 } | |
7813 | |
7814 #ifdef __cplusplus | |
7815 } /* extern "C" */ | |
7816 #endif | |
7817 | |
7818 #endif /* UPB_VARINT_DECODER_H_ */ | |
7819 /* | |
7820 ** upb::pb::Encoder (upb_pb_encoder) | |
7821 ** | |
7822 ** Implements a set of upb_handlers that write protobuf data to the binary wire | |
7823 ** format. | |
7824 ** | |
7825 ** This encoder implementation does not have any access to any out-of-band or | |
7826 ** precomputed lengths for submessages, so it must buffer submessages internally | |
7827 ** before it can emit the first byte. | |
7828 */ | |
7829 | |
7830 #ifndef UPB_ENCODER_H_ | |
7831 #define UPB_ENCODER_H_ | |
7832 | |
7833 | |
7834 #ifdef __cplusplus | |
7835 namespace upb { | |
7836 namespace pb { | |
7837 class Encoder; | |
7838 } /* namespace pb */ | |
7839 } /* namespace upb */ | |
7840 #endif | |
7841 | |
7842 UPB_DECLARE_TYPE(upb::pb::Encoder, upb_pb_encoder) | |
7843 | |
7844 #define UPB_PBENCODER_MAX_NESTING 100 | |
7845 | |
7846 /* upb::pb::Encoder ***********************************************************/ | |
7847 | |
7848 /* Preallocation hint: decoder won't allocate more bytes than this when first | |
7849 * constructed. This hint may be an overestimate for some build configurations. | |
7850 * But if the decoder library is upgraded without recompiling the application, | |
7851 * it may be an underestimate. */ | |
7852 #define UPB_PB_ENCODER_SIZE 768 | |
7853 | |
7854 #ifdef __cplusplus | |
7855 | |
7856 class upb::pb::Encoder { | |
7857 public: | |
7858 /* Creates a new encoder in the given environment. The Handlers must have | |
7859 * come from NewHandlers() below. */ | |
7860 static Encoder* Create(Environment* env, const Handlers* handlers, | |
7861 BytesSink* output); | |
7862 | |
7863 /* The input to the encoder. */ | |
7864 Sink* input(); | |
7865 | |
7866 /* Creates a new set of handlers for this MessageDef. */ | |
7867 static reffed_ptr<const Handlers> NewHandlers(const MessageDef* msg); | |
7868 | |
7869 static const size_t kSize = UPB_PB_ENCODER_SIZE; | |
7870 | |
7871 private: | |
7872 UPB_DISALLOW_POD_OPS(Encoder, upb::pb::Encoder) | |
7873 }; | |
7874 | |
7875 #endif | |
7876 | |
7877 UPB_BEGIN_EXTERN_C | |
7878 | |
7879 const upb_handlers *upb_pb_encoder_newhandlers(const upb_msgdef *m, | |
7880 const void *owner); | |
7881 upb_sink *upb_pb_encoder_input(upb_pb_encoder *p); | |
7882 upb_pb_encoder* upb_pb_encoder_create(upb_env* e, const upb_handlers* h, | |
7883 upb_bytessink* output); | |
7884 | |
7885 UPB_END_EXTERN_C | |
7886 | |
7887 #ifdef __cplusplus | |
7888 | |
7889 namespace upb { | |
7890 namespace pb { | |
7891 inline Encoder* Encoder::Create(Environment* env, const Handlers* handlers, | |
7892 BytesSink* output) { | |
7893 return upb_pb_encoder_create(env, handlers, output); | |
7894 } | |
7895 inline Sink* Encoder::input() { | |
7896 return upb_pb_encoder_input(this); | |
7897 } | |
7898 inline reffed_ptr<const Handlers> Encoder::NewHandlers( | |
7899 const upb::MessageDef *md) { | |
7900 const Handlers* h = upb_pb_encoder_newhandlers(md, &h); | |
7901 return reffed_ptr<const Handlers>(h, &h); | |
7902 } | |
7903 } /* namespace pb */ | |
7904 } /* namespace upb */ | |
7905 | |
7906 #endif | |
7907 | |
7908 #endif /* UPB_ENCODER_H_ */ | |
7909 /* | |
7910 ** upb's core components like upb_decoder and upb_msg are carefully designed to | |
7911 ** avoid depending on each other for maximum orthogonality. In other words, | |
7912 ** you can use a upb_decoder to decode into *any* kind of structure; upb_msg is | |
7913 ** just one such structure. A upb_msg can be serialized/deserialized into any | |
7914 ** format, protobuf binary format is just one such format. | |
7915 ** | |
7916 ** However, for convenience we provide functions here for doing common | |
7917 ** operations like deserializing protobuf binary format into a upb_msg. The | |
7918 ** compromise is that this file drags in almost all of upb as a dependency, | |
7919 ** which could be undesirable if you're trying to use a trimmed-down build of | |
7920 ** upb. | |
7921 ** | |
7922 ** While these routines are convenient, they do not reuse any encoding/decoding | |
7923 ** state. For example, if a decoder is JIT-based, it will be re-JITted every | |
7924 ** time these functions are called. For this reason, if you are parsing lots | |
7925 ** of data and efficiency is an issue, these may not be the best functions to | |
7926 ** use (though they are useful for prototyping, before optimizing). | |
7927 */ | |
7928 | |
7929 #ifndef UPB_GLUE_H | |
7930 #define UPB_GLUE_H | |
7931 | |
7932 #include <stdbool.h> | |
7933 | |
7934 #ifdef __cplusplus | |
7935 extern "C" { | |
7936 #endif | |
7937 | |
7938 /* Loads all defs from the given protobuf binary descriptor, setting default | |
7939 * accessors and a default layout on all messages. The caller owns the | |
7940 * returned array of defs, which will be of length *n. On error NULL is | |
7941 * returned and status is set (if non-NULL). */ | |
7942 upb_def **upb_load_defs_from_descriptor(const char *str, size_t len, int *n, | |
7943 void *owner, upb_status *status); | |
7944 | |
7945 /* Like the previous but also adds the loaded defs to the given symtab. */ | |
7946 bool upb_load_descriptor_into_symtab(upb_symtab *symtab, const char *str, | |
7947 size_t len, upb_status *status); | |
7948 | |
7949 /* Like the previous but also reads the descriptor from the given filename. */ | |
7950 bool upb_load_descriptor_file_into_symtab(upb_symtab *symtab, const char *fname, | |
7951 upb_status *status); | |
7952 | |
7953 /* Reads the given filename into a character string, returning NULL if there | |
7954 * was an error. */ | |
7955 char *upb_readfile(const char *filename, size_t *len); | |
7956 | |
7957 #ifdef __cplusplus | |
7958 } /* extern "C" */ | |
7959 | |
7960 namespace upb { | |
7961 | |
7962 /* All routines that load descriptors expect the descriptor to be a | |
7963 * FileDescriptorSet. */ | |
7964 inline bool LoadDescriptorFileIntoSymtab(SymbolTable* s, const char *fname, | |
7965 Status* status) { | |
7966 return upb_load_descriptor_file_into_symtab(s, fname, status); | |
7967 } | |
7968 | |
7969 inline bool LoadDescriptorIntoSymtab(SymbolTable* s, const char* str, | |
7970 size_t len, Status* status) { | |
7971 return upb_load_descriptor_into_symtab(s, str, len, status); | |
7972 } | |
7973 | |
7974 /* Templated so it can accept both string and std::string. */ | |
7975 template <typename T> | |
7976 bool LoadDescriptorIntoSymtab(SymbolTable* s, const T& desc, Status* status) { | |
7977 return upb_load_descriptor_into_symtab(s, desc.c_str(), desc.size(), status); | |
7978 } | |
7979 | |
7980 } /* namespace upb */ | |
7981 | |
7982 #endif | |
7983 | |
7984 #endif /* UPB_GLUE_H */ | |
7985 /* | |
7986 ** upb::pb::TextPrinter (upb_textprinter) | |
7987 ** | |
7988 ** Handlers for writing to protobuf text format. | |
7989 */ | |
7990 | |
7991 #ifndef UPB_TEXT_H_ | |
7992 #define UPB_TEXT_H_ | |
7993 | |
7994 | |
7995 #ifdef __cplusplus | |
7996 namespace upb { | |
7997 namespace pb { | |
7998 class TextPrinter; | |
7999 } /* namespace pb */ | |
8000 } /* namespace upb */ | |
8001 #endif | |
8002 | |
8003 UPB_DECLARE_TYPE(upb::pb::TextPrinter, upb_textprinter) | |
8004 | |
8005 #ifdef __cplusplus | |
8006 | |
8007 class upb::pb::TextPrinter { | |
8008 public: | |
8009 /* The given handlers must have come from NewHandlers(). It must outlive the | |
8010 * TextPrinter. */ | |
8011 static TextPrinter *Create(Environment *env, const upb::Handlers *handlers, | |
8012 BytesSink *output); | |
8013 | |
8014 void SetSingleLineMode(bool single_line); | |
8015 | |
8016 Sink* input(); | |
8017 | |
8018 /* If handler caching becomes a requirement we can add a code cache as in | |
8019 * decoder.h */ | |
8020 static reffed_ptr<const Handlers> NewHandlers(const MessageDef* md); | |
8021 }; | |
8022 | |
8023 #endif | |
8024 | |
8025 UPB_BEGIN_EXTERN_C | |
8026 | |
8027 /* C API. */ | |
8028 upb_textprinter *upb_textprinter_create(upb_env *env, const upb_handlers *h, | |
8029 upb_bytessink *output); | |
8030 void upb_textprinter_setsingleline(upb_textprinter *p, bool single_line); | |
8031 upb_sink *upb_textprinter_input(upb_textprinter *p); | |
8032 | |
8033 const upb_handlers *upb_textprinter_newhandlers(const upb_msgdef *m, | |
8034 const void *owner); | |
8035 | |
8036 UPB_END_EXTERN_C | |
8037 | |
8038 #ifdef __cplusplus | |
8039 | |
8040 namespace upb { | |
8041 namespace pb { | |
8042 inline TextPrinter *TextPrinter::Create(Environment *env, | |
8043 const upb::Handlers *handlers, | |
8044 BytesSink *output) { | |
8045 return upb_textprinter_create(env, handlers, output); | |
8046 } | |
8047 inline void TextPrinter::SetSingleLineMode(bool single_line) { | |
8048 upb_textprinter_setsingleline(this, single_line); | |
8049 } | |
8050 inline Sink* TextPrinter::input() { | |
8051 return upb_textprinter_input(this); | |
8052 } | |
8053 inline reffed_ptr<const Handlers> TextPrinter::NewHandlers( | |
8054 const MessageDef *md) { | |
8055 const Handlers* h = upb_textprinter_newhandlers(md, &h); | |
8056 return reffed_ptr<const Handlers>(h, &h); | |
8057 } | |
8058 } /* namespace pb */ | |
8059 } /* namespace upb */ | |
8060 | |
8061 #endif | |
8062 | |
8063 #endif /* UPB_TEXT_H_ */ | |
8064 /* | |
8065 ** upb::json::Parser (upb_json_parser) | |
8066 ** | |
8067 ** Parses JSON according to a specific schema. | |
8068 ** Support for parsing arbitrary JSON (schema-less) will be added later. | |
8069 */ | |
8070 | |
8071 #ifndef UPB_JSON_PARSER_H_ | |
8072 #define UPB_JSON_PARSER_H_ | |
8073 | |
8074 | |
8075 #ifdef __cplusplus | |
8076 namespace upb { | |
8077 namespace json { | |
8078 class Parser; | |
8079 } /* namespace json */ | |
8080 } /* namespace upb */ | |
8081 #endif | |
8082 | |
8083 UPB_DECLARE_TYPE(upb::json::Parser, upb_json_parser) | |
8084 | |
8085 /* upb::json::Parser **********************************************************/ | |
8086 | |
8087 /* Preallocation hint: parser won't allocate more bytes than this when first | |
8088 * constructed. This hint may be an overestimate for some build configurations. | |
8089 * But if the parser library is upgraded without recompiling the application, | |
8090 * it may be an underestimate. */ | |
8091 #define UPB_JSON_PARSER_SIZE 3704 | |
8092 | |
8093 #ifdef __cplusplus | |
8094 | |
8095 /* Parses an incoming BytesStream, pushing the results to the destination | |
8096 * sink. */ | |
8097 class upb::json::Parser { | |
8098 public: | |
8099 static Parser* Create(Environment* env, Sink* output); | |
8100 | |
8101 BytesSink* input(); | |
8102 | |
8103 private: | |
8104 UPB_DISALLOW_POD_OPS(Parser, upb::json::Parser) | |
8105 }; | |
8106 | |
8107 #endif | |
8108 | |
8109 UPB_BEGIN_EXTERN_C | |
8110 | |
8111 upb_json_parser *upb_json_parser_create(upb_env *e, upb_sink *output); | |
8112 upb_bytessink *upb_json_parser_input(upb_json_parser *p); | |
8113 | |
8114 UPB_END_EXTERN_C | |
8115 | |
8116 #ifdef __cplusplus | |
8117 | |
8118 namespace upb { | |
8119 namespace json { | |
8120 inline Parser* Parser::Create(Environment* env, Sink* output) { | |
8121 return upb_json_parser_create(env, output); | |
8122 } | |
8123 inline BytesSink* Parser::input() { | |
8124 return upb_json_parser_input(this); | |
8125 } | |
8126 } /* namespace json */ | |
8127 } /* namespace upb */ | |
8128 | |
8129 #endif | |
8130 | |
8131 | |
8132 #endif /* UPB_JSON_PARSER_H_ */ | |
8133 /* | |
8134 ** upb::json::Printer | |
8135 ** | |
8136 ** Handlers that emit JSON according to a specific protobuf schema. | |
8137 */ | |
8138 | |
8139 #ifndef UPB_JSON_TYPED_PRINTER_H_ | |
8140 #define UPB_JSON_TYPED_PRINTER_H_ | |
8141 | |
8142 | |
8143 #ifdef __cplusplus | |
8144 namespace upb { | |
8145 namespace json { | |
8146 class Printer; | |
8147 } /* namespace json */ | |
8148 } /* namespace upb */ | |
8149 #endif | |
8150 | |
8151 UPB_DECLARE_TYPE(upb::json::Printer, upb_json_printer) | |
8152 | |
8153 | |
8154 /* upb::json::Printer *********************************************************/ | |
8155 | |
8156 #define UPB_JSON_PRINTER_SIZE 168 | |
8157 | |
8158 #ifdef __cplusplus | |
8159 | |
8160 /* Prints an incoming stream of data to a BytesSink in JSON format. */ | |
8161 class upb::json::Printer { | |
8162 public: | |
8163 static Printer* Create(Environment* env, const upb::Handlers* handlers, | |
8164 BytesSink* output); | |
8165 | |
8166 /* The input to the printer. */ | |
8167 Sink* input(); | |
8168 | |
8169 /* Returns handlers for printing according to the specified schema. */ | |
8170 static reffed_ptr<const Handlers> NewHandlers(const upb::MessageDef* md); | |
8171 | |
8172 static const size_t kSize = UPB_JSON_PRINTER_SIZE; | |
8173 | |
8174 private: | |
8175 UPB_DISALLOW_POD_OPS(Printer, upb::json::Printer) | |
8176 }; | |
8177 | |
8178 #endif | |
8179 | |
8180 UPB_BEGIN_EXTERN_C | |
8181 | |
8182 /* Native C API. */ | |
8183 upb_json_printer *upb_json_printer_create(upb_env *e, const upb_handlers *h, | |
8184 upb_bytessink *output); | |
8185 upb_sink *upb_json_printer_input(upb_json_printer *p); | |
8186 const upb_handlers *upb_json_printer_newhandlers(const upb_msgdef *md, | |
8187 const void *owner); | |
8188 | |
8189 UPB_END_EXTERN_C | |
8190 | |
8191 #ifdef __cplusplus | |
8192 | |
8193 namespace upb { | |
8194 namespace json { | |
8195 inline Printer* Printer::Create(Environment* env, const upb::Handlers* handlers, | |
8196 BytesSink* output) { | |
8197 return upb_json_printer_create(env, handlers, output); | |
8198 } | |
8199 inline Sink* Printer::input() { return upb_json_printer_input(this); } | |
8200 inline reffed_ptr<const Handlers> Printer::NewHandlers( | |
8201 const upb::MessageDef *md) { | |
8202 const Handlers* h = upb_json_printer_newhandlers(md, &h); | |
8203 return reffed_ptr<const Handlers>(h, &h); | |
8204 } | |
8205 } /* namespace json */ | |
8206 } /* namespace upb */ | |
8207 | |
8208 #endif | |
8209 | |
8210 #endif /* UPB_JSON_TYPED_PRINTER_H_ */ | |
OLD | NEW |