15 #define Z_NULL nullptr
18 namespace SWC {
namespace Core {
22 const char Encoder_DEFAULT[] =
"DEFAULT";
23 const char Encoder_PLAIN[] =
"PLAIN";
24 const char Encoder_ZLIB[] =
"ZLIB";
25 const char Encoder_SNAPPY[] =
"SNAPPY";
26 const char Encoder_ZSTD[] =
"ZSTD";
27 const char Encoder_UNKNOWN[] =
"UNKNOWN";
34 return Encoder_DEFAULT;
35 case Encoder::Type::PLAIN:
37 case Encoder::Type::ZLIB:
39 case Encoder::Type::SNAPPY:
40 return Encoder_SNAPPY;
41 case Encoder::Type::ZSTD:
44 return Encoder_UNKNOWN;
51 switch(typ.length()) {
57 return Encoder::Type::PLAIN;
59 return Encoder::Type::ZLIB;
61 return Encoder::Type::SNAPPY;
63 return Encoder::Type::ZSTD;
71 return Encoder::Type::ZLIB;
73 return Encoder::Type::ZSTD;
78 return Encoder::Type::PLAIN;
83 return Encoder::Type::SNAPPY;
101 const uint8_t* src,
size_t sz_enc,
102 uint8_t *dst,
size_t sz) {
105 case Encoder::Type::ZLIB: {
107 memset(&strm, 0,
sizeof(z_stream));
113 if(::inflateInit(&strm) == Z_OK) {
114 strm.avail_in = sz_enc;
115 strm.next_in =
const_cast<Bytef*
>(src);
118 if(::inflate(&strm, Z_NO_FLUSH) != Z_STREAM_END || strm.avail_out)
127 case Encoder::Type::SNAPPY: {
128 if(!snappy::RawUncompress(
129 reinterpret_cast<const char*
>(src), sz_enc,
130 reinterpret_cast<char*
>(dst)))
135 case Encoder::Type::ZSTD: {
137 static_cast<void*
>(dst), sz,
138 static_cast<void*
>(
const_cast<uint8_t*
>(src)), sz_enc) != sz)
154 SWC_SHOULD_NOT_INLINE
155 bool encode_zlib(
const uint8_t* src,
size_t src_sz,
157 uint32_t reserve,
bool ok_more) {
159 memset(&strm, 0,
sizeof(z_stream));
163 if(::deflateInit(&strm, Z_DEFAULT_COMPRESSION) == Z_OK) {
165 uint32_t avail_out = src_sz + 6 + (((src_sz / 16000) + 1) * 5);
166 output.
ensure(reserve + avail_out);
167 output.
ptr += reserve;
169 strm.avail_out = avail_out;
170 strm.next_out = output.
ptr;
171 strm.avail_in = src_sz;
172 strm.next_in =
const_cast<Bytef*
>(src);
173 if(::deflate(&strm, Z_FINISH) == Z_STREAM_END)
174 *sz_enc = avail_out - strm.avail_out;
177 if(*sz_enc && (ok_more || *sz_enc < src_sz)) {
178 output.
ptr += *sz_enc;
184 SWC_SHOULD_NOT_INLINE
185 bool encode_snappy(
const uint8_t* src,
size_t src_sz,
187 uint32_t reserve,
bool ok_more) {
188 output.ensure(reserve + snappy::MaxCompressedLength(src_sz));
189 output.ptr += reserve;
191 reinterpret_cast<const char*
>(src), src_sz,
192 reinterpret_cast<char*
>(output.ptr), sz_enc);
193 if(*sz_enc && (ok_more || *sz_enc < src_sz)) {
194 output.ptr += *sz_enc;
200 SWC_SHOULD_NOT_INLINE
201 bool encode_zstd(
const uint8_t* src,
size_t src_sz,
203 uint32_t reserve,
bool ok_more) {
204 size_t const avail_out = ZSTD_compressBound(src_sz);
205 output.ensure(reserve + avail_out);
206 output.ptr += reserve;
208 *sz_enc = ZSTD_compress(
209 static_cast<void*
>(output.ptr), avail_out,
210 static_cast<void*
>(
const_cast<uint8_t*
>(src)), src_sz,
213 if(*sz_enc && !ZSTD_isError(*sz_enc) && (ok_more || *sz_enc < src_sz)) {
214 output.ptr += *sz_enc;
224 const uint8_t* src,
size_t src_sz,
226 uint32_t reserve,
bool no_plain_out,
bool ok_more) {
228 case Encoder::Type::ZLIB: {
229 if(encode_zlib(src, src_sz, sz_enc, output, reserve, ok_more))
233 case Encoder::Type::SNAPPY: {
234 if(encode_snappy(src, src_sz, sz_enc, output, reserve, ok_more))
238 case Encoder::Type::ZSTD: {
239 if(encode_zstd(src, src_sz, sz_enc, output, reserve, ok_more))
251 output.
ensure(reserve + src_sz);
252 output.
ptr += reserve;