25 #ifndef DOZERG_COMPRESSOR_LZO_H_20080221 26 #define DOZERG_COMPRESSOR_LZO_H_20080221 32 #include "minilzo/minilzo.c" 33 #include "tools/net.hh" 44 typedef ::lzo_uint __Uint;
45 typedef uint64_t __Len;
60 bool compress(
const std::vector<char> & input, std::vector<char> & output)
const{
61 return compressTemplate(input, output);
63 bool compress(
const std::vector<signed char> & input, std::vector<signed char> & output)
const{
64 return compressTemplate(input, output);
66 bool compress(
const std::vector<unsigned char> & input, std::vector<unsigned char> & output)
const{
67 return compressTemplate(input, output);
69 bool compress(
const std::string & input, std::string & output)
const{
70 return compressTemplate(input, output);
82 bool decompress(
const std::vector<char> & input, std::vector<char> & output)
const{
83 return decompressTemplate(input,output);
85 bool decompress(
const std::vector<signed char> & input, std::vector<signed char> & output)
const{
86 return decompressTemplate(input, output);
88 bool decompress(
const std::vector<unsigned char> & input, std::vector<unsigned char> & output)
const{
89 return decompressTemplate(input, output);
91 bool decompress(
const std::string & input, std::string & output)
const{
92 return decompressTemplate(input, output);
97 static const bool ok = (LZO_E_OK == ::lzo_init());
100 template<
class Buffer>
101 bool compressTemplate(
const Buffer & input, Buffer & output)
const{
104 __Uint out_len = __Uint(outLength(input.size()));
105 output.resize(
sizeof(__Len) +
size_t(out_len));
106 const __Uint in_len = __Uint(input.size());
107 if(workmem_.size() < LZO1X_1_MEM_COMPRESS)
108 workmem_.resize(LZO1X_1_MEM_COMPRESS);
109 if(LZO_E_OK != ::lzo1x_1_compress(
110 reinterpret_cast<const unsigned char *>(&input[0]),
112 reinterpret_cast<unsigned char *>(&output[
sizeof(__Len)]),
116 output.resize(
sizeof(__Len) + out_len);
117 const __Len lsz = tools::Hton(__Len(in_len));
118 memcpy(&output[0], &lsz,
sizeof lsz);
121 template<
class Buffer>
122 bool decompressTemplate(
const Buffer & input, Buffer & output)
const{
123 if(input.size() <
sizeof(__Len))
125 __Uint out_len = __Uint(tools::Ntoh(*reinterpret_cast<const __Len *>(&input[0])));
126 output.resize(out_len);
127 if(LZO_E_OK != ::lzo1x_decompress(
128 reinterpret_cast<const unsigned char *>(&input[
sizeof(__Len)]),
129 __Uint(input.size() -
sizeof(__Len)),
130 reinterpret_cast<unsigned char *
>(&output[0]),
134 output.resize(out_len);
138 size_t outLength(
size_t inLen)
const{
139 return inLen + (inLen >> 4) + 67;
142 CCompressorLzo & operator =(
const CCompressorLzo &);
144 mutable std::vector<unsigned char> workmem_;
A convenient interface for miniLZO compression algorithm.
Definition: compress_lzo.hh:42
CCompressorLzo()
Default constructor.
Definition: compress_lzo.hh:50