nlib
Lz4OutputStream.h
[詳解]
1 
2 #pragma once
3 #ifndef INCLUDE_NN_NLIB_OSS_LZ4INPUTSTREAM_H_
4 #define INCLUDE_NN_NLIB_OSS_LZ4INPUTSTREAM_H_
5 
6 #include "nn/nlib/Config.h"
7 #include "nn/nlib/OutputStream.h"
9 
10 #include "lz4frame.h"
11 
12 #if defined(_MSC_VER) && defined(nx_oss_lz4_EXPORTS)
13 #undef NLIB_VIS_PUBLIC
14 #define NLIB_VIS_PUBLIC NLIB_WINEXPORT
15 #endif
16 
17 NLIB_NAMESPACE_BEGIN
18 namespace oss {
19 
20 class Lz4OutputStreamSettings;
21 
22 namespace detail {
23 
24 class NLIB_VIS_PUBLIC Lz4OutputTransform NLIB_FINAL : public OutputTransform {
25  public:
26  Lz4OutputTransform() NLIB_NOEXCEPT;
27  virtual ~Lz4OutputTransform() NLIB_NOEXCEPT NLIB_OVERRIDE;
28  virtual errno_t Transform(OutputStream* os, const void* p, size_t nBytes,
29  bool doFlush) NLIB_NOEXCEPT NLIB_OVERRIDE;
30  virtual void* GetWorkBuffer(size_t* n) NLIB_NOEXCEPT NLIB_OVERRIDE;
31  virtual errno_t OnSetStream(OutputStream* os) NLIB_NOEXCEPT NLIB_OVERRIDE;
32  virtual errno_t OnClose(OutputStream* os) NLIB_NOEXCEPT NLIB_OVERRIDE;
33 
34  errno_t Init(const Lz4OutputStreamSettings& settings) NLIB_NOEXCEPT;
35 
36  private:
37  LZ4F_compressionContext_t m_Ctx;
38  unsigned char* m_BufOut;
39  size_t m_BufOutSize;
40  size_t m_BlockSize;
41  size_t m_HeaderSize;
42  unsigned char m_Header[16]; // LZ4F_MAXHEADERFRAME_SIZE <= sizeof(m_Header)
43  unsigned char m_BaseBuf[256];
44  NLIB_DISALLOW_COPY_AND_ASSIGN(Lz4OutputTransform);
45 };
46 
47 } // namespace detail
48 
50  public:
51  Lz4OutputStreamSettings() NLIB_NOEXCEPT {
52  nlib_memset(&m_Pref, 0, sizeof(m_Pref));
53  m_Pref.autoFlush = 1;
54  m_Pref.frameInfo.blockMode = LZ4F_blockLinked;
55  m_Pref.compressionLevel = 9; // hc
56  }
57  ~Lz4OutputStreamSettings() NLIB_NOEXCEPT {}
58  void SetContentSize(uint64_t size) NLIB_NOEXCEPT {
59  m_Pref.frameInfo.contentSize = size;
60  }
61  uint64_t GetContentSize() const NLIB_NOEXCEPT {
62  return m_Pref.frameInfo.contentSize;
63  }
64  void SetCompressionLevel(int level) NLIB_NOEXCEPT {
65  if (level < 0)
66  level = 0;
67  else if (level > 16)
68  level = 16;
69  m_Pref.compressionLevel = level;
70  }
71  int GetCompressionLevel() NLIB_NOEXCEPT {
72  return m_Pref.compressionLevel;
73  }
74  void SetMaxBlockSize(LZ4F_blockSizeID_t max_block_size) NLIB_NOEXCEPT {
75  m_Pref.frameInfo.blockSizeID = max_block_size;
76  }
77  LZ4F_blockSizeID_t GetMaxBlockSize() const NLIB_NOEXCEPT {
78  return m_Pref.frameInfo.blockSizeID;
79  }
80  void SetBlockIndependence(bool independence) NLIB_NOEXCEPT {
81  m_Pref.frameInfo.blockMode = independence ? LZ4F_blockIndependent : LZ4F_blockLinked;
82  }
83  bool GetBlockIndependence() const NLIB_NOEXCEPT {
84  return (m_Pref.frameInfo.blockMode != LZ4F_blockLinked);
85  }
86 
87  private:
88  LZ4F_preferences_t m_Pref;
89  friend class detail::Lz4OutputTransform;
90 };
91 
93  : public OutputConverterStreamTempl<detail::Lz4OutputTransform> {
94  public:
98  Lz4OutputStreamSettings settings;
99  return this->Init(settings);
100  }
102  return m_Transform.Init(settings);
103  }
104 
105  private:
107 };
108 
109 } // namespace oss
110 NLIB_NAMESPACE_END
111 
112 #if defined(_MSC_VER) && defined(nx_oss_lz4_EXPORTS)
113 #undef NLIB_VIS_PUBLIC
114 #define NLIB_VIS_PUBLIC NLIB_WINIMPORT
115 #endif
116 
117 #endif // INCLUDE_NN_NLIB_OSS_LZ4INPUTSTREAM_H_
bool GetBlockIndependence() const noexcept
SetBlockIndependence()で設定された値を取得します。デフォルトはfalseです。
#define NLIB_NOEXCEPT
環境に合わせてnoexcept 又は同等の定義がされます。
Definition: Platform.h:2151
Lz4OutputStreamSettings() noexcept
デフォルトコンストラクタです。
#define NLIB_FINAL
利用可能であればfinalが定義されます。そうでない場合は空文字列です。
#define NLIB_DISALLOW_COPY_AND_ASSIGN(TypeName)
TypeName で指定されたクラスのコピーコンストラクタと代入演算子を禁止します。
Definition: Config.h:126
#define NLIB_OVERRIDE
利用可能であればoverrideが定義されます。そうでない場合は空文字列です。
~Lz4OutputStreamSettings() noexcept
デストラクタです。
LZ4F_blockSizeID_t GetMaxBlockSize() const noexcept
SetMaxBlockSize()で設定された値を取得します。デフォルトはLZ4F_defaultです。
void SetMaxBlockSize(LZ4F_blockSizeID_t max_block_size) noexcept
データブロックの最大サイズを設定します。大きいほど高速ですがメモリを必要とします。 ...
void SetContentSize(uint64_t size) noexcept
圧縮前のデータサイズをLZ4で圧縮されたデータに含めることができます。
OutputTransformの派生クラスを保持するためのクラスです。
errno_t Init(const Lz4OutputStreamSettings &settings) noexcept
ストリームを初期化します。
Lz4OutputStreamの設定情報の取得と設定を行うクラスです。
errno_t Init() noexcept
ストリームをデフォルトの設定で初期化します。
errno_t nlib_memset(void *buf, int ch, size_t n)
内部でmemset(buf, ch, n)相当の関数を呼び出します。
Definition: Platform.h:2117
uint64_t GetContentSize() const noexcept
SetContentSize()で設定された値を取得します。デフォルトは0です。
開発環境別の設定が書かれるファイルです。
void SetBlockIndependence(bool independence) noexcept
圧縮されたデータブロックが独立して解凍可能かどうかを設定します。
LZ4のフレームフォーマットに従ったデータを書きこむためのストリームクラスです。
#define NLIB_VIS_PUBLIC
関数やクラス等のシンボルをライブラリの外部に公開します。
Definition: Platform_unix.h:51
出力ストリームの基底クラスを定義しています。
int GetCompressionLevel() noexcept
SetCompressionLevel()で設定された値を取得します。デフォルトは9です。
void SetCompressionLevel(int level) noexcept
圧縮レベルを設定します。0-16の整数で数値が大きいほど圧縮率が高くなります。
int errno_t
intのtypedefで、戻り値としてPOSIXのエラー値を返すことを示します。
Definition: NMalloc.h:24