virthttp  0.0
libvirt http interface
libdeflate.hpp
Go to the documentation of this file.
1 #pragma once
2 #include <memory>
3 #include <string>
4 #include <libdeflate.h>
5 
6 namespace libdeflate {
7 
8 constexpr auto compression_level = 11;
9 
10 enum class Mode { raw_deflate, zlib, gzip };
11 
12 bool compress(std::string& body, Mode mode) noexcept {
13  std::unique_ptr<struct libdeflate_compressor, void (*)(struct libdeflate_compressor*)> c = {libdeflate_alloc_compressor(compression_level),
14  &libdeflate_free_compressor};
15  if (!c)
16  return false;
17 
18  std::string out;
19  out.resize(body.size());
20 
21  const auto actual_compressed_size = [&]() {
22  switch (mode) {
23  case Mode::raw_deflate:
24  return libdeflate_deflate_compress(c.get(), body.data(), body.size(), out.data(),
25  libdeflate_deflate_compress_bound(c.get(), body.size()));
26  case Mode::zlib:
27  return libdeflate_zlib_compress(c.get(), body.data(), body.size(), out.data(), libdeflate_zlib_compress_bound(c.get(), body.size()));
28  case Mode::gzip:
29  return libdeflate_gzip_compress(c.get(), body.data(), body.size(), out.data(), libdeflate_gzip_compress_bound(c.get(), body.size()));
30  }
32  }();
33  if (actual_compressed_size == 0)
34  return false;
35 
36  out.resize(actual_compressed_size);
37  body = std::move(out);
38  return true;
39 }
40 
41 }
#define UNREACHABLE
Definition: utility.hpp:19
constexpr auto compression_level
Definition: libdeflate.hpp:8
Mode
Definition: libdeflate.hpp:10
Definition: libdeflate.hpp:6
bool compress(std::string &body, Mode mode) noexcept
Definition: libdeflate.hpp:12