nlib
ReallocOutputStream.h
[詳解]
1 
2 #pragma once
3 #ifndef INCLUDE_NN_NLIB_REALLOCOUTPUTSTREAM_H_
4 #define INCLUDE_NN_NLIB_REALLOCOUTPUTSTREAM_H_
5 
6 #include <stdlib.h>
7 
8 #include "nn/nlib/UniquePtr.h"
9 #include "nn/nlib/OutputStream.h"
10 
11 NLIB_NAMESPACE_BEGIN
12 
14  public:
15  class NLIB_VIS_PUBLIC ReallocDeleter {
16  public:
17  typedef void* (*ReallocFunc)(void* ptr, size_t n);
18  ReallocDeleter() NLIB_NOEXCEPT : realloc_(::nlib_realloc) {}
19  explicit ReallocDeleter(ReallocFunc reallocfunc) NLIB_NOEXCEPT : realloc_(reallocfunc) {}
20  void operator()(void* p) const NLIB_NOEXCEPT;
21  ReallocFunc GetFunc() const NLIB_NOEXCEPT { return realloc_; }
22 
23  private:
24  ReallocFunc realloc_;
25  };
26  NLIB_STATIC_ASSERT(!IsEmpty<ReallocDeleter>::value);
29  typedef void* (*ReallocFunc)(void* ptr, size_t n);
30 
32  : data_(NULL), realloc_func_(nlib_realloc), capacity_(0) {}
33  explicit ReallocOutputStream(ReallocFunc func) NLIB_NOEXCEPT NLIB_NONNULL
34  : data_(NULL), realloc_func_(func), capacity_(0) {}
36 
37  uint8_t* Data() NLIB_NOEXCEPT { return data_; }
38  const uint8_t* Data() const NLIB_NOEXCEPT { return data_; }
39 
40  bool Reserve(size_t n) NLIB_NOEXCEPT { return this->Expand(n) == 0; }
42  if (this->ExpandOrShrink(this->Pos()) == 0) {
43  this->ResetBuffer(data_ + capacity_, 0);
44  }
45  }
46 
47  size_t Release(UniquePtrType* ptr) NLIB_NOEXCEPT;
48  // UniquePtrType Reelase(size_t* n);
49 
50  // Appends '\0' and, returns the memory after ShrinkToFit().
51  bool ReleaseAsCstring(CharPtrType* ptr) NLIB_NOEXCEPT;
52 
53  private:
54  errno_t Expand(size_t newcap) NLIB_NOEXCEPT {
55  return (newcap > capacity_) ? this->ExpandOrShrink(newcap) : 0;
56  }
57  errno_t ExpandOrShrink(size_t newcap) NLIB_NOEXCEPT;
58  virtual bool PushBuffer_(const void* p, size_t nbytes,
59  bool do_flush) NLIB_NOEXCEPT NLIB_OVERRIDE;
60  virtual bool Close_() NLIB_NOEXCEPT NLIB_OVERRIDE;
61  virtual void* GetWorkBuffer_(size_t* nbytes) NLIB_NOEXCEPT NLIB_OVERRIDE;
62 
63  private:
64  uint8_t* data_;
65  ReallocFunc realloc_func_;
66  size_t capacity_;
68 };
69 
70 NLIB_NAMESPACE_END
71 
72 #endif // INCLUDE_NN_NLIB_REALLOCOUTPUTSTREAM_H_
#define NLIB_OVERRIDE
利用可能であればoverrideが定義されます。そうでない場合は空文字列です。
Definition: Config.h:210
ReallocOutputStream() noexcept
デフォルトコンストラクタです。nlib_realloc()でメモリの拡張を行うように設定します。 ...
UniquePtr< char[], ReallocDeleter > CharPtrType
charの配列へのUniquePtrをtypedefしたものです。
#define NLIB_DISALLOW_COPY_AND_ASSIGN(TypeName)
TypeName で指定されたクラスのコピーコンストラクタと代入演算子を禁止します。
Definition: Config.h:145
nlib_realloc()等のrealloc関数を利用して拡張するメモリ領域に書きこむ出力ストリームです。 ...
UniquePtrはポインタの所有権を保持し、UniquePtrがスコープから出るときにデストラクタでポインタをDELで指...
Definition: UniquePtr.h:96
std::unique_ptrに相当するクラスが定義されています。
void ShrinkToFit() noexcept
バッファ・サイズを現在の書き込み位置にフィットさせます。
#define NLIB_VIS_PUBLIC
関数やクラス等のシンボルをライブラリの外部に公開します。
Definition: Platform_unix.h:61
UniquePtr< uint8_t[], ReallocDeleter > UniquePtrType
uint8_tの配列へのUniquePtrをtypedefしたものです。
#define NLIB_NOEXCEPT
環境に合わせてnoexcept 又は同等の定義がされます。
Definition: Config.h:86
uint8_t * Data() noexcept
書込み中のデータの先頭へのポインタを取得します。
NLIB_CHECK_RESULT void * nlib_realloc(void *ptr, size_t size)
C標準関数のrealloc()を呼び出すweak関数です。nlibはこの関数を経由してrealloc()を呼び出します。 ...
ReallocOutputStream(ReallocFunc func) noexcept
realloc関数を指定してオブジェクトを構築します。
#define NLIB_FINAL
利用可能であればfinalが定義されます。そうでない場合は空文字列です。
Definition: Config.h:211
#define NLIB_STATIC_ASSERT(exp)
静的アサートが定義されます。利用可能であればstatic_assertを利用します。
Definition: Config.h:136
bool Reserve(size_t n) noexcept
サイズを指定して書き込み先バッファを確保します。
出力ストリームの基底クラスを定義しています。
#define NLIB_NONNULL
全ての引数にNULLを指定することができないことを示します。
Definition: Platform_unix.h:76
出力ストリームの基底クラスです。このクラスを実体化することはできません。
Definition: OutputStream.h:17
int errno_t
intのtypedefで、戻り値としてPOSIXのエラー値を返すことを示します。
Definition: NMalloc.h:24