1 #ifndef PROTOZERO_PBF_READER_HPP 2 #define PROTOZERO_PBF_READER_HPP 26 #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 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) {
101 const auto val =
static_cast<T
>(
decode_varint(&m_data, m_end));
102 assert(m_data <= m_end);
106 template <
typename T>
113 return get_varint<pbf_length_type>();
117 if (m_data + len > m_end) {
130 const auto len = get_length();
135 template <
typename T>
137 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
138 const auto len = get_len_and_skip();
139 return {T{m_data - len, m_data},
156 : m_data(view.data()),
157 m_end(view.data() + view.size()) {
175 #ifndef PROTOZERO_STRICT_API 188 : m_data(
data.first),
235 swap(m_data, other.m_data);
236 swap(m_end, other.m_end);
237 swap(m_wire_type, other.m_wire_type);
238 swap(m_tag, other.m_tag);
246 operator bool() const noexcept {
247 return m_data < m_end;
254 return {m_data,
static_cast<std::size_t
>(m_end - m_data)};
267 return std::size_t(m_end - m_data);
286 if (m_data == m_end) {
290 const auto value = get_varint<uint32_t>();
295 if (m_tag == 0 || (m_tag >= 19000 && m_tag <= 19999)) {
300 switch (m_wire_type) {
301 case pbf_wire_type::varint:
302 case pbf_wire_type::fixed64:
303 case pbf_wire_type::length_delimited:
304 case pbf_wire_type::fixed32:
343 if (m_tag == next_tag) {
381 if (m_tag == next_tag && m_wire_type == type) {
464 protozero_assert(
tag() != 0 &&
"call next() before calling skip()");
466 case pbf_wire_type::varint:
469 case pbf_wire_type::fixed64:
472 case pbf_wire_type::length_delimited:
473 skip_bytes(get_length());
475 case pbf_wire_type::fixed32:
481 assert(m_data <= m_end);
497 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
498 protozero_assert(
has_wire_type(pbf_wire_type::varint) &&
"not a varint");
499 const auto data = m_data;
512 protozero_assert(
has_wire_type(pbf_wire_type::varint) &&
"not a varint");
513 return get_varint<int32_t>();
524 protozero_assert(
has_wire_type(pbf_wire_type::varint) &&
"not a varint");
525 return get_varint<int32_t>();
536 protozero_assert(
has_wire_type(pbf_wire_type::varint) &&
"not a varint");
537 return get_svarint<int32_t>();
548 protozero_assert(
has_wire_type(pbf_wire_type::varint) &&
"not a varint");
549 return get_varint<uint32_t>();
560 protozero_assert(
has_wire_type(pbf_wire_type::varint) &&
"not a varint");
561 return get_varint<int64_t>();
572 protozero_assert(
has_wire_type(pbf_wire_type::varint) &&
"not a varint");
573 return get_svarint<int64_t>();
584 protozero_assert(
has_wire_type(pbf_wire_type::varint) &&
"not a varint");
585 return get_varint<uint64_t>();
596 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
597 protozero_assert(
has_wire_type(pbf_wire_type::fixed32) &&
"not a 32-bit fixed");
598 return get_fixed<uint32_t>();
609 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
610 protozero_assert(
has_wire_type(pbf_wire_type::fixed32) &&
"not a 32-bit fixed");
611 return get_fixed<int32_t>();
622 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
623 protozero_assert(
has_wire_type(pbf_wire_type::fixed64) &&
"not a 64-bit fixed");
624 return get_fixed<uint64_t>();
635 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
636 protozero_assert(
has_wire_type(pbf_wire_type::fixed64) &&
"not a 64-bit fixed");
637 return get_fixed<int64_t>();
648 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
649 protozero_assert(
has_wire_type(pbf_wire_type::fixed32) &&
"not a 32-bit fixed");
650 return get_fixed<float>();
661 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
662 protozero_assert(
has_wire_type(pbf_wire_type::fixed64) &&
"not a 64-bit fixed");
663 return get_fixed<double>();
676 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
677 protozero_assert(
has_wire_type(pbf_wire_type::length_delimited) &&
"not of type string, bytes or message");
678 const auto len = get_len_and_skip();
679 return {m_data - len, len};
682 #ifndef PROTOZERO_STRICT_API 691 std::pair<const char*, pbf_length_type>
get_data() {
692 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
693 protozero_assert(
has_wire_type(pbf_wire_type::length_delimited) &&
"not of type string, bytes or message");
694 const auto len = get_len_and_skip();
695 return {m_data - len, len};
791 return get_packed<pbf_reader::const_bool_iterator>();
804 return get_packed<pbf_reader::const_enum_iterator>();
817 return get_packed<pbf_reader::const_int32_iterator>();
830 return get_packed<pbf_reader::const_sint32_iterator>();
843 return get_packed<pbf_reader::const_uint32_iterator>();
856 return get_packed<pbf_reader::const_int64_iterator>();
869 return get_packed<pbf_reader::const_sint64_iterator>();
882 return get_packed<pbf_reader::const_uint64_iterator>();
895 return packed_fixed<uint32_t>();
908 return packed_fixed<int32_t>();
921 return packed_fixed<uint64_t>();
934 return packed_fixed<int64_t>();
947 return packed_fixed<float>();
960 return packed_fixed<double>();
979 #endif // PROTOZERO_PBF_READER_HPP pbf_reader(const data_view &view) noexcept
Definition: pbf_reader.hpp:155
int64_t get_sfixed64()
Definition: pbf_reader.hpp:634
uint32_t get_uint32()
Definition: pbf_reader.hpp:547
uint64_t get_fixed64()
Definition: pbf_reader.hpp:621
int32_t get_sfixed32()
Definition: pbf_reader.hpp:608
Definition: exception.hpp:52
uint64_t get_uint64()
Definition: pbf_reader.hpp:583
constexpr int64_t decode_zigzag64(uint64_t value) noexcept
Definition: varint.hpp:199
Definition: iterators.hpp:160
int32_t get_int32()
Definition: pbf_reader.hpp:523
Definition: exception.hpp:92
pbf_reader(const std::string &data) noexcept
Definition: pbf_reader.hpp:203
iterator_range< pbf_reader::const_sint64_iterator > get_packed_sint64()
Definition: pbf_reader.hpp:868
constexpr uint32_t tag_and_type(T tag, pbf_wire_type wire_type) noexcept
Definition: types.hpp:55
void swap(pbf_reader &lhs, pbf_reader &rhs) noexcept
Definition: pbf_reader.hpp:973
Contains macro checks for different configurations.
iterator_range< pbf_reader::const_float_iterator > get_packed_float()
Definition: pbf_reader.hpp:946
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:453
std::size_t length() const noexcept
Definition: pbf_reader.hpp:266
void skip()
Definition: pbf_reader.hpp:463
iterator_range< pbf_reader::const_int32_iterator > get_packed_int32()
Definition: pbf_reader.hpp:816
pbf_reader get_message()
Definition: pbf_reader.hpp:728
pbf_reader() noexcept=default
iterator_range< pbf_reader::const_int64_iterator > get_packed_int64()
Definition: pbf_reader.hpp:855
void skip_varint(const char **data, const char *end)
Definition: varint.hpp:112
Contains the iterators for access to packed repeated fields.
constexpr std::size_t size() const noexcept
Return length of data in bytes.
Definition: data_view.hpp:99
pbf_wire_type
Definition: types.hpp:40
iterator_range< pbf_reader::const_uint64_iterator > get_packed_uint64()
Definition: pbf_reader.hpp:881
iterator_range< pbf_reader::const_sint32_iterator > get_packed_sint32()
Definition: pbf_reader.hpp:829
iterator_range< pbf_reader::const_sfixed32_iterator > get_packed_sfixed32()
Definition: pbf_reader.hpp:907
pbf_wire_type wire_type() const noexcept
Definition: pbf_reader.hpp:417
Contains the implementation of the data_view class.
Definition: exception.hpp:80
void swap(pbf_reader &other) noexcept
Definition: pbf_reader.hpp:233
data_view data() const noexcept
Definition: pbf_reader.hpp:253
int64_t get_sint64()
Definition: pbf_reader.hpp:571
bool next(pbf_tag_type next_tag)
Definition: pbf_reader.hpp:341
uint32_t tag_and_type() const noexcept
Definition: pbf_reader.hpp:443
std::pair< const char *, pbf_length_type > get_data()
Definition: pbf_reader.hpp:691
iterator_range< pbf_reader::const_bool_iterator > get_packed_bool()
Definition: pbf_reader.hpp:790
Contains functions to swap bytes in values (for different endianness).
int32_t get_sint32()
Definition: pbf_reader.hpp:535
std::string get_bytes()
Definition: pbf_reader.hpp:706
iterator_range< pbf_reader::const_double_iterator > get_packed_double()
Definition: pbf_reader.hpp:959
double get_double()
Definition: pbf_reader.hpp:660
pbf_reader & operator=(const pbf_reader &other) noexcept=default
pbf_reader messages can be copied trivially.
bool get_bool()
Definition: pbf_reader.hpp:496
std::string get_string()
Definition: pbf_reader.hpp:717
uint32_t pbf_length_type
Definition: types.hpp:62
Contains the exceptions used in the protozero library.
pbf_reader(const std::pair< const char *, std::size_t > &data) noexcept
Definition: pbf_reader.hpp:187
data_view get_view()
Definition: pbf_reader.hpp:675
iterator_range< pbf_reader::const_fixed32_iterator > get_packed_fixed32()
Definition: pbf_reader.hpp:894
pbf_reader(const char *data, std::size_t size) noexcept
Definition: pbf_reader.hpp:170
uint32_t pbf_tag_type
Definition: types.hpp:33
uint32_t get_fixed32()
Definition: pbf_reader.hpp:595
iterator_range< pbf_reader::const_enum_iterator > get_packed_enum()
Definition: pbf_reader.hpp:803
Definition: data_view.hpp:39
pbf_tag_type tag() const noexcept
Definition: pbf_reader.hpp:398
Definition: iterators.hpp:374
iterator_range< pbf_reader::const_sfixed64_iterator > get_packed_sfixed64()
Definition: pbf_reader.hpp:933
void byteswap_inplace(uint32_t *ptr) noexcept
byteswap the data pointed to by ptr in-place.
Definition: byteswap.hpp:55
Definition: iterators.hpp:289
int32_t get_enum()
Definition: pbf_reader.hpp:511
Definition: pbf_reader.hpp:62
bool next(pbf_tag_type next_tag, pbf_wire_type type)
Definition: pbf_reader.hpp:379
constexpr const char * data() const noexcept
Return pointer to data.
Definition: data_view.hpp:94
Definition: iterators.hpp:39
float get_float()
Definition: pbf_reader.hpp:647
Definition: exception.hpp:67
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:285
iterator_range< pbf_reader::const_fixed64_iterator > get_packed_fixed64()
Definition: pbf_reader.hpp:920
int64_t get_int64()
Definition: pbf_reader.hpp:559
iterator_range< pbf_reader::const_uint32_iterator > get_packed_uint32()
Definition: pbf_reader.hpp:842
All parts of the protozero header-only library are in this namespace.
Definition: byteswap.hpp:23