1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- // Copyright Takatoshi Kondo 2018
- //
- // Distributed under the Boost Software License, Version 1.0.
- // (See accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- #if !defined(MQTT_VARIABLE_LENGTH_HPP)
- #define MQTT_VARIABLE_LENGTH_HPP
- #include <string>
- #include <mqtt/namespace.hpp>
- #include <mqtt/exception.hpp>
- namespace MQTT_NS {
- inline std::string
- variable_bytes(std::size_t size) {
- std::string bytes;
- if (size > 0xfffffff) return bytes;
- while (size > 127) {
- bytes.push_back(static_cast<char>((size & 0b01111111) | 0b10000000));
- size >>= 7;
- }
- bytes.push_back(size & 0b01111111);
- return bytes;
- }
- template <typename Container>
- inline void
- variable_push(Container& c, std::size_t size) {
- if (size > 0xfffffff) return;
- while (size > 127) {
- c.push_back(static_cast<typename Container::value_type>((size & 0b01111111) | 0b10000000));
- size >>= 7;
- }
- c.push_back(size & 0b01111111);
- }
- template <typename T>
- constexpr std::tuple<std::size_t, std::size_t>
- variable_length(T const& bytes) {
- std::size_t len = 0;
- std::size_t mul = 1;
- std::size_t consumed = 0;
- for (auto b : bytes) {
- len += (b & 0b01111111) * mul;
- mul *= 128;
- ++consumed;
- if (mul > 128 * 128 * 128 * 128) return {0, 0};
- if (!(b & 0b10000000)) break;
- }
- return {len, consumed};
- }
- template <typename Iterator>
- constexpr std::tuple<std::size_t, std::size_t>
- variable_length(Iterator b, Iterator e) {
- std::size_t len = 0;
- std::size_t mul = 1;
- std::size_t consumed = 0;
- for (; b != e; ++b) {
- len += (*b & 0b01111111) * mul;
- mul *= 128;
- ++consumed;
- if (mul > 128 * 128 * 128 * 128) return {0, 0};
- if (!(*b & 0b10000000)) break;
- }
- return {len, consumed};
- }
- } // namespace MQTT_NS
- #endif // MQTT_VARIABLE_LENGTH_HPP
|