29 if (inSize > UINT32_MAX)
30 Throw<std::runtime_error>(
"lz4 compress: invalid size");
32 auto const outCapacity = LZ4_compressBound(inSize);
36 auto compressed = bf(outCapacity);
38 auto compressedSize = LZ4_compress_default(
39 reinterpret_cast<char const*
>(
in),
40 reinterpret_cast<char*
>(compressed),
43 if (compressedSize == 0)
44 Throw<std::runtime_error>(
"lz4 compress: failed");
46 return compressedSize;
63 int const inSize =
static_cast<int>(inSizeUnchecked);
64 int const decompressedSize =
static_cast<int>(decompressedSizeUnchecked);
67 Throw<std::runtime_error>(
"lz4Decompress: integer overflow (input)");
69 if (decompressedSize <= 0)
70 Throw<std::runtime_error>(
"lz4Decompress: integer overflow (output)");
72 if (LZ4_decompress_safe(
73 reinterpret_cast<char const*
>(
in),
74 reinterpret_cast<char*
>(decompressed),
76 decompressedSize) != decompressedSize)
77 Throw<std::runtime_error>(
"lz4Decompress: failed");
79 return decompressedSize;
101 int copiedInSize = 0;
102 auto const currentBytes =
in.ByteCount();
107 while (
in.Next(
reinterpret_cast<void const**
>(&chunk), &chunkSize))
109 if (copiedInSize == 0)
111 if (chunkSize >= inSize)
113 copiedInSize = inSize;
116 compressed.
resize(inSize);
119 chunkSize = chunkSize < (inSize - copiedInSize)
121 : (inSize - copiedInSize);
123 std::copy(chunk, chunk + chunkSize, compressed.
data() + copiedInSize);
125 copiedInSize += chunkSize;
127 if (copiedInSize == inSize)
129 chunk = compressed.
data();
135 if (
in.ByteCount() > (currentBytes + copiedInSize))
136 in.BackUp(
in.ByteCount() - currentBytes - copiedInSize);
138 if ((copiedInSize == 0 && chunkSize < inSize) ||
139 (copiedInSize > 0 && copiedInSize != inSize))
140 Throw<std::runtime_error>(
"lz4 decompress: insufficient input size");
142 return lz4Decompress(chunk, inSize, decompressed, decompressedSize);