mirror of
https://github.com/MihailRis/voxelcore.git
synced 2026-10-05 02:51:49 +00:00
reduce allocations while reading chunks data
This commit is contained in:
parent
21f7390265
commit
9dc9441902
12 changed files with 93 additions and 43 deletions
|
|
@ -85,12 +85,12 @@ std::unique_ptr<ubyte[]> compression::decompress(
|
|||
throw std::invalid_argument("compression method is NONE");
|
||||
case Method::EXTRLE8: {
|
||||
auto decompressed = std::make_unique<ubyte[]>(dstlen);
|
||||
extrle::decode(src, srclen, decompressed.get());
|
||||
extrle::decode(src, srclen, decompressed.get(), dstlen);
|
||||
return decompressed;
|
||||
}
|
||||
case Method::EXTRLE16: {
|
||||
auto decompressed = std::make_unique<ubyte[]>(dstlen);
|
||||
size_t decoded = extrle::decode16(src, srclen, decompressed.get());
|
||||
size_t decoded = extrle::decode16(src, srclen, decompressed.get(), dstlen);
|
||||
if (decoded != dstlen) {
|
||||
throw std::runtime_error(
|
||||
"expected decompressed size " + std::to_string(dstlen) +
|
||||
|
|
@ -110,6 +110,39 @@ std::unique_ptr<ubyte[]> compression::decompress(
|
|||
return decompressed;
|
||||
}
|
||||
default:
|
||||
throw std::runtime_error("not implemented");
|
||||
throw std::runtime_error("method not implemented");
|
||||
}
|
||||
}
|
||||
|
||||
void compression::decompress(const util::span<ubyte> src, ubyte* dst, size_t dstlen, Method method) {
|
||||
switch (method) {
|
||||
case Method::NONE:
|
||||
throw std::invalid_argument("compression method is NONE");
|
||||
case Method::EXTRLE8:
|
||||
extrle::decode(src.data(), src.size(), dst, dstlen);
|
||||
break;
|
||||
case Method::EXTRLE16: {
|
||||
size_t decoded =
|
||||
extrle::decode16(src.data(), src.size(), dst, dstlen);
|
||||
if (decoded != dstlen) {
|
||||
throw std::runtime_error(
|
||||
"expected decompressed size " + std::to_string(dstlen) +
|
||||
" got " + std::to_string(decoded)
|
||||
);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Method::GZIP: {
|
||||
auto buffer = gzip::decompress(src.data(), src.size());
|
||||
if (buffer.size() != dstlen) {
|
||||
throw std::runtime_error(
|
||||
"expected decompressed size " + std::to_string(dstlen) +
|
||||
" got " + std::to_string(buffer.size())
|
||||
);
|
||||
}
|
||||
std::memcpy(dst, buffer.data(), buffer.size());
|
||||
}
|
||||
default:
|
||||
throw std::runtime_error("method not implemented");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue