17#include "zstd_streambuf.h"
19util::zstd_streambuf::zstd_streambuf(
const std::string& path)
20: file_(fopen(path.c_str(),
"rb"))
24 throw std::runtime_error(
"fopen failed");
26 dctx_ = ZSTD_createDCtx();
28 throw std::runtime_error(
"ZSTD_createDCtx failed");
30 setg(buffer_.data(), buffer_.data(), buffer_.data());
33util::zstd_streambuf::~zstd_streambuf() {
41auto util::zstd_streambuf::underflow() -> int_type {
42 size_t inSize = fread(inbuf_.data(), 1, inbuf_.size(), file_);
44 return traits_type::eof();
46 size_t outSize = ZSTD_decompressDCtx(dctx_, buffer_.data(), buffer_.size(), inbuf_.data(), inSize);
47 if(ZSTD_isError(outSize))
48 return traits_type::eof();
50 setg(buffer_.data(), buffer_.data(), buffer_.data() + outSize);
51 return traits_type::to_int_type(*gptr());