24 #ifndef STATICLIB_COMPRESS_LZMA_SOURCE_HPP
25 #define STATICLIB_COMPRESS_LZMA_SOURCE_HPP
32 #include <type_traits>
36 #include "staticlib/config.hpp"
37 #include "staticlib/io.hpp"
48 template <
typename Source, std::
size_t buf_size = 4096 >
57 std::array<char, buf_size> buf;
73 bool exhausted =
false;
85 lzma_stream* stream =
static_cast<lzma_stream*
> (std::malloc(
sizeof(lzma_stream)));
87 "Error creating lzma stream: 'malloc' failed"));
88 *stream = LZMA_STREAM_INIT;
89 auto err = lzma_stream_decoder(stream, UINT64_MAX, 0);
91 "Error initializing LZMA stream, code: [" + sl::support::to_string(err) +
"]"));
96 if (
nullptr == strm)
return;
122 src(std::move(other.src)),
123 buf(std::move(other.buf)),
127 exhausted(other.exhausted) {
128 other.strm =
nullptr;
138 src = std::move(other.src);
139 buf = std::move(other.buf);
141 other.strm =
nullptr;
144 exhausted = other.exhausted;
154 std::streamsize
read(sl::io::span<char> span) {
158 avail = sl::io::read_all(src, {buf.data(), buf.size()});
162 strm->next_in =
reinterpret_cast<uint8_t*
> (buf.data() + pos);
163 strm->avail_in = avail;
164 strm->next_out =
reinterpret_cast<uint8_t*
> (span.data());
165 strm->avail_out =
static_cast<size_t> (span.size());
167 auto err = ::lzma_code(strm, LZMA_RUN);
168 if (LZMA_OK == err || LZMA_STREAM_END == err) {
169 std::streamsize
read = avail - strm->avail_in;
170 std::streamsize written = span.size_signed() - strm->avail_out;
171 size_t uread =
static_cast<size_t> (
read);
174 if (written > 0 || LZMA_STREAM_END != err) {
178 return std::char_traits<char>::eof();
180 +
"LZMA error, code: [" + sl::support::to_string(err) +
"]"));
182 return std::char_traits<char>::eof();
204 template <
typename Source,
205 class =
typename std::enable_if<!std::is_lvalue_reference<Source>::value>::type>
217 template <
typename Source>
220 sl::io::make_reference_source(source));