Protocol Buffers - Google's data interchange format (grpc依赖)
https://developers.google.com/protocol-buffers/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
2.8 KiB
81 lines
2.8 KiB
// |
|
// upb - a minimalist implementation of protocol buffers. |
|
// |
|
// Copyright (c) 2011 Google Inc. See LICENSE for details. |
|
// Author: Josh Haberman <jhaberman@gmail.com> |
|
// |
|
// upb::Decoder is a high performance, streaming decoder for protobuf |
|
// data that works by getting its input data from a ubp::ByteRegion and calling |
|
// into a upb::Handlers. |
|
// |
|
// A DecoderPlan contains whatever data structures and generated (JIT-ted) code |
|
// are necessary to decode protobuf data of a specific type to a specific set |
|
// of handlers. By generating the plan ahead of time, we avoid having to |
|
// redo this work every time we decode. |
|
// |
|
// A DecoderPlan is threadsafe, meaning that it can be used concurrently by |
|
// different upb::Decoders in different threads. However, the upb::Decoders are |
|
// *not* thread-safe. |
|
|
|
#ifndef UPB_PB_DECODER_HPP |
|
#define UPB_PB_DECODER_HPP |
|
|
|
#include "upb/pb/decoder.h" |
|
|
|
#include "upb/bytestream.h" |
|
#include "upb/upb.h" |
|
|
|
namespace upb { |
|
|
|
class DecoderPlan : public upb_decoderplan { |
|
public: |
|
static DecoderPlan* New(const Handlers* h, bool allow_jit) { |
|
return static_cast<DecoderPlan*>(upb_decoderplan_new(h, allow_jit)); |
|
} |
|
void Unref() { upb_decoderplan_unref(this); } |
|
|
|
// Returns true if the plan contains JIT-ted code. This may not be the same |
|
// as the "allowjit" parameter to the constructor if support for JIT-ting was |
|
// not compiled in. |
|
bool HasJitCode() { return upb_decoderplan_hasjitcode(this); } |
|
|
|
private: |
|
DecoderPlan() {} // Only constructed by New |
|
}; |
|
|
|
class Decoder : public upb_decoder { |
|
public: |
|
Decoder() { upb_decoder_init(this); } |
|
~Decoder() { upb_decoder_uninit(this); } |
|
|
|
// Resets the plan that the decoder will parse from. This will also reset the |
|
// decoder's input to be uninitialized -- ResetInput() must be called before |
|
// parsing can occur. The plan must live until the decoder is destroyed or |
|
// reset to a different plan. |
|
// |
|
// Must be called before ResetInput() or Decode(). |
|
void ResetPlan(DecoderPlan* plan) { upb_decoder_resetplan(this, plan); } |
|
|
|
// Resets the input of the decoder. This puts it in a state where it has not |
|
// seen any data, and expects the next data to be from the beginning of a new |
|
// protobuf. |
|
// |
|
// ResetInput() must be called before Decode() but may be called more than |
|
// once. "input" must live until the decoder destroyed or ResetInput is |
|
// called again. "c" is the closure that will be passed to the handlers. |
|
void ResetInput(ByteRegion* byte_region, void* c) { |
|
upb_decoder_resetinput(this, byte_region, c); |
|
} |
|
|
|
// Decodes serialized data (calling Handlers as the data is parsed) until |
|
// error or EOF (see status() for details). |
|
Status::Success Decode() { return upb_decoder_decode(this); } |
|
|
|
const upb::Status& status() { |
|
return static_cast<const upb::Status&>(*upb_decoder_status(this)); |
|
} |
|
}; |
|
|
|
} // namespace upb |
|
|
|
#endif
|
|
|