protozero
Minimalistic protocol buffer decoder and encoder in C++.
types.hpp
Go to the documentation of this file.
1 #ifndef PROTOZERO_TYPES_HPP
2 #define PROTOZERO_TYPES_HPP
3 
4 /*****************************************************************************
5 
6 protozero - Minimalistic protocol buffer decoder and encoder in C++.
7 
8 This file is from https://github.com/mapbox/protozero where you can find more
9 documentation.
10 
11 *****************************************************************************/
12 
19 #include <algorithm>
20 #include <cstddef>
21 #include <cstdint>
22 #include <cstring>
23 #include <string>
24 #include <utility>
25 
26 #include <protozero/config.hpp>
27 
28 namespace protozero {
29 
33 using pbf_tag_type = uint32_t;
34 
40 enum class pbf_wire_type : uint32_t {
41  varint = 0, // int32/64, uint32/64, sint32/64, bool, enum
42  fixed64 = 1, // fixed64, sfixed64, double
43  length_delimited = 2, // string, bytes, embedded messages,
44  // packed repeated fields
45  fixed32 = 5, // fixed32, sfixed32, float
46  unknown = 99 // used for default setting in this library
47 };
48 
55 template <typename T>
56 constexpr inline uint32_t tag_and_type(T tag, pbf_wire_type wire_type) noexcept {
57  return (static_cast<uint32_t>(static_cast<pbf_tag_type>(tag)) << 3) | static_cast<uint32_t>(wire_type);
58 }
59 
63 using pbf_length_type = uint32_t;
64 
65 #ifdef PROTOZERO_USE_VIEW
66 using data_view = PROTOZERO_USE_VIEW;
67 #else
68 
75 class data_view {
76 
77  const char* m_data;
78  std::size_t m_size;
79 
80 public:
81 
85  constexpr data_view() noexcept
86  : m_data(nullptr),
87  m_size(0) {
88  }
89 
96  constexpr data_view(const char* ptr, std::size_t length) noexcept
97  : m_data(ptr),
98  m_size(length) {
99  }
100 
106  data_view(const std::string& str) noexcept
107  : m_data(str.data()),
108  m_size(str.size()) {
109  }
110 
116  data_view(const char* ptr) noexcept
117  : m_data(ptr),
118  m_size(std::strlen(ptr)) {
119  }
120 
126  void swap(data_view& other) noexcept {
127  using std::swap;
128  swap(m_data, other.m_data);
129  swap(m_size, other.m_size);
130  }
131 
133  constexpr const char* data() const noexcept {
134  return m_data;
135  }
136 
138  constexpr std::size_t size() const noexcept {
139  return m_size;
140  }
141 
147  std::string to_string() const {
148  protozero_assert(m_data);
149  return std::string{m_data, m_size};
150  }
151 
157  explicit operator std::string() const {
158  protozero_assert(m_data);
159  return std::string{m_data, m_size};
160  }
161 
162 }; // class data_view
163 
170 inline void swap(data_view& lhs, data_view& rhs) noexcept {
171  lhs.swap(rhs);
172 }
173 
181 inline bool operator==(const data_view& lhs, const data_view& rhs) noexcept {
182  return lhs.size() == rhs.size() && std::equal(lhs.data(), lhs.data() + lhs.size(), rhs.data());
183 }
184 
192 inline bool operator!=(const data_view& lhs, const data_view& rhs) noexcept {
193  return !(lhs == rhs);
194 }
195 
196 #endif
197 
198 
199 } // end namespace protozero
200 
201 #endif // PROTOZERO_TYPES_HPP
data_view(const std::string &str) noexcept
Definition: types.hpp:106
constexpr uint32_t tag_and_type(T tag, pbf_wire_type wire_type) noexcept
Definition: types.hpp:56
std::string to_string() const
Definition: types.hpp:147
Contains macro checks for different configurations.
void swap(iterator_range< T > &lhs, iterator_range< T > &rhs) noexcept
Definition: iterators.hpp:137
constexpr std::size_t size() const noexcept
Return length of data in bytes.
Definition: types.hpp:138
pbf_wire_type
Definition: types.hpp:40
data_view(const char *ptr) noexcept
Definition: types.hpp:116
constexpr data_view() noexcept
Definition: types.hpp:85
void swap(data_view &other) noexcept
Definition: types.hpp:126
uint32_t pbf_length_type
Definition: types.hpp:63
uint32_t pbf_tag_type
Definition: types.hpp:33
Definition: types.hpp:75
bool operator==(const data_view &lhs, const data_view &rhs) noexcept
Definition: types.hpp:181
bool operator!=(const data_view &lhs, const data_view &rhs) noexcept
Definition: types.hpp:192
constexpr const char * data() const noexcept
Return pointer to data.
Definition: types.hpp:133
constexpr data_view(const char *ptr, std::size_t length) noexcept
Definition: types.hpp:96
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: types.hpp:170