#pragma once #include #include #include #include class span_writer { uint8_t *m_data; size_t m_capacity; size_t m_size = 0; public: span_writer(uint8_t *data, size_t capacity) : m_data(data), m_capacity(capacity) {} span_writer(std::span 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; } template void insert(uint8_t *, It first, It last) { while (first != last && m_size < m_capacity) m_data[m_size++] = *first++; } size_t size() const { return m_size; } size_t capacity() const { return m_capacity; } bool full() const { return m_size >= m_capacity; } 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); } };