mirror of
https://github.com/minetest/minetestmapper.git
synced 2025-07-05 10:00:20 +02:00
Reuse allocations for decompression
This commit is contained in:
@ -21,18 +21,13 @@ void ZstdDecompressor::setData(const u8 *data, size_t size, size_t seekPos)
|
||||
m_size = size;
|
||||
}
|
||||
|
||||
std::size_t ZstdDecompressor::seekPos() const
|
||||
{
|
||||
return m_seekPos;
|
||||
}
|
||||
|
||||
ustring ZstdDecompressor::decompress()
|
||||
void ZstdDecompressor::decompress(ustring &buffer)
|
||||
{
|
||||
ZSTD_DStream *stream = reinterpret_cast<ZSTD_DStream*>(m_stream);
|
||||
ZSTD_inBuffer inbuf = { m_data, m_size, m_seekPos };
|
||||
|
||||
ustring buffer;
|
||||
constexpr size_t BUFSIZE = 32 * 1024;
|
||||
// output space is extended in chunks of this size
|
||||
constexpr size_t BUFSIZE = 8 * 1024;
|
||||
|
||||
buffer.resize(BUFSIZE);
|
||||
ZSTD_outBuffer outbuf = { &buffer[0], buffer.size(), 0 };
|
||||
@ -42,17 +37,15 @@ ustring ZstdDecompressor::decompress()
|
||||
size_t ret;
|
||||
do {
|
||||
ret = ZSTD_decompressStream(stream, &outbuf, &inbuf);
|
||||
if (ret && ZSTD_isError(ret))
|
||||
throw DecompressError();
|
||||
if (outbuf.size == outbuf.pos) {
|
||||
outbuf.size += BUFSIZE;
|
||||
buffer.resize(outbuf.size);
|
||||
outbuf.dst = &buffer[0];
|
||||
}
|
||||
if (ret && ZSTD_isError(ret))
|
||||
throw DecompressError();
|
||||
} while (ret != 0);
|
||||
|
||||
m_seekPos = inbuf.pos;
|
||||
buffer.resize(outbuf.pos);
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
Reference in New Issue
Block a user