10#include "tpde/base.hpp"
11#include "tpde/util/misc.hpp"
15template <
typename VecT>
16 requires std::same_as<typename VecT::value_type, u8>
18 VecT *vector =
nullptr;
23 VectorWriter() noexcept = default;
24 VectorWriter(VecT &vector) noexcept
26 cur(vector.data() + vector.size()),
27 end(vector.data() + vector.size()) {}
28 VectorWriter(VecT &vector,
size_t off) noexcept
30 cur(vector.data() + off),
31 end(vector.data() + vector.size()) {}
32 ~VectorWriter() { flush(); }
34 VectorWriter(
const VectorWriter &) =
delete;
35 VectorWriter(VectorWriter &&other)
noexcept { *
this = std::move(other); }
37 VectorWriter &operator=(
const VectorWriter &) =
delete;
38 VectorWriter &operator=(VectorWriter &&other)
noexcept {
40 vector = other.vector;
43 other.vector =
nullptr;
47 void reserve(
size_t extra) {
49 if (
size_t(end - cur) < extra) [[unlikely]] {
52 if (vector->capacity() >= off + extra) {
53 vector->resize(vector->capacity());
54 assert(cur == vector->data() + off &&
55 "in-capacity resize reallocated?");
57 vector->resize(vector->size() * 2 + extra);
59 cur = vector->data() + off;
60 end = vector->data() + vector->size();
64 void flush() noexcept {
65 if (vector && cur != end) {
66 vector->resize(size());
71 size_t size() const noexcept {
return cur - vector->data(); }
72 size_t capacity() const noexcept {
return vector->size(); }
74 u8 *data() noexcept {
return vector->data(); }
76 void skip_unchecked(
size_t size)
noexcept {
77 assert(
size_t(end - cur) >= size);
81 void skip(
size_t size)
noexcept {
86 void write_unchecked(std::span<const u8> data)
noexcept {
87 assert(
size_t(end - cur) >= data.size());
88 std::memcpy(cur, data.data(), data.size());
92 void write(std::span<const u8> data)
noexcept {
94 write_unchecked(data);
97 template <std::
integral T>
98 void write_unchecked(T t)
noexcept {
99 assert(
size_t(end - cur) >=
sizeof(T));
100 std::memcpy(cur, &t,
sizeof(T));
104 template <std::
integral T>
105 void write(T t)
noexcept {
107 write_unchecked<T>(t);
110 void write_uleb_unchecked(uint64_t value)
noexcept {
111 assert(
size_t(end - cur) >= uleb_len(value));
112 cur += uleb_write(cur, value);
115 void write_uleb(uint64_t value)
noexcept {
117 write_uleb_unchecked(value);
120 void write_sleb_unchecked(int64_t value)
noexcept {
122 assert(
size_t(end - cur) >= 10);
123 cur += sleb_write(cur, value);
126 void write_sleb(int64_t value)
noexcept {
128 write_sleb_unchecked(value);