12 , finish(buf.data() + lastSize)
27 lastSize -= lastSize >> 7;
33 uint8_t* newEnd = end + LEN;
34 if (newEnd <= finish) [[likely]] {
35 memcpy(end, data, LEN);
38 insertGrow(data, LEN);
42template void OutputBuffer::insertN<1>(
const void* __restrict data);
43template void OutputBuffer::insertN<2>(
const void* __restrict data);
44template void OutputBuffer::insertN<4>(
const void* __restrict data);
45template void OutputBuffer::insertN<8>(
const void* __restrict data);
50 uint8_t* newEnd = end + len;
51 if (newEnd <= finish) [[likely]] {
52 memcpy(end, data, len);
55 insertGrow(data, len);
66 end = finish =
nullptr;
67 return std::move(buf);
70void OutputBuffer::grow(
size_t len)
72 size_t oldSize = end - buf.
data();
73 size_t newSize =
std::max(oldSize + len, oldSize + oldSize / 2);
75 end = buf.
data() + oldSize;
76 finish = buf.
data() + newSize;
79uint8_t* OutputBuffer::allocateGrow(
size_t len)
87void OutputBuffer::insertGrow(
const void* __restrict data,
size_t len)
89 uint8_t* pos = allocateGrow(len);
90 memcpy(pos, data, len);
void resize(size_t size)
Grow or shrink the memory block.
const T * data() const
Returns pointer to the start of the memory buffer.
void insertN(const void *data, size_t len)
OutputBuffer()
Create an empty output buffer.
MemBuffer< uint8_t > release(size_t &size)
Release ownership of the buffer.
constexpr vecN< N, T > max(const vecN< N, T > &x, const vecN< N, T > &y)
This file implemented 3 utility functions:
size_t size(std::string_view utf8)
constexpr auto end(const zstring_view &x)