extract msgpack into its own static library; move non-templated bodies to msgpack.cpp; introduce util INTERFACE lib for span_writer

This commit is contained in:
Ian Gulliver
2026-05-01 10:43:29 -07:00
parent 7000c2e825
commit 1e97058b9b
6 changed files with 477 additions and 409 deletions

2
util/CMakeLists.txt Normal file
View File

@@ -0,0 +1,2 @@
add_library(util INTERFACE)
target_include_directories(util INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})

50
util/span_writer.h Normal file
View File

@@ -0,0 +1,50 @@
#pragma once
#include <cstddef>
#include <cstdint>
#include <cstring>
#include <span>
class span_writer {
uint8_t *m_data;
size_t m_capacity;
size_t m_size = 0;
bool m_overflow = false;
public:
span_writer(uint8_t *data, size_t capacity) : m_data(data), m_capacity(capacity) {}
span_writer(std::span<uint8_t> buf) : m_data(buf.data()), m_capacity(buf.size()) {}
void push_back(uint8_t v) {
if (m_size < m_capacity) m_data[m_size++] = v;
else m_overflow = true;
}
template <class It>
void insert(uint8_t *, It first, It last) {
while (first != last) {
if (m_size < m_capacity) m_data[m_size++] = *first++;
else { m_overflow = true; return; }
}
}
size_t size() const { return m_size; }
size_t capacity() const { return m_capacity; }
bool full() const { return m_size >= m_capacity; }
bool overflow() const { return m_overflow; }
uint8_t *data() { return m_data; }
const uint8_t *data() const { return m_data; }
uint8_t *begin() { return m_data; }
uint8_t *end() { return m_data + m_size; }
const uint8_t *begin() const { return m_data; }
const uint8_t *end() const { return m_data + m_size; }
span_writer subspan(size_t offset) {
return span_writer(m_data + offset, m_capacity - offset);
}
span_writer subspan(size_t offset, size_t len) {
return span_writer(m_data + offset, len);
}
};