nlib
ReallocOutputStream.h
[詳解]
1 
2 /*--------------------------------------------------------------------------------*
3  Project: CrossRoad
4  Copyright (C)Nintendo All rights reserved.
5 
6  These coded instructions, statements, and computer programs contain proprietary
7  information of Nintendo and/or its licensed developers and are protected by
8  national and international copyright laws. They may not be disclosed to third
9  parties or copied or duplicated in any form, in whole or in part, without the
10  prior written consent of Nintendo.
11 
12  The content herein is highly confidential and should be handled accordingly.
13  *--------------------------------------------------------------------------------*/
14 
15 #pragma once
16 #ifndef INCLUDE_NN_NLIB_REALLOCOUTPUTSTREAM_H_
17 #define INCLUDE_NN_NLIB_REALLOCOUTPUTSTREAM_H_
18 
19 #include <stdlib.h>
20 
21 #include "nn/nlib/UniquePtr.h"
22 #include "nn/nlib/OutputStream.h"
23 
24 NLIB_NAMESPACE_BEGIN
25 
27  public:
28  class NLIB_VIS_PUBLIC ReallocDeleter {
29  public:
30  typedef void* (*ReallocFunc)(void* ptr, size_t n) NLIB_NOEXCEPT_FUNCPTR;
31  ReallocDeleter() NLIB_NOEXCEPT : realloc_(::nlib_realloc) {}
32  explicit ReallocDeleter(ReallocFunc reallocfunc) NLIB_NOEXCEPT : realloc_(reallocfunc) {}
33  void operator()(void* p) const NLIB_NOEXCEPT;
34  ReallocFunc GetFunc() const NLIB_NOEXCEPT { return realloc_; }
35 
36  private:
37  ReallocFunc realloc_;
38  };
39  NLIB_STATIC_ASSERT(!IsEmpty<ReallocDeleter>::value);
42  typedef void* (*ReallocFunc)(void* ptr, size_t n) NLIB_NOEXCEPT_FUNCPTR;
43 
45  : data_(nullptr), realloc_func_(nlib_realloc), capacity_(0) {}
46  explicit ReallocOutputStream(ReallocFunc func) NLIB_NOEXCEPT NLIB_NONNULL
47  : data_(nullptr), realloc_func_(func), capacity_(0) {}
49 
50  uint8_t* Data() NLIB_NOEXCEPT { return data_; }
51  const uint8_t* Data() const NLIB_NOEXCEPT { return data_; }
52 
53  bool Reserve(size_t n) NLIB_NOEXCEPT { return this->Expand(n) == 0; }
55  if (this->ExpandOrShrink(this->Pos()) == 0) {
56  this->ResetBuffer(data_ + capacity_, 0);
57  }
58  }
59 
60  size_t Release(UniquePtrType* ptr) NLIB_NOEXCEPT;
61  // UniquePtrType Reelase(size_t* n);
62 
63  // Appends '\0' and, returns the memory after ShrinkToFit().
64  bool ReleaseAsCstring(CharPtrType* ptr) NLIB_NOEXCEPT;
65 
66  private:
67  errno_t Expand(size_t newcap) NLIB_NOEXCEPT {
68  return (newcap > capacity_) ? this->ExpandOrShrink(newcap) : 0;
69  }
70  errno_t ExpandOrShrink(size_t newcap) NLIB_NOEXCEPT;
71  virtual bool PushBuffer_(const void* p, size_t nbytes,
72  bool do_flush) NLIB_NOEXCEPT NLIB_OVERRIDE;
73  virtual bool Close_() NLIB_NOEXCEPT NLIB_OVERRIDE;
74  virtual void* GetWorkBuffer_(size_t* nbytes) NLIB_NOEXCEPT NLIB_OVERRIDE;
75 
76  private:
77  uint8_t* data_;
78  ReallocFunc realloc_func_;
79  size_t capacity_;
81 };
82 
83 NLIB_NAMESPACE_END
84 
85 #endif // INCLUDE_NN_NLIB_REALLOCOUTPUTSTREAM_H_
#define NLIB_OVERRIDE
利用可能であればoverrideが定義されます。そうでない場合は空文字列です。
Definition: Config.h:244
ReallocOutputStream() noexcept
デフォルトコンストラクタです。nlib_realloc()でメモリの拡張を行うように設定します。 ...
UniquePtr< char[], ReallocDeleter > CharPtrType
charの配列へのUniquePtrをtypedefしたものです。
#define NLIB_DISALLOW_COPY_AND_ASSIGN(TypeName)
TypeName で指定されたクラスのコピーコンストラクタと代入演算子を禁止します。
Definition: Config.h:179
nlib_realloc()等のrealloc関数を利用して拡張するメモリ領域に書きこむ出力ストリームです。 ...
UniquePtrはポインタの所有権を保持し、UniquePtrがスコープから出るときにデストラクタでポインタをDELで指...
Definition: UniquePtr.h:109
std::unique_ptrに相当するクラスが定義されています。
void ShrinkToFit() noexcept
バッファ・サイズを現在の書き込み位置にフィットさせます。
#define NLIB_VIS_PUBLIC
関数やクラス等のシンボルをライブラリの外部に公開します。
Definition: Platform_unix.h:89
UniquePtr< uint8_t[], ReallocDeleter > UniquePtrType
uint8_tの配列へのUniquePtrをtypedefしたものです。
#define NLIB_NOEXCEPT
環境に合わせてnoexcept 又は同等の定義がされます。
Definition: Config.h:105
uint8_t * Data() noexcept
書込み中のデータの先頭へのポインタを取得します。
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:245
#define NLIB_STATIC_ASSERT(exp)
静的アサートが定義されます。利用可能であればstatic_assertを利用します。
Definition: Config.h:170
bool Reserve(size_t n) noexcept
サイズを指定して書き込み先バッファを確保します。
出力ストリームの基底クラスを定義しています。
#define NLIB_NONNULL
全ての引数にNULLを指定することができないことを示します。
出力ストリームの基底クラスです。このクラスを実体化することはできません。
Definition: OutputStream.h:30
int errno_t
intのtypedefで、戻り値としてPOSIXのエラー値を返すことを示します。
Definition: NMalloc.h:37