18#include "pw_bytes/span.h"
19#include "pw_protobuf/wire_format.h"
20#include "pw_result/result.h"
21#include "pw_span/span.h"
22#include "pw_status/status.h"
45namespace pw::protobuf {
53 : proto_(proto), previous_field_consumed_(
true) {}
78 uint32_t FieldNumber()
const;
81 Status ReadInt32(int32_t* out) {
82 return ReadUint32(
reinterpret_cast<uint32_t*
>(out));
86 Status ReadUint32(uint32_t* out);
89 Status ReadInt64(int64_t* out) {
90 return ReadVarint(
reinterpret_cast<uint64_t*
>(out));
94 Status ReadUint64(uint64_t* out) {
return ReadVarint(out); }
97 Status ReadSint32(int32_t* out);
100 Status ReadSint64(int64_t* out);
103 Status ReadBool(
bool* out);
106 Status ReadFixed32(uint32_t* out) {
return ReadFixed(out); }
109 Status ReadFixed64(uint64_t* out) {
return ReadFixed(out); }
112 Status ReadSfixed32(int32_t* out) {
113 return ReadFixed32(
reinterpret_cast<uint32_t*
>(out));
117 Status ReadSfixed64(int64_t* out) {
118 return ReadFixed64(
reinterpret_cast<uint64_t*
>(out));
122 Status ReadFloat(
float* out) {
123 static_assert(
sizeof(float) ==
sizeof(uint32_t),
124 "Float and uint32_t must be the same size for protobufs");
125 return ReadFixed(out);
129 Status ReadDouble(
double* out) {
130 static_assert(
sizeof(double) ==
sizeof(uint64_t),
131 "Double and uint64_t must be the same size for protobufs");
132 return ReadFixed(out);
138 Status ReadString(std::string_view* out);
148 previous_field_consumed_ =
true;
156 ConstByteSpan RawFieldBytes() {
return GetFieldSize().ValueBytes(proto_); }
164 static constexpr FieldSize Invalid() {
return {0, 0}; }
166 constexpr FieldSize(
size_t key_size,
size_t value_size)
167 : key_size_bytes_(key_size), value_size_bytes_(value_size) {}
169 bool ok()
const {
return key_size_bytes_ != 0; }
172 size_t total()
const {
return key_size_bytes_ + value_size_bytes_; }
176 return field.subspan(key_size_bytes_, value_size_bytes_);
180 size_t key_size_bytes_;
181 size_t value_size_bytes_;
185 FieldSize GetFieldSize()
const;
187 Status ConsumeKey(WireType expected_type);
190 Status ReadVarint(uint64_t* out);
193 Status ReadFixed(std::byte* out,
size_t size);
195 template <
typename T>
196 Status ReadFixed(T* out) {
198 sizeof(T) ==
sizeof(uint32_t) ||
sizeof(T) ==
sizeof(uint64_t),
199 "Protobuf fixed-size fields must be 32- or 64-bit");
200 return ReadFixed(
reinterpret_cast<std::byte*
>(out),
sizeof(T));
206 bool previous_field_consumed_;
256 : decoder_({}), handler_(
nullptr), state_(kReady) {}
261 void set_handler(
DecodeHandler* handler) { handler_ = handler; }
268 Status ReadInt32(int32_t* out) {
return decoder_.ReadInt32(out); }
271 Status ReadUint32(uint32_t* out) {
return decoder_.ReadUint32(out); }
274 Status ReadInt64(int64_t* out) {
return decoder_.ReadInt64(out); }
277 Status ReadUint64(uint64_t* out) {
return decoder_.ReadUint64(out); }
280 Status ReadSint32(int32_t* out) {
return decoder_.ReadSint32(out); }
283 Status ReadSint64(int64_t* out) {
return decoder_.ReadSint64(out); }
286 Status ReadBool(
bool* out) {
return decoder_.ReadBool(out); }
289 Status ReadFixed32(uint32_t* out) {
return decoder_.ReadFixed32(out); }
292 Status ReadFixed64(uint64_t* out) {
return decoder_.ReadFixed64(out); }
295 Status ReadSfixed32(int32_t* out) {
return decoder_.ReadSfixed32(out); }
298 Status ReadSfixed64(int64_t* out) {
return decoder_.ReadSfixed64(out); }
301 Status ReadFloat(
float* out) {
return decoder_.ReadFloat(out); }
304 Status ReadDouble(
double* out) {
return decoder_.ReadDouble(out); }
309 Status ReadString(std::string_view* out) {
return decoder_.ReadString(out); }
315 return decoder_.ReadBytes(out);
318 bool cancelled()
const {
return state_ == kDecodeCancelled; }
348 uint32_t field_number) = 0;
Definition: decoder.h:253
Definition: decoder.h:336
friend Result< ConstByteSpan > FindRaw(ConstByteSpan, uint32_t)
Returns a span containing the raw bytes of the value.
Definition: find.h:1121
Definition: span_impl.h:235