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 83 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) {
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 187 explicit pbf_reader(
const std::pair<const char*, std::size_t>& data) noexcept
188 : m_data(data.first),
189 m_end(data.first + data.second) {
204 : m_data(data.data()),
205 m_end(data.data() + data.size()) {
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;
260 return std::size_t(m_end - m_data);
279 if (m_data == m_end) {
283 const auto value = get_varint<uint32_t>();
288 if (m_tag == 0 || (m_tag >= 19000 && m_tag <= 19999)) {
293 switch (m_wire_type) {
294 case pbf_wire_type::varint:
295 case pbf_wire_type::fixed64:
296 case pbf_wire_type::length_delimited:
297 case pbf_wire_type::fixed32:
336 if (m_tag == next_tag) {
374 if (m_tag == next_tag && m_wire_type == type) {
457 protozero_assert(
tag() != 0 &&
"call next() before calling skip()");
459 case pbf_wire_type::varint:
462 case pbf_wire_type::fixed64:
465 case pbf_wire_type::length_delimited:
466 skip_bytes(get_length());
468 case pbf_wire_type::fixed32:
474 assert(m_data <= m_end);
490 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
491 protozero_assert(
has_wire_type(pbf_wire_type::varint) &&
"not a varint");
492 const auto data = m_data;
505 protozero_assert(
has_wire_type(pbf_wire_type::varint) &&
"not a varint");
506 return get_varint<int32_t>();
517 protozero_assert(
has_wire_type(pbf_wire_type::varint) &&
"not a varint");
518 return get_varint<int32_t>();
529 protozero_assert(
has_wire_type(pbf_wire_type::varint) &&
"not a varint");
530 return get_svarint<int32_t>();
541 protozero_assert(
has_wire_type(pbf_wire_type::varint) &&
"not a varint");
542 return get_varint<uint32_t>();
553 protozero_assert(
has_wire_type(pbf_wire_type::varint) &&
"not a varint");
554 return get_varint<int64_t>();
565 protozero_assert(
has_wire_type(pbf_wire_type::varint) &&
"not a varint");
566 return get_svarint<int64_t>();
577 protozero_assert(
has_wire_type(pbf_wire_type::varint) &&
"not a varint");
578 return get_varint<uint64_t>();
589 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
590 protozero_assert(
has_wire_type(pbf_wire_type::fixed32) &&
"not a 32-bit fixed");
591 return get_fixed<uint32_t>();
602 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
603 protozero_assert(
has_wire_type(pbf_wire_type::fixed32) &&
"not a 32-bit fixed");
604 return get_fixed<int32_t>();
615 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
616 protozero_assert(
has_wire_type(pbf_wire_type::fixed64) &&
"not a 64-bit fixed");
617 return get_fixed<uint64_t>();
628 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
629 protozero_assert(
has_wire_type(pbf_wire_type::fixed64) &&
"not a 64-bit fixed");
630 return get_fixed<int64_t>();
641 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
642 protozero_assert(
has_wire_type(pbf_wire_type::fixed32) &&
"not a 32-bit fixed");
643 return get_fixed<float>();
654 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
655 protozero_assert(
has_wire_type(pbf_wire_type::fixed64) &&
"not a 64-bit fixed");
656 return get_fixed<double>();
669 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
670 protozero_assert(
has_wire_type(pbf_wire_type::length_delimited) &&
"not of type string, bytes or message");
671 const auto len = get_len_and_skip();
672 return {m_data - len, len};
675 #ifndef PROTOZERO_STRICT_API 684 std::pair<const char*, pbf_length_type>
get_data() {
685 protozero_assert(
tag() != 0 &&
"call next() before accessing field value");
686 protozero_assert(
has_wire_type(pbf_wire_type::length_delimited) &&
"not of type string, bytes or message");
687 const auto len = get_len_and_skip();
688 return {m_data - len, len};
784 return get_packed<pbf_reader::const_bool_iterator>();
797 return get_packed<pbf_reader::const_enum_iterator>();
810 return get_packed<pbf_reader::const_int32_iterator>();
823 return get_packed<pbf_reader::const_sint32_iterator>();
836 return get_packed<pbf_reader::const_uint32_iterator>();
849 return get_packed<pbf_reader::const_int64_iterator>();
862 return get_packed<pbf_reader::const_sint64_iterator>();
875 return get_packed<pbf_reader::const_uint64_iterator>();
888 return packed_fixed<uint32_t>();
901 return packed_fixed<int32_t>();
914 return packed_fixed<uint64_t>();
927 return packed_fixed<int64_t>();
940 return packed_fixed<float>();
953 return packed_fixed<double>();
972 #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:627
uint32_t get_uint32()
Definition: pbf_reader.hpp:540
uint64_t get_fixed64()
Definition: pbf_reader.hpp:614
int32_t get_sfixed32()
Definition: pbf_reader.hpp:601
Definition: exception.hpp:52
uint64_t get_uint64()
Definition: pbf_reader.hpp:576
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:516
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:861
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:966
Contains macro checks for different configurations.
iterator_range< pbf_reader::const_float_iterator > get_packed_float()
Definition: pbf_reader.hpp:939
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:446
std::size_t length() const noexcept
Definition: pbf_reader.hpp:259
void skip()
Definition: pbf_reader.hpp:456
iterator_range< pbf_reader::const_int32_iterator > get_packed_int32()
Definition: pbf_reader.hpp:809
pbf_reader get_message()
Definition: pbf_reader.hpp:721
pbf_reader() noexcept=default
iterator_range< pbf_reader::const_int64_iterator > get_packed_int64()
Definition: pbf_reader.hpp:848
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:874
iterator_range< pbf_reader::const_sint32_iterator > get_packed_sint32()
Definition: pbf_reader.hpp:822
iterator_range< pbf_reader::const_sfixed32_iterator > get_packed_sfixed32()
Definition: pbf_reader.hpp:900
pbf_wire_type wire_type() const noexcept
Definition: pbf_reader.hpp:410
Contains the implementation of the data_view class.
Definition: exception.hpp:80
void swap(pbf_reader &other) noexcept
Definition: pbf_reader.hpp:233
int64_t get_sint64()
Definition: pbf_reader.hpp:564
bool next(pbf_tag_type next_tag)
Definition: pbf_reader.hpp:334
uint32_t tag_and_type() const noexcept
Definition: pbf_reader.hpp:436
std::pair< const char *, pbf_length_type > get_data()
Definition: pbf_reader.hpp:684
iterator_range< pbf_reader::const_bool_iterator > get_packed_bool()
Definition: pbf_reader.hpp:783
Contains functions to swap bytes in values (for different endianness).
int32_t get_sint32()
Definition: pbf_reader.hpp:528
std::string get_bytes()
Definition: pbf_reader.hpp:699
iterator_range< pbf_reader::const_double_iterator > get_packed_double()
Definition: pbf_reader.hpp:952
double get_double()
Definition: pbf_reader.hpp:653
bool get_bool()
Definition: pbf_reader.hpp:489
std::string get_string()
Definition: pbf_reader.hpp:710
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:668
iterator_range< pbf_reader::const_fixed32_iterator > get_packed_fixed32()
Definition: pbf_reader.hpp:887
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:588
iterator_range< pbf_reader::const_enum_iterator > get_packed_enum()
Definition: pbf_reader.hpp:796
Definition: data_view.hpp:39
pbf_tag_type tag() const noexcept
Definition: pbf_reader.hpp:391
Definition: iterators.hpp:367
iterator_range< pbf_reader::const_sfixed64_iterator > get_packed_sfixed64()
Definition: pbf_reader.hpp:926
Definition: iterators.hpp:286
int32_t get_enum()
Definition: pbf_reader.hpp:504
Definition: pbf_reader.hpp:62
bool next(pbf_tag_type next_tag, pbf_wire_type type)
Definition: pbf_reader.hpp:372
Definition: iterators.hpp:39
float get_float()
Definition: pbf_reader.hpp:640
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:278
iterator_range< pbf_reader::const_fixed64_iterator > get_packed_fixed64()
Definition: pbf_reader.hpp:913
int64_t get_int64()
Definition: pbf_reader.hpp:552
iterator_range< pbf_reader::const_uint32_iterator > get_packed_uint32()
Definition: pbf_reader.hpp:835
All parts of the protozero header-only library are in this namespace.
Definition: byteswap.hpp:23
void swap(data_view &lhs, data_view &rhs) noexcept
Definition: data_view.hpp:165