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;
95 Status ReadInt32(int32_t* out) {
96 return ReadUint32(
reinterpret_cast<uint32_t*
>(out));
100 Status ReadUint32(uint32_t* out);
103 Status ReadInt64(int64_t* out) {
104 return ReadVarint(
reinterpret_cast<uint64_t*
>(out));
108 Status ReadUint64(uint64_t* out) {
return ReadVarint(out); }
111 Status ReadSint32(int32_t* out);
114 Status ReadSint64(int64_t* out);
117 Status ReadBool(
bool* out);
120 Status ReadFixed32(uint32_t* out) {
return ReadFixed(out); }
123 Status ReadFixed64(uint64_t* out) {
return ReadFixed(out); }
126 Status ReadSfixed32(int32_t* out) {
127 return ReadFixed32(
reinterpret_cast<uint32_t*
>(out));
131 Status ReadSfixed64(int64_t* out) {
132 return ReadFixed64(
reinterpret_cast<uint64_t*
>(out));
136 Status ReadFloat(
float* out) {
137 static_assert(
sizeof(float) ==
sizeof(uint32_t),
138 "Float and uint32_t must be the same size for protobufs");
139 return ReadFixed(out);
143 Status ReadDouble(
double* out) {
144 static_assert(
sizeof(double) ==
sizeof(uint64_t),
145 "Double and uint64_t must be the same size for protobufs");
146 return ReadFixed(out);
152 Status ReadString(std::string_view* out);
162 previous_field_consumed_ =
true;
170 ConstByteSpan RawFieldBytes() {
return GetFieldSize().ValueBytes(proto_); }
178 static constexpr FieldSize Invalid() {
return {0, 0}; }
180 constexpr FieldSize(
size_t key_size,
size_t value_size)
181 : key_size_bytes_(key_size), value_size_bytes_(value_size) {}
183 bool ok()
const {
return key_size_bytes_ != 0; }
186 size_t total()
const {
return key_size_bytes_ + value_size_bytes_; }
190 return field.subspan(key_size_bytes_, value_size_bytes_);
194 size_t key_size_bytes_;
195 size_t value_size_bytes_;
199 FieldSize GetFieldSize()
const;
201 Status ConsumeKey(WireType expected_type);
204 Status ReadVarint(uint64_t* out);
207 Status ReadFixed(std::byte* out,
size_t size);
209 template <
typename T>
210 Status ReadFixed(T* out) {
212 sizeof(T) ==
sizeof(uint32_t) ||
sizeof(T) ==
sizeof(uint64_t),
213 "Protobuf fixed-size fields must be 32- or 64-bit");
214 return ReadFixed(
reinterpret_cast<std::byte*
>(out),
sizeof(T));
220 bool previous_field_consumed_;
270 : decoder_({}), handler_(
nullptr), state_(kReady) {}
275 void set_handler(
DecodeHandler* handler) { handler_ = handler; }
282 Status ReadInt32(int32_t* out) {
return decoder_.ReadInt32(out); }
285 Status ReadUint32(uint32_t* out) {
return decoder_.ReadUint32(out); }
288 Status ReadInt64(int64_t* out) {
return decoder_.ReadInt64(out); }
291 Status ReadUint64(uint64_t* out) {
return decoder_.ReadUint64(out); }
294 Status ReadSint32(int32_t* out) {
return decoder_.ReadSint32(out); }
297 Status ReadSint64(int64_t* out) {
return decoder_.ReadSint64(out); }
300 Status ReadBool(
bool* out) {
return decoder_.ReadBool(out); }
303 Status ReadFixed32(uint32_t* out) {
return decoder_.ReadFixed32(out); }
306 Status ReadFixed64(uint64_t* out) {
return decoder_.ReadFixed64(out); }
309 Status ReadSfixed32(int32_t* out) {
return decoder_.ReadSfixed32(out); }
312 Status ReadSfixed64(int64_t* out) {
return decoder_.ReadSfixed64(out); }
315 Status ReadFloat(
float* out) {
return decoder_.ReadFloat(out); }
318 Status ReadDouble(
double* out) {
return decoder_.ReadDouble(out); }
323 Status ReadString(std::string_view* out) {
return decoder_.ReadString(out); }
329 return decoder_.ReadBytes(out);
332 bool cancelled()
const {
return state_ == kDecodeCancelled; }
362 uint32_t field_number) = 0;
Definition: decoder.h:267
Definition: decoder.h:350
friend Result< ConstByteSpan > FindRaw(ConstByteSpan, uint32_t)
Returns a span containing the raw bytes of the value.
Definition: find.h:837
Definition: span_impl.h:235