1 #ifndef PROTOZERO_PBF_READER_HPP 2 #define PROTOZERO_PBF_READER_HPP 30 #if PROTOZERO_BYTE_ORDER != PROTOZERO_LITTLE_ENDIAN 63 const char* m_data =
nullptr;
66 const char* m_end =
nullptr;
77 skip_bytes(
sizeof(T));
78 detail::copy_or_byteswap<sizeof(T)>(m_data -
sizeof(T), &result);
84 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
85 const auto len = get_len_and_skip();
86 protozero_assert(len %
sizeof(T) == 0);
87 return create_fixed_iterator_range<T>(m_data - len, m_data);
102 return get_varint<pbf_length_type>();
106 if (m_data + len > m_end) {
119 const auto len = get_length();
124 template <
typename T>
126 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
127 const auto len = get_len_and_skip();
145 : m_data(view.data()),
146 m_end(view.data() + view.size()),
147 m_wire_type(pbf_wire_type::unknown),
163 m_wire_type(pbf_wire_type::unknown),
176 pbf_reader(std::pair<const char*, std::size_t> data) noexcept
177 : m_data(data.first),
178 m_end(data.first + data.second),
179 m_wire_type(pbf_wire_type::unknown),
194 : m_data(data.data()),
195 m_end(data.data() + data.size()),
196 m_wire_type(pbf_wire_type::unknown),
227 swap(m_data, other.m_data);
228 swap(m_end, other.m_end);
229 swap(m_wire_type, other.m_wire_type);
230 swap(m_tag, other.m_tag);
237 operator bool() const noexcept {
238 return m_data < m_end;
251 return std::size_t(m_end - m_data);
270 if (m_data == m_end) {
274 const auto value = get_varint<uint32_t>();
279 protozero_assert(((m_tag > 0 && m_tag < 19000) || (m_tag > 19999 && m_tag <= ((1 << 29) - 1))) &&
"tag out of range");
282 switch (m_wire_type) {
283 case pbf_wire_type::varint:
284 case pbf_wire_type::fixed64:
285 case pbf_wire_type::length_delimited:
286 case pbf_wire_type::fixed32:
380 protozero_assert(
tag() != 0 &&
"call next() before calling skip()");
382 case pbf_wire_type::varint:
385 case pbf_wire_type::fixed64:
388 case pbf_wire_type::length_delimited:
389 skip_bytes(get_length());
391 case pbf_wire_type::fixed32:
395 protozero_assert(
false &&
"can not be here because next() should have thrown already");
412 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
413 protozero_assert(
has_wire_type(pbf_wire_type::varint) &&
"not a varint");
414 protozero_assert((*m_data & 0x80) == 0 &&
"not a 1 byte varint");
416 return m_data[-1] != 0;
427 protozero_assert(
has_wire_type(pbf_wire_type::varint) &&
"not a varint");
428 return get_varint<int32_t>();
439 protozero_assert(
has_wire_type(pbf_wire_type::varint) &&
"not a varint");
440 return get_varint<int32_t>();
451 protozero_assert(
has_wire_type(pbf_wire_type::varint) &&
"not a varint");
452 return get_svarint<int32_t>();
463 protozero_assert(
has_wire_type(pbf_wire_type::varint) &&
"not a varint");
464 return get_varint<uint32_t>();
475 protozero_assert(
has_wire_type(pbf_wire_type::varint) &&
"not a varint");
476 return get_varint<int64_t>();
487 protozero_assert(
has_wire_type(pbf_wire_type::varint) &&
"not a varint");
488 return get_svarint<int64_t>();
499 protozero_assert(
has_wire_type(pbf_wire_type::varint) &&
"not a varint");
500 return get_varint<uint64_t>();
511 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
512 protozero_assert(
has_wire_type(pbf_wire_type::fixed32) &&
"not a 32-bit fixed");
513 return get_fixed<uint32_t>();
524 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
525 protozero_assert(
has_wire_type(pbf_wire_type::fixed32) &&
"not a 32-bit fixed");
526 return get_fixed<int32_t>();
537 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
538 protozero_assert(
has_wire_type(pbf_wire_type::fixed64) &&
"not a 64-bit fixed");
539 return get_fixed<uint64_t>();
550 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
551 protozero_assert(
has_wire_type(pbf_wire_type::fixed64) &&
"not a 64-bit fixed");
552 return get_fixed<int64_t>();
563 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
564 protozero_assert(
has_wire_type(pbf_wire_type::fixed32) &&
"not a 32-bit fixed");
565 return get_fixed<float>();
576 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
577 protozero_assert(
has_wire_type(pbf_wire_type::fixed64) &&
"not a 64-bit fixed");
578 return get_fixed<double>();
591 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
592 protozero_assert(
has_wire_type(pbf_wire_type::length_delimited) &&
"not of type string, bytes or message");
593 const auto len = get_len_and_skip();
597 #ifndef PROTOZERO_STRICT_API 606 std::pair<const char*, pbf_length_type>
get_data() {
607 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
608 protozero_assert(
has_wire_type(pbf_wire_type::length_delimited) &&
"not of type string, bytes or message");
609 const auto len = get_len_and_skip();
610 return std::make_pair(m_data-len, len);
688 return get_packed<pbf_reader::const_bool_iterator>();
701 return get_packed<pbf_reader::const_enum_iterator>();
714 return get_packed<pbf_reader::const_int32_iterator>();
727 return get_packed<pbf_reader::const_sint32_iterator>();
740 return get_packed<pbf_reader::const_uint32_iterator>();
753 return get_packed<pbf_reader::const_int64_iterator>();
766 return get_packed<pbf_reader::const_sint64_iterator>();
779 return get_packed<pbf_reader::const_uint64_iterator>();
792 return packed_fixed<uint32_t>();
805 return packed_fixed<int32_t>();
818 return packed_fixed<uint64_t>();
831 return packed_fixed<int64_t>();
844 return packed_fixed<float>();
857 return packed_fixed<double>();
876 #endif // PROTOZERO_PBF_READER_HPP pbf_reader(const data_view &view) noexcept
Definition: pbf_reader.hpp:144
int64_t get_sfixed64()
Definition: pbf_reader.hpp:549
uint32_t get_uint32()
Definition: pbf_reader.hpp:462
uint64_t get_fixed64()
Definition: pbf_reader.hpp:536
int32_t get_sfixed32()
Definition: pbf_reader.hpp:523
Definition: exception.hpp:48
uint64_t get_uint64()
Definition: pbf_reader.hpp:498
auto get_packed_double() -> decltype(packed_fixed< double >())
Definition: pbf_reader.hpp:856
pbf_reader(const char *data, std::size_t length) noexcept
Definition: pbf_reader.hpp:160
int32_t get_int32()
Definition: pbf_reader.hpp:438
pbf_reader(const std::string &data) noexcept
Definition: pbf_reader.hpp:193
bool next(pbf_tag_type tag)
Definition: pbf_reader.hpp:320
iterator_range< pbf_reader::const_sint64_iterator > get_packed_sint64()
Definition: pbf_reader.hpp:765
auto get_packed_float() -> decltype(packed_fixed< float >())
Definition: pbf_reader.hpp:843
auto get_packed_fixed32() -> decltype(packed_fixed< uint32_t >())
Definition: pbf_reader.hpp:791
void swap(pbf_reader &lhs, pbf_reader &rhs) noexcept
Definition: pbf_reader.hpp:870
Contains macro checks for different configurations.
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:369
std::size_t length() const noexcept
Definition: pbf_reader.hpp:250
void skip()
Definition: pbf_reader.hpp:379
iterator_range< pbf_reader::const_int32_iterator > get_packed_int32()
Definition: pbf_reader.hpp:713
pbf_reader get_message()
Definition: pbf_reader.hpp:643
pbf_reader() noexcept=default
iterator_range< pbf_reader::const_int64_iterator > get_packed_int64()
Definition: pbf_reader.hpp:752
void skip_varint(const char **data, const char *end)
Definition: varint.hpp:112
auto get_packed_sfixed64() -> decltype(packed_fixed< int64_t >())
Definition: pbf_reader.hpp:830
Contains the iterators for access to packed repeated fields.
auto get_packed_sfixed32() -> decltype(packed_fixed< int32_t >())
Definition: pbf_reader.hpp:804
pbf_wire_type
Definition: types.hpp:39
iterator_range< pbf_reader::const_uint64_iterator > get_packed_uint64()
Definition: pbf_reader.hpp:778
iterator_range< pbf_reader::const_sint32_iterator > get_packed_sint32()
Definition: pbf_reader.hpp:726
pbf_wire_type wire_type() const noexcept
Definition: pbf_reader.hpp:359
pbf_reader(std::pair< const char *, std::size_t > data) noexcept
Definition: pbf_reader.hpp:176
void swap(pbf_reader &other) noexcept
Definition: pbf_reader.hpp:225
int64_t get_sint64()
Definition: pbf_reader.hpp:486
std::pair< const char *, pbf_length_type > get_data()
Definition: pbf_reader.hpp:606
auto get_packed_fixed64() -> decltype(packed_fixed< uint64_t >())
Definition: pbf_reader.hpp:817
iterator_range< pbf_reader::const_bool_iterator > get_packed_bool()
Definition: pbf_reader.hpp:687
Contains functions to swap bytes in values (for different endianness).
int32_t get_sint32()
Definition: pbf_reader.hpp:450
std::string get_bytes()
Definition: pbf_reader.hpp:621
double get_double()
Definition: pbf_reader.hpp:575
pbf_reader & operator=(const pbf_reader &other) noexcept=default
pbf_reader messages can be copied trivially.
bool get_bool()
Definition: pbf_reader.hpp:411
std::string get_string()
Definition: pbf_reader.hpp:632
uint32_t pbf_length_type
Definition: types.hpp:51
Contains the exceptions used in the protozero library.
data_view get_view()
Definition: pbf_reader.hpp:590
uint32_t pbf_tag_type
Definition: types.hpp:32
uint32_t get_fixed32()
Definition: pbf_reader.hpp:510
iterator_range< pbf_reader::const_enum_iterator > get_packed_enum()
Definition: pbf_reader.hpp:700
pbf_tag_type tag() const noexcept
Definition: pbf_reader.hpp:340
Definition: iterators.hpp:327
Definition: iterators.hpp:260
int32_t get_enum()
Definition: pbf_reader.hpp:426
Definition: pbf_reader.hpp:60
Definition: iterators.hpp:53
float get_float()
Definition: pbf_reader.hpp:562
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:269
int64_t get_int64()
Definition: pbf_reader.hpp:474
iterator_range< pbf_reader::const_uint32_iterator > get_packed_uint32()
Definition: pbf_reader.hpp:739
int64_t decode_zigzag64(uint64_t value) noexcept
Definition: varint.hpp:181
All parts of the protozero header-only library are in this namespace.
Definition: byteswap.hpp:24