10#include "tpde/base.hpp"
11#include "tpde/util/SmallVector.hpp"
12#include "tpde/util/misc.hpp"
17 SmallVectorBase<u8> *vector =
nullptr;
22 VectorWriter() noexcept = default;
23 VectorWriter(SmallVectorBase<u8> &vector) noexcept
25 cur(vector.data() + vector.size()),
26 end(vector.data() + vector.size()) {}
27 VectorWriter(SmallVectorBase<u8> &vector,
size_t off) noexcept
29 cur(vector.data() + off),
30 end(vector.data() + vector.size()) {}
31 ~VectorWriter() { flush(); }
33 VectorWriter(
const VectorWriter &) =
delete;
34 VectorWriter(VectorWriter &&other)
noexcept { *
this = std::move(other); }
36 VectorWriter &operator=(
const VectorWriter &) =
delete;
37 VectorWriter &operator=(VectorWriter &&other)
noexcept {
39 vector = other.vector;
42 other.vector =
nullptr;
46 void reserve(
size_t extra) {
48 if (
size_t(end - cur) < extra) [[unlikely]] {
50 if (vector->capacity() < off + extra) {
52 vector->reserve(off + extra);
54 vector->resize_uninitialized(vector->capacity());
55 cur = vector->data() + off;
56 end = vector->data() + vector->size();
60 void flush() noexcept {
61 if (vector && cur != end) {
62 vector->resize(size());
67 size_t size() const noexcept {
return cur - vector->data(); }
68 size_t capacity() const noexcept {
return vector->size(); }
70 u8 *data() noexcept {
return vector->data(); }
72 void skip_unchecked(
size_t size)
noexcept {
73 assert(
size_t(end - cur) >= size);
77 void skip(
size_t size)
noexcept {
82 void unskip(
size_t n)
noexcept {
87 void zero_unchecked(
size_t n)
noexcept {
88 assert(
size_t(end - cur) >= n);
89 TPDE_NOALIAS(
this, cur);
90 std::memset(cur, 0, n);
94 void zero(
size_t n)
noexcept {
99 void write_unchecked(std::span<const u8> data)
noexcept {
100 assert(
size_t(end - cur) >= data.size());
101 TPDE_NOALIAS(
this, cur);
102 std::memcpy(cur, data.data(), data.size());
106 void write(std::span<const u8> data)
noexcept {
107 reserve(data.size());
108 write_unchecked(data);
111 template <std::
integral T>
112 void write_unchecked(T t)
noexcept {
113 assert(
size_t(end - cur) >=
sizeof(T));
114 TPDE_NOALIAS(
this, cur);
115 std::memcpy(cur, &t,
sizeof(T));
119 template <std::
integral T>
120 void write(T t)
noexcept {
122 write_unchecked<T>(t);
125 void write_uleb_unchecked(uint64_t value)
noexcept {
126 assert(
size_t(end - cur) >= uleb_len(value));
127 cur += uleb_write(cur, value);
130 void write_uleb(uint64_t value)
noexcept {
132 write_uleb_unchecked(value);
135 void write_sleb_unchecked(int64_t value)
noexcept {
137 assert(
size_t(end - cur) >= 10);
138 cur += sleb_write(cur, value);
141 void write_sleb(int64_t value)
noexcept {
143 write_sleb_unchecked(value);