1#ifndef BYTEME_ZLIB_BUFFER_WRITER_HPP
2#define BYTEME_ZLIB_BUFFER_WRITER_HPP
61 strm.next_in = Z_NULL;
66 case ZlibCompressionMode::DEFLATE:
69 case ZlibCompressionMode::ZLIB:
72 case ZlibCompressionMode::GZIP:
76 throw std::runtime_error(
"unknown Zlib compression mode");
79 int ret = deflateInit2(&strm, level, Z_DEFLATED, windowBits, 8, Z_DEFAULT_STRATEGY);
81 throw std::runtime_error(
"failed to initialize Zlib buffer compression");
92 ZStream(
const ZStream&) =
delete;
93 ZStream(ZStream&&) =
delete;
94 ZStream& operator=(
const ZStream&) =
delete;
95 ZStream& operator=(ZStream&&) =
delete;
104 typedef I<
decltype(I<
decltype(ZStream::strm)>::avail_out)> ZoutSize;
111 my_zstr(options.mode, options.compression_level),
113 my_holding(
sanisizer::cap<I<decltype(my_holding.size())> >(
sanisizer::cap<ZoutSize>(options.buffer_size)))
124 void write(
const unsigned char* buffer, std::size_t n) {
125 typedef I<
decltype(I<
decltype(ZStream::strm)>::avail_in)> Size;
126 safe_write<Size, false>(
129 [&](
const unsigned char* buffer0, Size n0) ->
void {
130 my_zstr.strm.next_in =
const_cast<unsigned char*
>(buffer0);
131 my_zstr.strm.avail_in = n0;
138 my_zstr.strm.next_in =
nullptr;
139 my_zstr.strm.avail_in = 0;
145 std::vector<unsigned char> my_holding;
147 void dump(
int flag) {
149 my_zstr.strm.avail_out = my_holding.size();
150 my_zstr.strm.next_out = my_holding.data();
151 deflate(&(my_zstr.strm), flag);
152 std::size_t compressed = my_holding.size() - my_zstr.strm.avail_out;
153 output.insert(output.end(), my_holding.begin(), my_holding.begin() + compressed);
154 }
while (my_zstr.strm.avail_out == 0);
162 std::vector<unsigned char> output;
Virtual class for writing bytes to a sink.
Definition Writer.hpp:21
virtual void write(const unsigned char *buffer, std::size_t n)=0
Compress and write bytes to a Zlib-compressed buffer.
Definition ZlibBufferWriter.hpp:50
ZlibBufferWriter(const ZlibBufferWriterOptions &options)
Definition ZlibBufferWriter.hpp:110
void finish()
Definition ZlibBufferWriter.hpp:137
void write(const unsigned char *buffer, std::size_t n)
Definition ZlibBufferWriter.hpp:124
std::vector< unsigned char > & get_output()
Definition ZlibBufferWriter.hpp:171
Magic numbers for various compression algorithms.
Simple byte readers and writers.
Definition BufferedReader.hpp:21
ZlibCompressionMode
Definition magic_numbers.hpp:66
constexpr Dest_ cap(Value_ x)
Options for the ZlibBufferWriter constructor.
Definition ZlibBufferWriter.hpp:26
int compression_level
Definition ZlibBufferWriter.hpp:36
ZlibCompressionMode mode
Definition ZlibBufferWriter.hpp:30
std::size_t buffer_size
Definition ZlibBufferWriter.hpp:42