Pigweed
 
Loading...
Searching...
No Matches
find.h
Go to the documentation of this file.
1// Copyright 2023 The Pigweed Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License"); you may not
4// use this file except in compliance with the License. You may obtain a copy of
5// the License at
6//
7// https://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12// License for the specific language governing permissions and limitations under
13// the License.
14#pragma once
15
41
42#include "pw_bytes/span.h"
43#include "pw_protobuf/decoder.h"
44#include "pw_protobuf/stream_decoder.h"
45#include "pw_result/result.h"
46#include "pw_status/try.h"
47#include "pw_string/string.h"
48
49namespace pw::protobuf {
50
51namespace internal {
52
53Status AdvanceToField(Decoder& decoder, uint32_t field_number);
54Status AdvanceToField(StreamDecoder& decoder, uint32_t field_number);
55
56} // namespace internal
57
58template <typename T, auto kReadFn>
59class Finder {
60 public:
61 constexpr Finder(ConstByteSpan message, uint32_t field_number)
62 : decoder_(message), field_number_(field_number) {}
63
64 Result<T> Next() {
65 T output;
66 PW_TRY(internal::AdvanceToField(decoder_, field_number_));
67 PW_TRY((decoder_.*kReadFn)(&output));
68 return output;
69 }
70
71 private:
72 Decoder decoder_;
73 uint32_t field_number_;
74};
75
76template <typename T, auto kReadFn>
78 public:
79 constexpr StreamFinder(stream::Reader& reader, uint32_t field_number)
80 : decoder_(reader), field_number_(field_number) {}
81
82 Result<T> Next() {
83 PW_TRY(internal::AdvanceToField(decoder_, field_number_));
84 Result<T> result = (decoder_.*kReadFn)();
85
86 // The StreamDecoder returns a NOT_FOUND if trying to read the wrong type
87 // for a field. Remap this to FAILED_PRECONDITION for consistency with the
88 // non-stream Find.
89 return result.status().IsNotFound()
90 ? Result<T>(Status::FailedPrecondition())
91 : result;
92 }
93
94 private:
95 StreamDecoder decoder_;
96 uint32_t field_number_;
97};
98
99template <typename T>
100class EnumFinder : private Finder<uint32_t, &Decoder::ReadUint32> {
101 public:
102 using Finder::Finder;
103
104 Result<T> Next() {
105 Result<uint32_t> result = Finder::Next();
106 if (!result.ok()) {
107 return result.status();
108 }
109 return static_cast<T>(result.value());
110 }
111};
112
113template <typename T>
115 : private StreamFinder<uint32_t, &StreamDecoder::ReadUint32> {
116 public:
117 using StreamFinder::StreamFinder;
118
119 Result<T> Next() {
120 Result<uint32_t> result = StreamFinder::Next();
121 if (!result.ok()) {
122 return result.status();
123 }
124 return static_cast<T>(result.value());
125 }
126};
127
128namespace internal {
129template <typename T, auto kReadFn>
130Result<T> Find(ConstByteSpan message, uint32_t field_number) {
131 Finder<T, kReadFn> finder(message, field_number);
132 return finder.Next();
133}
134
135template <typename T, auto kReadFn>
136Result<T> Find(stream::Reader& reader, uint32_t field_number) {
137 StreamFinder<T, kReadFn> finder(reader, field_number);
138 return finder.Next();
139}
140
141} // namespace internal
142
161inline Result<uint32_t> FindUint32(ConstByteSpan message,
162 uint32_t field_number) {
163 return internal::Find<uint32_t, &Decoder::ReadUint32>(message, field_number);
164}
165
166template <typename T, typename = std::enable_if_t<std::is_enum_v<T>>>
167inline Result<uint32_t> FindUint32(ConstByteSpan message, T field) {
168 return FindUint32(message, static_cast<uint32_t>(field));
169}
170
189inline Result<uint32_t> FindUint32(stream::Reader& message_stream,
190 uint32_t field_number) {
191 return internal::Find<uint32_t, &StreamDecoder::ReadUint32>(message_stream,
192 field_number);
193}
194
195template <typename T, typename = std::enable_if_t<std::is_enum_v<T>>>
196inline Result<uint32_t> FindUint32(stream::Reader& message_stream, T field) {
197 return FindUint32(message_stream, static_cast<uint32_t>(field));
198}
199
200using Uint32Finder = Finder<uint32_t, &Decoder::ReadUint32>;
201using Uint32StreamFinder = StreamFinder<uint32_t, &StreamDecoder::ReadUint32>;
202
221inline Result<int32_t> FindInt32(ConstByteSpan message, uint32_t field_number) {
222 return internal::Find<int32_t, &Decoder::ReadInt32>(message, field_number);
223}
224
225template <typename T, typename = std::enable_if_t<std::is_enum_v<T>>>
226inline Result<int32_t> FindInt32(ConstByteSpan message, T field) {
227 return FindInt32(message, static_cast<uint32_t>(field));
228}
229
248inline Result<int32_t> FindInt32(stream::Reader& message_stream,
249 uint32_t field_number) {
250 return internal::Find<int32_t, &StreamDecoder::ReadInt32>(message_stream,
251 field_number);
252}
253
254template <typename T, typename = std::enable_if_t<std::is_enum_v<T>>>
255inline Result<int32_t> FindInt32(stream::Reader& message_stream, T field) {
256 return FindInt32(message_stream, static_cast<uint32_t>(field));
257}
258
259using Int32Finder = Finder<int32_t, &Decoder::ReadInt32>;
260using Int32StreamFinder = StreamFinder<int32_t, &StreamDecoder::ReadInt32>;
261
280inline Result<int32_t> FindSint32(ConstByteSpan message,
281 uint32_t field_number) {
282 return internal::Find<int32_t, &Decoder::ReadSint32>(message, field_number);
283}
284
285template <typename T, typename = std::enable_if_t<std::is_enum_v<T>>>
286inline Result<int32_t> FindSint32(ConstByteSpan message, T field) {
287 return FindSint32(message, static_cast<uint32_t>(field));
288}
289
308inline Result<int32_t> FindSint32(stream::Reader& message_stream,
309 uint32_t field_number) {
310 return internal::Find<int32_t, &StreamDecoder::ReadSint32>(message_stream,
311 field_number);
312}
313
314template <typename T, typename = std::enable_if_t<std::is_enum_v<T>>>
315inline Result<int32_t> FindSint32(stream::Reader& message_stream, T field) {
316 return FindSint32(message_stream, static_cast<uint32_t>(field));
317}
318
319using Sint32Finder = Finder<int32_t, &Decoder::ReadSint32>;
320using Sint32StreamFinder = StreamFinder<int32_t, &StreamDecoder::ReadSint32>;
321
340inline Result<uint64_t> FindUint64(ConstByteSpan message,
341 uint32_t field_number) {
342 return internal::Find<uint64_t, &Decoder::ReadUint64>(message, field_number);
343}
344
345template <typename T, typename = std::enable_if_t<std::is_enum_v<T>>>
346inline Result<uint64_t> FindUint64(ConstByteSpan message, T field) {
347 return FindUint64(message, static_cast<uint32_t>(field));
348}
349
368inline Result<uint64_t> FindUint64(stream::Reader& message_stream,
369 uint32_t field_number) {
370 return internal::Find<uint64_t, &StreamDecoder::ReadUint64>(message_stream,
371 field_number);
372}
373
374template <typename T, typename = std::enable_if_t<std::is_enum_v<T>>>
375inline Result<uint64_t> FindUint64(stream::Reader& message_stream, T field) {
376 return FindUint64(message_stream, static_cast<uint32_t>(field));
377}
378
379using Uint64Finder = Finder<uint64_t, &Decoder::ReadUint64>;
380using Uint64StreamFinder = StreamFinder<uint64_t, &StreamDecoder::ReadUint64>;
381
400inline Result<int64_t> FindInt64(ConstByteSpan message, uint32_t field_number) {
401 return internal::Find<int64_t, &Decoder::ReadInt64>(message, field_number);
402}
403
404template <typename T, typename = std::enable_if_t<std::is_enum_v<T>>>
405inline Result<int64_t> FindInt64(ConstByteSpan message, T field) {
406 return FindInt64(message, static_cast<uint32_t>(field));
407}
408
427inline Result<int64_t> FindInt64(stream::Reader& message_stream,
428 uint32_t field_number) {
429 return internal::Find<int64_t, &StreamDecoder::ReadInt64>(message_stream,
430 field_number);
431}
432
433template <typename T, typename = std::enable_if_t<std::is_enum_v<T>>>
434inline Result<int64_t> FindInt64(stream::Reader& message_stream, T field) {
435 return FindInt64(message_stream, static_cast<uint32_t>(field));
436}
437
438using Int64Finder = Finder<int64_t, &Decoder::ReadInt64>;
439using Int64StreamFinder = StreamFinder<int64_t, &StreamDecoder::ReadInt64>;
440
459inline Result<int64_t> FindSint64(ConstByteSpan message,
460 uint32_t field_number) {
461 return internal::Find<int64_t, &Decoder::ReadSint64>(message, field_number);
462}
463
464template <typename T, typename = std::enable_if_t<std::is_enum_v<T>>>
465inline Result<int64_t> FindSint64(ConstByteSpan message, T field) {
466 return FindSint64(message, static_cast<uint32_t>(field));
467}
468
487inline Result<int64_t> FindSint64(stream::Reader& message_stream,
488 uint32_t field_number) {
489 return internal::Find<int64_t, &StreamDecoder::ReadSint64>(message_stream,
490 field_number);
491}
492
493template <typename T, typename = std::enable_if_t<std::is_enum_v<T>>>
494inline Result<int64_t> FindSint64(stream::Reader& message_stream, T field) {
495 return FindSint64(message_stream, static_cast<uint32_t>(field));
496}
497
498using Sint64Finder = Finder<int64_t, &Decoder::ReadSint64>;
499using Sint64StreamFinder = StreamFinder<int64_t, &StreamDecoder::ReadSint64>;
500
519inline Result<bool> FindBool(ConstByteSpan message, uint32_t field_number) {
520 return internal::Find<bool, &Decoder::ReadBool>(message, field_number);
521}
522
523template <typename T, typename = std::enable_if_t<std::is_enum_v<T>>>
524inline Result<bool> FindBool(ConstByteSpan message, T field) {
525 return FindBool(message, static_cast<uint32_t>(field));
526}
527
546inline Result<bool> FindBool(stream::Reader& message_stream,
547 uint32_t field_number) {
548 return internal::Find<bool, &StreamDecoder::ReadBool>(message_stream,
549 field_number);
550}
551
552template <typename T, typename = std::enable_if_t<std::is_enum_v<T>>>
553inline Result<bool> FindBool(stream::Reader& message_stream, T field) {
554 return FindBool(message_stream, static_cast<uint32_t>(field));
555}
556
557using BoolFinder = Finder<bool, &Decoder::ReadBool>;
558using BoolStreamFinder = StreamFinder<bool, &StreamDecoder::ReadBool>;
559
578inline Result<uint32_t> FindFixed32(ConstByteSpan message,
579 uint32_t field_number) {
580 return internal::Find<uint32_t, &Decoder::ReadFixed32>(message, field_number);
581}
582
583template <typename T, typename = std::enable_if_t<std::is_enum_v<T>>>
584inline Result<uint32_t> FindFixed32(ConstByteSpan message, T field) {
585 return FindFixed32(message, static_cast<uint32_t>(field));
586}
587
606inline Result<uint32_t> FindFixed32(stream::Reader& message_stream,
607 uint32_t field_number) {
608 return internal::Find<uint32_t, &StreamDecoder::ReadFixed32>(message_stream,
609 field_number);
610}
611
612template <typename T, typename = std::enable_if_t<std::is_enum_v<T>>>
613inline Result<uint32_t> FindFixed32(stream::Reader& message_stream, T field) {
614 return FindFixed32(message_stream, static_cast<uint32_t>(field));
615}
616
617using Fixed32Finder = Finder<uint32_t, &Decoder::ReadFixed32>;
618using Fixed32StreamFinder = StreamFinder<uint32_t, &StreamDecoder::ReadFixed32>;
619
638inline Result<uint64_t> FindFixed64(ConstByteSpan message,
639 uint32_t field_number) {
640 return internal::Find<uint64_t, &Decoder::ReadFixed64>(message, field_number);
641}
642
643template <typename T, typename = std::enable_if_t<std::is_enum_v<T>>>
644inline Result<uint64_t> FindFixed64(ConstByteSpan message, T field) {
645 return FindFixed64(message, static_cast<uint32_t>(field));
646}
647
666inline Result<uint64_t> FindFixed64(stream::Reader& message_stream,
667 uint32_t field_number) {
668 return internal::Find<uint64_t, &StreamDecoder::ReadFixed64>(message_stream,
669 field_number);
670}
671
672template <typename T, typename = std::enable_if_t<std::is_enum_v<T>>>
673inline Result<uint64_t> FindFixed64(stream::Reader& message_stream, T field) {
674 return FindFixed64(message_stream, static_cast<uint32_t>(field));
675}
676
677using Fixed64Finder = Finder<uint64_t, &Decoder::ReadFixed64>;
678using Fixed64StreamFinder = StreamFinder<uint64_t, &StreamDecoder::ReadFixed64>;
679
698inline Result<int32_t> FindSfixed32(ConstByteSpan message,
699 uint32_t field_number) {
700 return internal::Find<int32_t, &Decoder::ReadSfixed32>(message, field_number);
701}
702
703template <typename T, typename = std::enable_if_t<std::is_enum_v<T>>>
704inline Result<int32_t> FindSfixed32(ConstByteSpan message, T field) {
705 return FindSfixed32(message, static_cast<uint32_t>(field));
706}
707
726inline Result<int32_t> FindSfixed32(stream::Reader& message_stream,
727 uint32_t field_number) {
728 return internal::Find<int32_t, &StreamDecoder::ReadSfixed32>(message_stream,
729 field_number);
730}
731
732template <typename T, typename = std::enable_if_t<std::is_enum_v<T>>>
733inline Result<int32_t> FindSfixed32(stream::Reader& message_stream, T field) {
734 return FindSfixed32(message_stream, static_cast<uint32_t>(field));
735}
736
737using Sfixed32Finder = Finder<int32_t, &Decoder::ReadSfixed32>;
738using Sfixed32StreamFinder =
739 StreamFinder<int32_t, &StreamDecoder::ReadSfixed32>;
740
759inline Result<int64_t> FindSfixed64(ConstByteSpan message,
760 uint32_t field_number) {
761 return internal::Find<int64_t, &Decoder::ReadSfixed64>(message, field_number);
762}
763
764template <typename T, typename = std::enable_if_t<std::is_enum_v<T>>>
765inline Result<int64_t> FindSfixed64(ConstByteSpan message, T field) {
766 return FindSfixed64(message, static_cast<uint32_t>(field));
767}
768
787inline Result<int64_t> FindSfixed64(stream::Reader& message_stream,
788 uint32_t field_number) {
789 return internal::Find<int64_t, &StreamDecoder::ReadSfixed64>(message_stream,
790 field_number);
791}
792
793template <typename T, typename = std::enable_if_t<std::is_enum_v<T>>>
794inline Result<int64_t> FindSfixed64(stream::Reader& message_stream, T field) {
795 return FindSfixed64(message_stream, static_cast<uint32_t>(field));
796}
797
798using Sfixed64Finder = Finder<int64_t, &Decoder::ReadSfixed64>;
799using Sfixed64StreamFinder =
800 StreamFinder<int64_t, &StreamDecoder::ReadSfixed64>;
801
820inline Result<float> FindFloat(ConstByteSpan message, uint32_t field_number) {
821 return internal::Find<float, &Decoder::ReadFloat>(message, field_number);
822}
823
824template <typename T, typename = std::enable_if_t<std::is_enum_v<T>>>
825inline Result<float> FindFloat(ConstByteSpan message, T field) {
826 return FindFloat(message, static_cast<uint32_t>(field));
827}
828
847inline Result<float> FindFloat(stream::Reader& message_stream,
848 uint32_t field_number) {
849 return internal::Find<float, &StreamDecoder::ReadFloat>(message_stream,
850 field_number);
851}
852
853template <typename T, typename = std::enable_if_t<std::is_enum_v<T>>>
854inline Result<float> FindFloat(stream::Reader& message_stream, T field) {
855 return FindFloat(message_stream, static_cast<uint32_t>(field));
856}
857
858using FloatFinder = Finder<float, &Decoder::ReadFloat>;
859using FloatStreamFinder = StreamFinder<float, &StreamDecoder::ReadFloat>;
860
879inline Result<double> FindDouble(ConstByteSpan message, uint32_t field_number) {
880 return internal::Find<double, &Decoder::ReadDouble>(message, field_number);
881}
882
883template <typename T, typename = std::enable_if_t<std::is_enum_v<T>>>
884inline Result<double> FindDouble(ConstByteSpan message, T field) {
885 return FindDouble(message, static_cast<uint32_t>(field));
886}
887
906
907inline Result<double> FindDouble(stream::Reader& message_stream,
908 uint32_t field_number) {
909 return internal::Find<double, &StreamDecoder::ReadDouble>(message_stream,
910 field_number);
911}
912
913template <typename T, typename = std::enable_if_t<std::is_enum_v<T>>>
914inline Result<double> FindDouble(stream::Reader& message_stream, T field) {
915 return FindDouble(message_stream, static_cast<uint32_t>(field));
916}
917
918using DoubleFinder = Finder<double, &Decoder::ReadDouble>;
919using DoubleStreamFinder = StreamFinder<double, &StreamDecoder::ReadDouble>;
920
940inline Result<std::string_view> FindString(ConstByteSpan message,
941 uint32_t field_number) {
942 return internal::Find<std::string_view, &Decoder::ReadString>(message,
943 field_number);
944}
945
946template <typename T, typename = std::enable_if_t<std::is_enum_v<T>>>
947inline Result<std::string_view> FindString(ConstByteSpan message, T field) {
948 return FindString(message, static_cast<uint32_t>(field));
949}
950
973 uint32_t field_number,
974 span<char> out) {
975 StreamDecoder decoder(message_stream);
976 Status status = internal::AdvanceToField(decoder, field_number);
977 if (!status.ok()) {
978 return StatusWithSize(status, 0);
979 }
980 StatusWithSize sws = decoder.ReadString(out);
981
982 // The StreamDecoder returns a NOT_FOUND if trying to read the wrong type for
983 // a field. Remap this to FAILED_PRECONDITION for consistency with the
984 // non-stream Find.
985 return sws.status().IsNotFound() ? StatusWithSize::FailedPrecondition() : sws;
986}
987
1009 uint32_t field_number,
1010 InlineString<>& out) {
1011 StatusWithSize sws;
1012
1013 out.resize_and_overwrite([&](char* data, size_t size) {
1014 sws = FindString(message_stream, field_number, span(data, size));
1015 return sws.size();
1016 });
1017
1018 return sws;
1019}
1020
1021template <typename T, typename = std::enable_if_t<std::is_enum_v<T>>>
1022inline StatusWithSize FindString(stream::Reader& message_stream,
1023 T field,
1024 span<char> out) {
1025 return FindString(message_stream, static_cast<uint32_t>(field), out);
1026}
1027
1028template <typename T, typename = std::enable_if_t<std::is_enum_v<T>>>
1029inline StatusWithSize FindString(stream::Reader& message_stream,
1030 T field,
1031 InlineString<>& out) {
1032 return FindString(message_stream, static_cast<uint32_t>(field), out);
1033}
1034
1035using StringFinder = Finder<std::string_view, &Decoder::ReadString>;
1036
1055inline Result<ConstByteSpan> FindBytes(ConstByteSpan message,
1056 uint32_t field_number) {
1057 return internal::Find<ConstByteSpan, &Decoder::ReadBytes>(message,
1058 field_number);
1059}
1060
1061template <typename T, typename = std::enable_if_t<std::is_enum_v<T>>>
1062inline Result<ConstByteSpan> FindBytes(ConstByteSpan message, T field) {
1063 return FindBytes(message, static_cast<uint32_t>(field));
1064}
1065
1086 uint32_t field_number,
1087 ByteSpan out) {
1088 StreamDecoder decoder(message_stream);
1089 Status status = internal::AdvanceToField(decoder, field_number);
1090 if (!status.ok()) {
1091 return StatusWithSize(status, 0);
1092 }
1093 StatusWithSize sws = decoder.ReadBytes(out);
1094
1095 // The StreamDecoder returns a NOT_FOUND if trying to read the wrong type for
1096 // a field. Remap this to FAILED_PRECONDITION for consistency with the
1097 // non-stream Find.
1098 return sws.status().IsNotFound() ? StatusWithSize::FailedPrecondition() : sws;
1099}
1100
1101template <typename T, typename = std::enable_if_t<std::is_enum_v<T>>>
1102inline StatusWithSize FindBytes(stream::Reader& message_stream,
1103 T field,
1104 ByteSpan out) {
1105 return FindBytes(message_stream, static_cast<uint32_t>(field), out);
1106}
1107
1108using BytesFinder = Finder<ConstByteSpan, &Decoder::ReadBytes>;
1109
1128inline Result<ConstByteSpan> FindSubmessage(ConstByteSpan message,
1129 uint32_t field_number) {
1130 // On the wire, a submessage is identical to bytes. This function exists only
1131 // to clarify users' intent.
1132 return FindBytes(message, field_number);
1133}
1134
1135template <typename T, typename = std::enable_if_t<std::is_enum_v<T>>>
1136inline Result<ConstByteSpan> FindSubmessage(ConstByteSpan message, T field) {
1137 return FindSubmessage(message, static_cast<uint32_t>(field));
1138}
1139
1141inline Result<ConstByteSpan> FindRaw(ConstByteSpan message,
1142 uint32_t field_number) {
1143 Decoder decoder(message);
1144 PW_TRY(internal::AdvanceToField(decoder, field_number));
1145 return decoder.RawFieldBytes();
1146}
1147
1148template <typename T, typename = std::enable_if_t<std::is_enum_v<T>>>
1149Result<ConstByteSpan> FindRaw(ConstByteSpan message, T field) {
1150 return FindRaw(message, static_cast<uint32_t>(field));
1151}
1152
1153} // namespace pw::protobuf
pw::InlineBasicString is a fixed-capacity version of std::basic_string. In brief:
Definition: string.h:64
Definition: status.h:85
constexpr bool ok() const
Definition: status.h:157
Definition: status_with_size.h:49
constexpr size_t size() const
Definition: status_with_size.h:146
Definition: find.h:100
Definition: find.h:115
Definition: find.h:59
Definition: find.h:77
Definition: stream.h:345
Result< int32_t > FindInt32(ConstByteSpan message, uint32_t field_number)
Scans a serialized protobuf message for an int32 field.
Definition: find.h:221
Result< int64_t > FindInt64(ConstByteSpan message, uint32_t field_number)
Scans a serialized protobuf message for an int64 field.
Definition: find.h:400
Result< int64_t > FindSfixed64(ConstByteSpan message, uint32_t field_number)
Scans a serialized protobuf message for an sfixed64 field.
Definition: find.h:759
Result< ConstByteSpan > FindRaw(ConstByteSpan message, uint32_t field_number)
Returns a span containing the raw bytes of the value.
Definition: find.h:1141
Result< ConstByteSpan > FindBytes(ConstByteSpan message, uint32_t field_number)
Scans a serialized protobuf message for a bytes field.
Definition: find.h:1055
Result< int64_t > FindSint64(ConstByteSpan message, uint32_t field_number)
Scans a serialized protobuf message for an sint64 field.
Definition: find.h:459
Result< int32_t > FindSfixed32(ConstByteSpan message, uint32_t field_number)
Scans a serialized protobuf message for an sfixed32 field.
Definition: find.h:698
Result< int32_t > FindSint32(ConstByteSpan message, uint32_t field_number)
Scans a serialized protobuf message for an sint32 field.
Definition: find.h:280
Result< float > FindFloat(ConstByteSpan message, uint32_t field_number)
Scans a serialized protobuf message for a float field.
Definition: find.h:820
Result< uint64_t > FindFixed64(ConstByteSpan message, uint32_t field_number)
Scans a serialized protobuf message for a fixed64 field.
Definition: find.h:638
Result< uint32_t > FindFixed32(ConstByteSpan message, uint32_t field_number)
Scans a serialized protobuf message for a fixed32 field.
Definition: find.h:578
Result< ConstByteSpan > FindSubmessage(ConstByteSpan message, uint32_t field_number)
Scans a serialized protobuf message for a submessage.
Definition: find.h:1128
Result< std::string_view > FindString(ConstByteSpan message, uint32_t field_number)
Scans a serialized protobuf message for a string field.
Definition: find.h:940
Result< uint32_t > FindUint32(ConstByteSpan message, uint32_t field_number)
Scans a serialized protobuf message for a uint32 field.
Definition: find.h:161
Result< uint64_t > FindUint64(ConstByteSpan message, uint32_t field_number)
Scans a serialized protobuf message for a uint64 field.
Definition: find.h:340
Result< double > FindDouble(ConstByteSpan message, uint32_t field_number)
Scans a serialized protobuf message for a double field.
Definition: find.h:879
Result< bool > FindBool(ConstByteSpan message, uint32_t field_number)
Scans a serialized protobuf message for a bool field.
Definition: find.h:519
pw::InlineBasicString and pw::InlineString are safer alternatives to std::basic_string and std::strin...