From 35e5c248bee19703b7e3c9e43d7bd8fd7aa2a79d Mon Sep 17 00:00:00 2001 From: Joshua Haberman Date: Mon, 14 Jun 2010 10:47:56 -0700 Subject: Work to make upb_def consume a upb_src. --- src/upb_encoder.h | 49 ++++++++++++++++--------------------------------- 1 file changed, 16 insertions(+), 33 deletions(-) (limited to 'src/upb_encoder.h') diff --git a/src/upb_encoder.h b/src/upb_encoder.h index b4d0c98..963af8b 100644 --- a/src/upb_encoder.h +++ b/src/upb_encoder.h @@ -20,27 +20,6 @@ extern "C" { #endif -/* upb_sizebuilder ************************************************************/ - -// A upb_sizebuilder performs a pre-pass on data to be serialized that gathers -// the sizes of submessages. This size data is required for serialization, -// because we have to know at the beginning of a submessage how many encoded -// bytes the submessage will represent. -struct upb_sizebuilder; -typedef struct upb_sizebuilder upb_sizebuilder; - -upb_sizebuilder *upb_sizebuilder_new(upb_msgdef *md); -void upb_sizebuilder_free(upb_sizebuilder *sb); - -void upb_sizebuilder_reset(upb_sizebuilder *sb); - -// Returns a sink that must be used to perform the pre-pass. Note that the -// pre-pass *must* occur in the opposite order from the actual encode that -// follows, and the data *must* be identical both times (except for the -// reversed order. -upb_sink *upb_sizebuilder_sink(upb_sizebuilder *sb); - - /* upb_encoder ****************************************************************/ // A upb_encoder is a upb_sink that emits data to a upb_bytesink in the protocol @@ -51,21 +30,25 @@ typedef struct upb_encoder upb_encoder; upb_encoder *upb_encoder_new(upb_msgdef *md); void upb_encoder_free(upb_encoder *e); -// Resets the given upb_encoder such that is is ready to begin encoding. The -// upb_sizebuilder "sb" is used to determine submessage sizes; it must have -// previously been initialized by feeding it the same data in reverse order. -// "sb" may be null if and only if the data contains no submessages; groups -// are ok and do not require sizes to be precalculated. The upb_bytesink -// "out" is where the encoded output data will be sent. -// -// Both "sb" and "out" must live until the encoder is either reset or freed. -void upb_encoder_reset(upb_encoder *e, upb_sizebuilder *sb, upb_bytesink *out); +// Resets the given upb_encoder such that is is ready to begin encoding, +// outputting data to "bytesink" (which must live until the encoder is +// reset or destroyed). +void upb_encoder_reset(upb_encoder *e, upb_bytesink *bytesink); -// The upb_sink to which data can be sent to be encoded. Note that this data -// must be identical to the data that was previously given to the sizebuilder -// (if any). +// Returns the upb_sink to which data can be written. The sink is invalidated +// when the encoder is reset or destroyed. Note that if the client wants to +// encode any length-delimited submessages it must first call +// upb_encoder_buildsizes() below. upb_sink *upb_encoder_sink(upb_encoder *e); +// Call prior to pushing any data with embedded submessages. "src" must yield +// exactly the same data as what will next be encoded, but in reverse order. +// The encoder iterates over this data in order to determine the sizes of the +// submessages. If any errors are returned by the upb_src, the status will +// be saved in *status. If the client is sure that the upb_src will not throw +// any errors, "status" may be NULL. +void upb_encoder_buildsizes(upb_encoder *e, upb_src *src, upb_status *status); + #ifdef __cplusplus } /* extern "C" */ #endif -- cgit v1.2.3