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 
13 template <class T>
14 class FreeDeleter {
15  public:
16  typedef void (*FreeFunc)(void* ptr);
17  FreeDeleter() NLIB_NOEXCEPT : m_Free(& ::nlib_free) {}
18  explicit FreeDeleter(FreeFunc freefunc) NLIB_NOEXCEPT : m_Free(freefunc) {}
19  template <class U>
20  FreeDeleter(const FreeDeleter<U>& rhs) NLIB_NOEXCEPT {
21  m_Free = rhs.m_Free;
22  }
23  void operator()(T* p) const NLIB_NOEXCEPT {
24  if (p && m_Free) {
25  (*m_Free)(p);
26  }
27  }
28  FreeFunc GetFunc() const NLIB_NOEXCEPT { return m_Free; }
29 
30  private:
31  FreeFunc m_Free;
32 };
33 
34 template <class T>
35 class ReallocDeleter {
36  public:
37  typedef void* (*ReallocFunc)(void* ptr, size_t n);
38  ReallocDeleter() NLIB_NOEXCEPT : m_Realloc(::nlib_realloc) {}
39  explicit ReallocDeleter(ReallocFunc reallocfunc) NLIB_NOEXCEPT : m_Realloc(reallocfunc) {}
40  template <class U>
41  ReallocDeleter(const ReallocDeleter<U>& rhs) NLIB_NOEXCEPT {
42  m_Realloc = rhs.m_Realloc;
43  }
44  void operator()(T* p) const NLIB_NOEXCEPT {
45  if (p && m_Realloc) {
46  (*m_Realloc)(p, 0);
47  }
48  }
49  ReallocFunc GetFunc() const NLIB_NOEXCEPT { return m_Realloc; }
50 
51  private:
52  ReallocFunc m_Realloc;
53 };
54 
55 NLIB_STATIC_ASSERT(!IsEmpty<FreeDeleter<int> >::value && !IsEmpty<ReallocDeleter<int> >::value);
56 
57 #ifdef _MSC_VER
58 class ReallocOutputStream NLIB_FINAL : public OutputStream {
59 #else
61 #endif
62 
63  public:
66  typedef void* (*ReallocFunc)(void* ptr, size_t n);
67 
68  ReallocOutputStream() NLIB_NOEXCEPT : m_Data(), m_Capacity(0) {}
71 
72  uint8_t* Data() NLIB_NOEXCEPT { return m_Data.get(); }
73  const uint8_t* Data() const NLIB_NOEXCEPT { return m_Data.get(); }
74 
75  bool Reserve(size_t n) NLIB_NOEXCEPT { return this->Expand(n) == 0; }
77  if (this->ExpandOrShrink(this->Pos()) == 0) {
78  this->ResetBuffer(m_Data.get() + m_Capacity, 0);
79  }
80  }
81 
82  NLIB_VIS_PUBLIC size_t Release(UniquePtrType* ptr) NLIB_NOEXCEPT;
83  // UniquePtrType Reelase(size_t* n);
84 
85  // Appends '\0' and, returns the memory after ShrinkToFit().
86  NLIB_VIS_PUBLIC bool ReleaseAsCstring(CharPtrType* ptr) NLIB_NOEXCEPT;
87 
88  private:
89  errno_t Expand(size_t newCap) NLIB_NOEXCEPT {
90  return (newCap > m_Capacity) ? this->ExpandOrShrink(newCap) : 0;
91  }
92  NLIB_VIS_PUBLIC errno_t ExpandOrShrink(size_t newCap) NLIB_NOEXCEPT;
93  NLIB_VIS_PUBLIC virtual bool PushBuffer_(const void* p, size_t nBytes,
94  bool doFlush) NLIB_NOEXCEPT NLIB_OVERRIDE;
95  NLIB_VIS_PUBLIC virtual bool Close_() NLIB_NOEXCEPT NLIB_OVERRIDE;
96  NLIB_VIS_PUBLIC virtual void* GetWorkBuffer_(size_t* nBytes) NLIB_NOEXCEPT NLIB_OVERRIDE;
97 
98  private:
99  UniquePtrType m_Data;
100  size_t m_Capacity;
101  NLIB_DISALLOW_COPY_AND_ASSIGN(ReallocOutputStream);
102 };
103 
104 NLIB_NAMESPACE_END
105 
106 #endif // INCLUDE_NN_NLIB_REALLOCOUTPUTSTREAM_H_
#define NLIB_NOEXCEPT
環境に合わせてnoexcept 又は同等の定義がされます。
Definition: Platform.h:2151
ReallocOutputStream() noexcept
デフォルトコンストラクタです。nlib_realloc()でメモリの拡張を行うように設定します。 ...
UniquePtr< char[], ReallocDeleter< char > > CharPtrType
charの配列へのUniquePtrをtypedefしたものです。
#define NLIB_FINAL
利用可能であればfinalが定義されます。そうでない場合は空文字列です。
#define NLIB_NONNULL
全ての引数にNULLを指定することができないことを示します。
Definition: Platform_unix.h:66
#define NLIB_DISALLOW_COPY_AND_ASSIGN(TypeName)
TypeName で指定されたクラスのコピーコンストラクタと代入演算子を禁止します。
Definition: Config.h:126
nlib_realloc()等のrealloc関数を利用して拡張するメモリ領域に書きこむ出力ストリームです。 ...
#define NLIB_OVERRIDE
利用可能であればoverrideが定義されます。そうでない場合は空文字列です。
UniquePtrはポインタの所有権を保持し、UniquePtrがスコープから出るときにデストラクタでポインタをDELで指...
Definition: UniquePtr.h:96
std::unique_ptrに相当するクラスが定義されています。
void ShrinkToFit() noexcept
バッファ・サイズを現在の書き込み位置にフィットさせます。
UniquePtr< uint8_t[], ReallocDeleter< uint8_t > > UniquePtrType
uint8_tの配列へのUniquePtrをtypedefしたものです。
NLIB_CHECK_RESULT void * nlib_realloc(void *ptr, size_t size)
C標準関数のrealloc()を呼び出すweak関数です。nlibはこの関数を経由してrealloc()を呼び出します。 ...
#define NLIB_VIS_PUBLIC
関数やクラス等のシンボルをライブラリの外部に公開します。
Definition: Platform_unix.h:51
#define NLIB_STATIC_ASSERT(exp)
静的アサートが定義されます。利用可能であればstatic_assertを利用します。
Definition: Config.h:117
void nlib_free(void *ptr)
C標準関数のfree()を呼び出すweak関数です。nlibはこの関数を経由してfree()を呼び出します。 ...
bool Reserve(size_t n) noexcept
サイズを指定して書き込み先バッファを確保します。
出力ストリームの基底クラスを定義しています。
出力ストリームの基底クラスです。このクラスを実体化することはできません。
Definition: OutputStream.h:17
int errno_t
intのtypedefで、戻り値としてPOSIXのエラー値を返すことを示します。
Definition: NMalloc.h:24