38 lines
881 B
C
38 lines
881 B
C
|
|
#pragma once
|
||
|
|
#include <cstddef>
|
||
|
|
#include <cstdint>
|
||
|
|
#include <cstring>
|
||
|
|
#include <span>
|
||
|
|
|
||
|
|
template <size_t N>
|
||
|
|
class prepend_buffer {
|
||
|
|
uint8_t m_buf[N];
|
||
|
|
size_t m_start = N / 2;
|
||
|
|
size_t m_end = N / 2;
|
||
|
|
|
||
|
|
public:
|
||
|
|
template <typename T>
|
||
|
|
T* prepend() {
|
||
|
|
m_start -= sizeof(T);
|
||
|
|
return reinterpret_cast<T*>(m_buf + m_start);
|
||
|
|
}
|
||
|
|
|
||
|
|
uint8_t* append(size_t len) {
|
||
|
|
uint8_t* p = m_buf + m_end;
|
||
|
|
m_end += len;
|
||
|
|
return p;
|
||
|
|
}
|
||
|
|
|
||
|
|
void append_copy(std::span<const uint8_t> data) {
|
||
|
|
memcpy(append(data.size()), data.data(), data.size());
|
||
|
|
}
|
||
|
|
|
||
|
|
uint8_t* payload_ptr() { return m_buf + m_end; }
|
||
|
|
|
||
|
|
uint8_t* data() { return m_buf + m_start; }
|
||
|
|
const uint8_t* data() const { return m_buf + m_start; }
|
||
|
|
size_t size() const { return m_end - m_start; }
|
||
|
|
|
||
|
|
std::span<const uint8_t> span() const { return {data(), size()}; }
|
||
|
|
};
|