Built motion from commit 6a09e18b.|2.6.11
[motion2.git] / legacy-libs / grpc-cloned / deps / grpc / third_party / upb / upb / pb / encoder.h
1 /*
2 ** upb::pb::Encoder (upb_pb_encoder)
3 **
4 ** Implements a set of upb_handlers that write protobuf data to the binary wire
5 ** format.
6 **
7 ** This encoder implementation does not have any access to any out-of-band or
8 ** precomputed lengths for submessages, so it must buffer submessages internally
9 ** before it can emit the first byte.
10 */
11
12 #ifndef UPB_ENCODER_H_
13 #define UPB_ENCODER_H_
14
15 #include "upb/sink.h"
16
17 #ifdef __cplusplus
18 namespace upb {
19 namespace pb {
20 class EncoderPtr;
21 }  /* namespace pb */
22 }  /* namespace upb */
23 #endif
24
25 #define UPB_PBENCODER_MAX_NESTING 100
26
27 /* upb_pb_encoder *************************************************************/
28
29 /* Preallocation hint: decoder won't allocate more bytes than this when first
30  * constructed.  This hint may be an overestimate for some build configurations.
31  * But if the decoder library is upgraded without recompiling the application,
32  * it may be an underestimate. */
33 #define UPB_PB_ENCODER_SIZE 784
34
35 struct upb_pb_encoder;
36 typedef struct upb_pb_encoder upb_pb_encoder;
37
38 #ifdef __cplusplus
39 extern "C" {
40 #endif
41
42 upb_sink upb_pb_encoder_input(upb_pb_encoder *p);
43 upb_pb_encoder* upb_pb_encoder_create(upb_arena* a, const upb_handlers* h,
44                                       upb_bytessink output);
45
46 /* Lazily builds and caches handlers that will push encoded data to a bytessink.
47  * Any msgdef objects used with this object must outlive it. */
48 upb_handlercache *upb_pb_encoder_newcache(void);
49
50 #ifdef __cplusplus
51 }  /* extern "C" { */
52
53 class upb::pb::EncoderPtr {
54  public:
55   EncoderPtr(upb_pb_encoder* ptr) : ptr_(ptr) {}
56
57   upb_pb_encoder* ptr() { return ptr_; }
58
59   /* Creates a new encoder in the given environment.  The Handlers must have
60    * come from NewHandlers() below. */
61   static EncoderPtr Create(Arena* arena, const Handlers* handlers,
62                            BytesSink output) {
63     return EncoderPtr(
64         upb_pb_encoder_create(arena->ptr(), handlers, output.sink()));
65   }
66
67   /* The input to the encoder. */
68   upb::Sink input() { return upb_pb_encoder_input(ptr()); }
69
70   /* Creates a new set of handlers for this MessageDef. */
71   static HandlerCache NewCache() {
72     return HandlerCache(upb_pb_encoder_newcache());
73   }
74
75   static const size_t kSize = UPB_PB_ENCODER_SIZE;
76
77  private:
78   upb_pb_encoder* ptr_;
79 };
80
81 #endif  /* __cplusplus */
82
83 #endif  /* UPB_ENCODER_H_ */