zstd_sinksource.h
1 // Copyright 2017, Beeri 15. All rights reserved.
2 // Author: Roman Gershman (romange@gmail.com)
3 //
4 #pragma once
5 
6 #include <memory>
7 #include "util/sinksource.h"
8 
9 namespace util {
10 
11 class ZStdSink : public Sink {
12  public:
13  // Takes ownership over upstream.
14  ZStdSink(Sink* upstream);
15  ~ZStdSink();
16 
17  Status Init(int level);
18  Status Append(const strings::ByteRange& slice) override;
19  Status Flush() override;
20  static size_t CompressBound(size_t src_size);
21 
22  private:
23  size_t buf_sz_;
24  std::unique_ptr<uint8_t[]> buf_;
25  std::unique_ptr<Sink> upstream_;
26  void* zstd_handle_;
27 };
28 
29 class ZStdSource : public Source {
30  public:
31  explicit ZStdSource(Source* upstream);
32  ~ZStdSource();
33  static bool HasValidHeader(Source* upstream);
34 
35  private:
36  StatusObject<size_t> ReadInternal(const strings::MutableByteRange& range) override;
37 
38  std::unique_ptr<Source> sub_stream_;
39  void* zstd_handle_;
40  std::unique_ptr<uint8_t[]> buf_;
41  strings::MutableByteRange buf_range_;
42 };
43 
44 
45 } // namespace util