| 12 | CompressionStream::~CompressionStream() { ZSTD_freeCStream(m_cStream); } |
| 13 | |
| 14 | void CompressionStream::compress(const char* in, size_t inLen, ByteArray& out) { |
| 15 | size_t const cOutSize = ZSTD_CStreamOutSize(); |
| 16 | ZSTD_inBuffer inBuffer = {in, inLen, 0}; |
| 17 | size_t written = out.size(); |
| 18 | out.resize(out.size() + cOutSize); |
| 19 | bool finished = false; |
| 20 | do { |
| 21 | ZSTD_outBuffer outBuffer = {out.ptr() + written, min(cOutSize, out.size() - written), 0}; |
| 22 | size_t ret = ZSTD_compressStream2(m_cStream, &outBuffer, &inBuffer, ZSTD_e_flush); |
| 23 | if (ZSTD_isError(ret)) { |
| 24 | throw IOException(strf("ZSTD compression error {}", ZSTD_getErrorName(ret))); |
| 25 | break; |
| 26 | } |
| 27 | |
| 28 | written += outBuffer.pos; |
| 29 | if (outBuffer.pos == outBuffer.size) { |
| 30 | if (written >= out.size()) |
| 31 | out.resize(out.size() * 2); |
| 32 | continue; |
| 33 | } |
| 34 | |
| 35 | finished = ret == 0 && inBuffer.pos == inBuffer.size; |
| 36 | } while (!finished); |
| 37 | out.resize(written); |
| 38 | } |
| 39 | |
| 40 | void CompressionStream::compress(ByteArray const& in, ByteArray& out) { |
| 41 | return compress(in.ptr(), in.size(), out); |