mqtt_cpp
variable_length.hpp
Go to the documentation of this file.
1 // Copyright Takatoshi Kondo 2018
2 //
3 // Distributed under the Boost Software License, Version 1.0.
4 // (See accompanying file LICENSE_1_0.txt or copy at
5 // http://www.boost.org/LICENSE_1_0.txt)
6 
7 #if !defined(MQTT_VARIABLE_LENGTH_HPP)
8 #define MQTT_VARIABLE_LENGTH_HPP
9 
10 #include <string>
11 
12 #include <mqtt/namespace.hpp>
13 #include <mqtt/exception.hpp>
14 
15 namespace MQTT_NS {
16 
17 inline std::string
18 variable_bytes(std::size_t size) {
19  std::string bytes;
20  if (size > 0xfffffff) return bytes;
21  while (size > 127) {
22  bytes.push_back(static_cast<char>((size & 0b01111111) | 0b10000000));
23  size >>= 7;
24  }
25  bytes.push_back(size & 0b01111111);
26  return bytes;
27 }
28 
29 template <typename Container>
30 inline void
31 variable_push(Container& c, std::size_t size) {
32  if (size > 0xfffffff) return;
33  while (size > 127) {
34  c.push_back(static_cast<typename Container::value_type>((size & 0b01111111) | 0b10000000));
35  size >>= 7;
36  }
37  c.push_back(size & 0b01111111);
38 }
39 
40 template <typename T>
41 constexpr std::tuple<std::size_t, std::size_t>
42 variable_length(T const& bytes) {
43  std::size_t len = 0;
44  std::size_t mul = 1;
45  std::size_t consumed = 0;
46  for (auto b : bytes) {
47  len += (b & 0b01111111) * mul;
48  mul *= 128;
49  ++consumed;
50  if (mul > 128 * 128 * 128 * 128) return {0, 0};
51  if (!(b & 0b10000000)) break;
52  }
53  return {len, consumed};
54 }
55 
56 template <typename Iterator>
57 constexpr std::tuple<std::size_t, std::size_t>
58 variable_length(Iterator b, Iterator e) {
59  std::size_t len = 0;
60  std::size_t mul = 1;
61  std::size_t consumed = 0;
62  for (; b != e; ++b) {
63  len += (*b & 0b01111111) * mul;
64  mul *= 128;
65  ++consumed;
66  if (mul > 128 * 128 * 128 * 128) return {0, 0};
67  if (!(*b & 0b10000000)) break;
68  }
69  return {len, consumed};
70 }
71 
72 } // namespace MQTT_NS
73 
74 #endif // MQTT_VARIABLE_LENGTH_HPP
Definition: any.hpp:27
std::string variable_bytes(std::size_t size)
Definition: variable_length.hpp:18
void variable_push(Container &c, std::size_t size)
Definition: variable_length.hpp:31
std::size_t size(basic_message_variant< PacketIdBytes > const &mv)
Definition: message_variant.hpp:93
constexpr std::tuple< std::size_t, std::size_t > variable_length(T const &bytes)
Definition: variable_length.hpp:42