3#include <BufferStream.h>
10 std::vector<std::byte> compressedData(
sizeof(uint32_t) + data.size() * 2);
12 lzma_options_lzma options{};
13 if (lzma_lzma_preset(&options, std::clamp<uint8_t>(compressLevel, 0, 9))) {
17 lzma_stream stream = LZMA_STREAM_INIT;
19 if (lzma_alone_encoder(&stream, &options) != LZMA_OK) {
24 stream.next_in =
reinterpret_cast<const uint8_t*
>(data.data());
25 stream.avail_in = data.size();
26 stream.next_out =
reinterpret_cast<uint8_t*
>(compressedData.data() +
sizeof(uint32_t));
27 stream.avail_out = compressedData.size() -
sizeof(uint32_t);
29 lzma_ret ret = lzma_code(&stream, LZMA_FINISH);
31 if (ret != LZMA_STREAM_END) {
36 BufferStream compressedStream{compressedData};
38 const auto properties = compressedStream.read<uint8_t>();
39 const auto dictionarySize = compressedStream.read<uint32_t>();
41 .seek_u(
sizeof(uint32_t))
42 .write<uint32_t>(data.size())
43 .write(compressedData.size() - (
sizeof(uint32_t) * 3) + (
sizeof(uint8_t) * 5))
45 .write(dictionarySize);
47 compressedData.resize(stream.total_out +
sizeof(uint32_t));
48 return compressedData;
52 if (data.size() < 18) {
57 std::vector<std::byte> compressedData{data.begin() +
sizeof(uint32_t), data.end()};
58 std::vector<std::byte> uncompressedData;
61 BufferStreamReadOnly in{data.data(), data.size()};
65 const uint64_t uncompressedLength = in.read<uint32_t>();
67 const auto properties = in.read<uint8_t>();
68 const auto dictionarySize = in.read<uint32_t>();
69 BufferStream out{compressedData.data(), compressedData.size()};
72 .write(dictionarySize)
73 .write(uncompressedLength);
75 uncompressedData.resize(uncompressedLength);
78 lzma_stream stream = LZMA_STREAM_INIT;
79 stream.next_in =
reinterpret_cast<const uint8_t*
>(compressedData.data());
80 stream.avail_in = compressedData.size();
81 stream.next_out =
reinterpret_cast<uint8_t*
>(uncompressedData.data());
82 stream.avail_out = uncompressedData.size();
84 if (lzma_alone_decoder(&stream, UINT64_MAX) != LZMA_OK) {
89 const auto ret = lzma_code(&stream, LZMA_RUN);
90 if (ret == LZMA_STREAM_END || stream.avail_out == 0) {
98 if (
const auto ret = lzma_code(&stream, LZMA_FINISH); ret != LZMA_OK && ret != LZMA_STREAM_END) {
104 return uncompressedData;
std::optional< std::vector< std::byte > > compressValveLZMA(std::span< const std::byte > data, uint8_t compressLevel=6)
constexpr auto VALVE_LZMA_SIGNATURE
std::optional< std::vector< std::byte > > decompressValveLZMA(std::span< const std::byte > data)