esphome-api-client 0.5.0
Modern C++17 client for the ESPHome native API (plaintext + Noise)
Loading...
Searching...
No Matches
bytes.hpp
Go to the documentation of this file.
1#pragma once
2
5
6#include <cstddef>
7#include <cstdint>
8#include <vector>
9
10namespace esphome::api {
11
13using ByteBuffer = std::vector<std::uint8_t>;
14
17class ByteView {
18public:
19 constexpr ByteView() noexcept = default;
20 constexpr ByteView(const std::uint8_t* data, const std::size_t size) noexcept
21 : data_(data), size_(size) {}
22
23 // NOLINTNEXTLINE(google-explicit-constructor,hicpp-explicit-conversions)
24 ByteView(const ByteBuffer& buf) noexcept : data_(buf.data()), size_(buf.size()) {}
25
26 [[nodiscard]] constexpr const std::uint8_t* data() const noexcept {
27 return data_;
28 }
29 [[nodiscard]] constexpr std::size_t size() const noexcept {
30 return size_;
31 }
32 [[nodiscard]] constexpr bool empty() const noexcept {
33 return size_ == 0;
34 }
35
36 [[nodiscard]] constexpr const std::uint8_t* begin() const noexcept {
37 return data_;
38 }
39 [[nodiscard]] constexpr const std::uint8_t* end() const noexcept {
40 return data_ + size_;
41 }
42
43 [[nodiscard]] constexpr std::uint8_t operator[](const std::size_t i) const noexcept {
44 return data_[i];
45 }
46
48 [[nodiscard]] ByteView subview(const std::size_t offset) const noexcept {
49 if (offset >= size_) {
50 return {};
51 }
52 return {data_ + offset, size_ - offset};
53 }
54
55private:
56 const std::uint8_t* data_ = nullptr;
57 std::size_t size_ = 0;
58};
59
61inline constexpr std::size_t max_varint_bytes = 5;
62
64enum class VarintStatus {
65 Ok,
67 Overflow,
68};
69
71[[nodiscard]] std::size_t varint_size(std::uint32_t value) noexcept;
72
74void append_varint(ByteBuffer& out, std::uint32_t value);
75
81[[nodiscard]] VarintStatus decode_varint(const std::uint8_t* data,
82 std::size_t len,
83 std::uint32_t& value,
84 std::size_t& consumed,
85 std::size_t max_bytes = max_varint_bytes) noexcept;
86
87} // namespace esphome::api
Non-owning view over a contiguous run of bytes (a C++17 stand-in for std::span<const std::uint8_t>).
Definition bytes.hpp:17
ByteView(const ByteBuffer &buf) noexcept
Definition bytes.hpp:24
constexpr std::uint8_t operator[](const std::size_t i) const noexcept
Definition bytes.hpp:43
constexpr const std::uint8_t * begin() const noexcept
Definition bytes.hpp:36
constexpr bool empty() const noexcept
Definition bytes.hpp:32
constexpr std::size_t size() const noexcept
Definition bytes.hpp:29
constexpr ByteView() noexcept=default
ByteView subview(const std::size_t offset) const noexcept
Sub-view starting at offset (clamped) spanning the remaining bytes.
Definition bytes.hpp:48
constexpr const std::uint8_t * end() const noexcept
Definition bytes.hpp:39
constexpr const std::uint8_t * data() const noexcept
Definition bytes.hpp:26
Definition bytes.hpp:10
std::size_t varint_size(std::uint32_t value) noexcept
Number of bytes the base-128 encoding of value occupies.
void append_varint(ByteBuffer &out, std::uint32_t value)
Append the base-128 varint encoding of value to out.
VarintStatus decode_varint(const std::uint8_t *data, std::size_t len, std::uint32_t &value, std::size_t &consumed, std::size_t max_bytes=max_varint_bytes) noexcept
Decode a base-128 varint from [data, data+len).
VarintStatus
Outcome of decoding a varint from a (possibly partial) buffer.
Definition bytes.hpp:64
@ Overflow
The varint exceeded the permitted byte budget.
@ Incomplete
The buffer ended mid-varint; read more and retry.
@ Ok
A complete value was decoded.
constexpr std::size_t max_varint_bytes
Maximum number of bytes a base-128 varint may occupy for a 32-bit value.
Definition bytes.hpp:61
std::vector< std::uint8_t > ByteBuffer
Owning, growable byte buffer.
Definition bytes.hpp:13