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 
143  constexpr bool empty() const noexcept {
144  return m_size == 0;
145  }
146 
152  std::string to_string() const {
153  protozero_assert(m_data);
154  return std::string{m_data, m_size};
155  }
156 
162  explicit operator std::string() const {
163  protozero_assert(m_data);
164  return std::string{m_data, m_size};
165  }
166 
167 }; // class data_view
168 
175 inline void swap(data_view& lhs, data_view& rhs) noexcept {
176  lhs.swap(rhs);
177 }
178 
186 inline bool operator==(const data_view& lhs, const data_view& rhs) noexcept {
187  return lhs.size() == rhs.size() && std::equal(lhs.data(), lhs.data() + lhs.size(), rhs.data());
188 }
189 
197 inline bool operator!=(const data_view& lhs, const data_view& rhs) noexcept {
198  return !(lhs == rhs);
199 }
200 
201 #endif
202 
203 
204 } // end namespace protozero
205 
206 #endif // PROTOZERO_TYPES_HPP
constexpr bool empty() const noexcept
Returns true if size is 0.
Definition: types.hpp:143
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:152
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:186
bool operator!=(const data_view &lhs, const data_view &rhs) noexcept
Definition: types.hpp:197
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:175