|
|
|
/*
|
|
|
|
** upb::pb::Encoder (upb_pb_encoder)
|
|
|
|
**
|
|
|
|
** Implements a set of upb_handlers that write protobuf data to the binary wire
|
|
|
|
** format.
|
|
|
|
**
|
|
|
|
** This encoder implementation does not have any access to any out-of-band or
|
|
|
|
** precomputed lengths for submessages, so it must buffer submessages internally
|
|
|
|
** before it can emit the first byte.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef UPB_ENCODER_H_
|
|
|
|
#define UPB_ENCODER_H_
|
|
|
|
|
|
|
|
#include "upb/sink.h"
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
namespace upb {
|
|
|
|
namespace pb {
|
|
|
|
class EncoderPtr;
|
|
|
|
} /* namespace pb */
|
|
|
|
} /* namespace upb */
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define UPB_PBENCODER_MAX_NESTING 100
|
|
|
|
|
|
|
|
/* upb_pb_encoder *************************************************************/
|
|
|
|
|
|
|
|
/* Preallocation hint: decoder won't allocate more bytes than this when first
|
|
|
|
* constructed. This hint may be an overestimate for some build configurations.
|
|
|
|
* But if the decoder library is upgraded without recompiling the application,
|
|
|
|
* it may be an underestimate. */
|
|
|
|
#define UPB_PB_ENCODER_SIZE 784
|
|
|
|
|
|
|
|
struct upb_pb_encoder;
|
|
|
|
typedef struct upb_pb_encoder upb_pb_encoder;
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
|
|
|
upb_sink upb_pb_encoder_input(upb_pb_encoder *p);
|
|
|
|
upb_pb_encoder* upb_pb_encoder_create(upb_arena* a, const upb_handlers* h,
|
|
|
|
upb_bytessink output);
|
|
|
|
|
|
|
|
/* Lazily builds and caches handlers that will push encoded data to a bytessink.
|
|
|
|
* Any msgdef objects used with this object must outlive it. */
|
|
|
|
upb_handlercache *upb_pb_encoder_newcache();
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
} /* extern "C" { */
|
|
|
|
|
|
|
|
class upb::pb::EncoderPtr {
|
|
|
|
public:
|
|
|
|
EncoderPtr(upb_pb_encoder* ptr) : ptr_(ptr) {}
|
|
|
|
|
|
|
|
upb_pb_encoder* ptr() { return ptr_; }
|
|
|
|
|
|
|
|
/* Creates a new encoder in the given environment. The Handlers must have
|
|
|
|
* come from NewHandlers() below. */
|
|
|
|
static EncoderPtr Create(Arena* arena, const Handlers* handlers,
|
|
|
|
BytesSink output) {
|
|
|
|
return EncoderPtr(
|
|
|
|
upb_pb_encoder_create(arena->ptr(), handlers, output.sink()));
|
|
|
|
}
|
|
|
|
|
|
|
|
/* The input to the encoder. */
|
|
|
|
upb::Sink input() { return upb_pb_encoder_input(ptr()); }
|
|
|
|
|
|
|
|
/* Creates a new set of handlers for this MessageDef. */
|
|
|
|
static HandlerCache NewCache() {
|
|
|
|
return HandlerCache(upb_pb_encoder_newcache());
|
|
|
|
}
|
|
|
|
|
|
|
|
static const size_t kSize = UPB_PB_ENCODER_SIZE;
|
|
|
|
|
|
|
|
private:
|
|
|
|
upb_pb_encoder* ptr_;
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* __cplusplus */
|
|
|
|
|
|
|
|
#endif /* UPB_ENCODER_H_ */
|