1 #ifndef PROTOZERO_PBF_READER_HPP 2 #define PROTOZERO_PBF_READER_HPP 32 #if PROTOZERO_BYTE_ORDER != PROTOZERO_LITTLE_ENDIAN 65 const char* m_data =
nullptr;
68 const char* m_end =
nullptr;
79 const char* data = m_data;
80 skip_bytes(
sizeof(T));
81 std::memcpy(&result, data,
sizeof(T));
82 #if PROTOZERO_BYTE_ORDER != PROTOZERO_LITTLE_ENDIAN 83 detail::byteswap_inplace(&result);
90 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
91 const auto len = get_len_and_skip();
92 if (len %
sizeof(T) != 0) {
104 template <
typename T>
111 return get_varint<pbf_length_type>();
115 if (m_data + len > m_end) {
128 const auto len = get_length();
133 template <
typename T>
135 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
136 const auto len = get_len_and_skip();
137 return {T{m_data - len, m_data},
154 : m_data(view.data()),
155 m_end(view.data() + view.size()) {
173 #ifndef PROTOZERO_STRICT_API 185 explicit pbf_reader(
const std::pair<const char*, std::size_t>& data) noexcept
186 : m_data(data.first),
187 m_end(data.first + data.second) {
202 : m_data(data.data()),
203 m_end(data.data() + data.size()) {
233 swap(m_data, other.m_data);
234 swap(m_end, other.m_end);
235 swap(m_wire_type, other.m_wire_type);
236 swap(m_tag, other.m_tag);
244 operator bool() const noexcept {
245 return m_data < m_end;
258 return std::size_t(m_end - m_data);
277 if (m_data == m_end) {
281 const auto value = get_varint<uint32_t>();
286 if (m_tag == 0 || (m_tag >= 19000 && m_tag <= 19999)) {
291 switch (m_wire_type) {
292 case pbf_wire_type::varint:
293 case pbf_wire_type::fixed64:
294 case pbf_wire_type::length_delimited:
295 case pbf_wire_type::fixed32:
334 if (m_tag == next_tag) {
372 if (m_tag == next_tag && m_wire_type == type) {
455 protozero_assert(
tag() != 0 &&
"call next() before calling skip()");
457 case pbf_wire_type::varint:
460 case pbf_wire_type::fixed64:
463 case pbf_wire_type::length_delimited:
464 skip_bytes(get_length());
466 case pbf_wire_type::fixed32:
487 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
488 protozero_assert(
has_wire_type(pbf_wire_type::varint) &&
"not a varint");
489 const auto data = m_data;
502 protozero_assert(
has_wire_type(pbf_wire_type::varint) &&
"not a varint");
503 return get_varint<int32_t>();
514 protozero_assert(
has_wire_type(pbf_wire_type::varint) &&
"not a varint");
515 return get_varint<int32_t>();
526 protozero_assert(
has_wire_type(pbf_wire_type::varint) &&
"not a varint");
527 return get_svarint<int32_t>();
538 protozero_assert(
has_wire_type(pbf_wire_type::varint) &&
"not a varint");
539 return get_varint<uint32_t>();
550 protozero_assert(
has_wire_type(pbf_wire_type::varint) &&
"not a varint");
551 return get_varint<int64_t>();
562 protozero_assert(
has_wire_type(pbf_wire_type::varint) &&
"not a varint");
563 return get_svarint<int64_t>();
574 protozero_assert(
has_wire_type(pbf_wire_type::varint) &&
"not a varint");
575 return get_varint<uint64_t>();
586 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
587 protozero_assert(
has_wire_type(pbf_wire_type::fixed32) &&
"not a 32-bit fixed");
588 return get_fixed<uint32_t>();
599 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
600 protozero_assert(
has_wire_type(pbf_wire_type::fixed32) &&
"not a 32-bit fixed");
601 return get_fixed<int32_t>();
612 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
613 protozero_assert(
has_wire_type(pbf_wire_type::fixed64) &&
"not a 64-bit fixed");
614 return get_fixed<uint64_t>();
625 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
626 protozero_assert(
has_wire_type(pbf_wire_type::fixed64) &&
"not a 64-bit fixed");
627 return get_fixed<int64_t>();
638 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
639 protozero_assert(
has_wire_type(pbf_wire_type::fixed32) &&
"not a 32-bit fixed");
640 return get_fixed<float>();
651 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
652 protozero_assert(
has_wire_type(pbf_wire_type::fixed64) &&
"not a 64-bit fixed");
653 return get_fixed<double>();
666 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
667 protozero_assert(
has_wire_type(pbf_wire_type::length_delimited) &&
"not of type string, bytes or message");
668 const auto len = get_len_and_skip();
669 return {m_data - len, len};
672 #ifndef PROTOZERO_STRICT_API 681 std::pair<const char*, pbf_length_type>
get_data() {
682 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
683 protozero_assert(
has_wire_type(pbf_wire_type::length_delimited) &&
"not of type string, bytes or message");
684 const auto len = get_len_and_skip();
685 return {m_data - len, len};
781 return get_packed<pbf_reader::const_bool_iterator>();
794 return get_packed<pbf_reader::const_enum_iterator>();
807 return get_packed<pbf_reader::const_int32_iterator>();
820 return get_packed<pbf_reader::const_sint32_iterator>();
833 return get_packed<pbf_reader::const_uint32_iterator>();
846 return get_packed<pbf_reader::const_int64_iterator>();
859 return get_packed<pbf_reader::const_sint64_iterator>();
872 return get_packed<pbf_reader::const_uint64_iterator>();
885 return packed_fixed<uint32_t>();
898 return packed_fixed<int32_t>();
911 return packed_fixed<uint64_t>();
924 return packed_fixed<int64_t>();
937 return packed_fixed<float>();
950 return packed_fixed<double>();
969 #endif // PROTOZERO_PBF_READER_HPP pbf_reader(const data_view &view) noexcept
Definition: pbf_reader.hpp:153
int64_t get_sfixed64()
Definition: pbf_reader.hpp:624
uint32_t get_uint32()
Definition: pbf_reader.hpp:537
uint64_t get_fixed64()
Definition: pbf_reader.hpp:611
int32_t get_sfixed32()
Definition: pbf_reader.hpp:598
Definition: exception.hpp:48
uint64_t get_uint64()
Definition: pbf_reader.hpp:573
constexpr int64_t decode_zigzag64(uint64_t value) noexcept
Definition: varint.hpp:182
Definition: iterators.hpp:160
int32_t get_int32()
Definition: pbf_reader.hpp:513
Definition: exception.hpp:82
pbf_reader(const std::string &data) noexcept
Definition: pbf_reader.hpp:201
iterator_range< pbf_reader::const_sint64_iterator > get_packed_sint64()
Definition: pbf_reader.hpp:858
constexpr uint32_t tag_and_type(T tag, pbf_wire_type wire_type) noexcept
Definition: types.hpp:56
void swap(pbf_reader &lhs, pbf_reader &rhs) noexcept
Definition: pbf_reader.hpp:963
Contains macro checks for different configurations.
iterator_range< pbf_reader::const_float_iterator > get_packed_float()
Definition: pbf_reader.hpp:936
Contains the declaration of low-level types used in the pbf format.
bool has_wire_type(pbf_wire_type type) const noexcept
Definition: pbf_reader.hpp:444
std::size_t length() const noexcept
Definition: pbf_reader.hpp:257
void skip()
Definition: pbf_reader.hpp:454
iterator_range< pbf_reader::const_int32_iterator > get_packed_int32()
Definition: pbf_reader.hpp:806
pbf_reader get_message()
Definition: pbf_reader.hpp:718
pbf_reader() noexcept=default
iterator_range< pbf_reader::const_int64_iterator > get_packed_int64()
Definition: pbf_reader.hpp:845
void skip_varint(const char **data, const char *end)
Definition: varint.hpp:112
Contains the iterators for access to packed repeated fields.
pbf_wire_type
Definition: types.hpp:40
iterator_range< pbf_reader::const_uint64_iterator > get_packed_uint64()
Definition: pbf_reader.hpp:871
iterator_range< pbf_reader::const_sint32_iterator > get_packed_sint32()
Definition: pbf_reader.hpp:819
iterator_range< pbf_reader::const_sfixed32_iterator > get_packed_sfixed32()
Definition: pbf_reader.hpp:897
pbf_wire_type wire_type() const noexcept
Definition: pbf_reader.hpp:408
Contains the implementation of the data_view class.
Definition: exception.hpp:72
void swap(pbf_reader &other) noexcept
Definition: pbf_reader.hpp:231
int64_t get_sint64()
Definition: pbf_reader.hpp:561
bool next(pbf_tag_type next_tag)
Definition: pbf_reader.hpp:332
uint32_t tag_and_type() const noexcept
Definition: pbf_reader.hpp:434
std::pair< const char *, pbf_length_type > get_data()
Definition: pbf_reader.hpp:681
iterator_range< pbf_reader::const_bool_iterator > get_packed_bool()
Definition: pbf_reader.hpp:780
Contains functions to swap bytes in values (for different endianness).
int32_t get_sint32()
Definition: pbf_reader.hpp:525
std::string get_bytes()
Definition: pbf_reader.hpp:696
iterator_range< pbf_reader::const_double_iterator > get_packed_double()
Definition: pbf_reader.hpp:949
double get_double()
Definition: pbf_reader.hpp:650
bool get_bool()
Definition: pbf_reader.hpp:486
std::string get_string()
Definition: pbf_reader.hpp:707
uint32_t pbf_length_type
Definition: types.hpp:63
Contains the exceptions used in the protozero library.
pbf_reader(const std::pair< const char *, std::size_t > &data) noexcept
Definition: pbf_reader.hpp:185
data_view get_view()
Definition: pbf_reader.hpp:665
iterator_range< pbf_reader::const_fixed32_iterator > get_packed_fixed32()
Definition: pbf_reader.hpp:884
pbf_reader(const char *data, std::size_t size) noexcept
Definition: pbf_reader.hpp:168
uint32_t pbf_tag_type
Definition: types.hpp:33
uint32_t get_fixed32()
Definition: pbf_reader.hpp:585
iterator_range< pbf_reader::const_enum_iterator > get_packed_enum()
Definition: pbf_reader.hpp:793
Definition: data_view.hpp:39
pbf_tag_type tag() const noexcept
Definition: pbf_reader.hpp:389
Definition: iterators.hpp:359
iterator_range< pbf_reader::const_sfixed64_iterator > get_packed_sfixed64()
Definition: pbf_reader.hpp:923
Definition: iterators.hpp:286
int32_t get_enum()
Definition: pbf_reader.hpp:501
Definition: pbf_reader.hpp:62
bool next(pbf_tag_type next_tag, pbf_wire_type type)
Definition: pbf_reader.hpp:370
Definition: iterators.hpp:39
float get_float()
Definition: pbf_reader.hpp:637
Definition: exception.hpp:61
Contains low-level varint and zigzag encoding and decoding functions.
uint64_t decode_varint(const char **data, const char *end)
Definition: varint.hpp:89
bool next()
Definition: pbf_reader.hpp:276
iterator_range< pbf_reader::const_fixed64_iterator > get_packed_fixed64()
Definition: pbf_reader.hpp:910
int64_t get_int64()
Definition: pbf_reader.hpp:549
iterator_range< pbf_reader::const_uint32_iterator > get_packed_uint32()
Definition: pbf_reader.hpp:832
All parts of the protozero header-only library are in this namespace.
Definition: byteswap.hpp:24
void swap(data_view &lhs, data_view &rhs) noexcept
Definition: data_view.hpp:165