16 #ifndef INCLUDE_NN_NLIB_HEAP_FRAMEHEAP_H_ 17 #define INCLUDE_NN_NLIB_HEAP_FRAMEHEAP_H_ 21 #if defined(_MSC_VER) && defined(nx_heap_EXPORTS) 22 #undef NLIB_VIS_PUBLIC 23 #define NLIB_VIS_PUBLIC NLIB_WINEXPORT 31 typedef void (*DestructorHandler)(
void* start,
void* end) NLIB_NOEXCEPT_FUNCPTR;
33 kAllocOptionAllocHead = 0x00000000,
34 kAllocOptionAllocTail = 0x00000001
40 return _[0] == rhs._[0] && _[1] == rhs._[1];
43 return _[0] != rhs._[0] || _[1] != rhs._[1];
47 cur_.interlocked._[0] = cur_.interlocked._[1] = 0;
51 (*handler_)(start_, end_);
54 errno_t Init(
void* start,
size_t size, DestructorHandler handler,
59 to.tb.botidx = end_ - start_;
62 void FreeTop() NLIB_NOEXCEPT { cur_.tb.topidx = 0; }
64 size_t bot = end_ - start_;
72 void*
Alloc(
size_t n) NLIB_NOEXCEPT {
return this->
Alloc(n, 8, 0); }
73 void*
Alloc(
size_t n,
size_t algn) NLIB_NOEXCEPT {
return this->
Alloc(n, algn, 0); }
74 void* Alloc(
size_t n,
size_t algn, uint32_t alloc_option)
NLIB_NOEXCEPT;
85 static uint8_t* RoundUp(uint8_t* ptr,
size_t algn) NLIB_NOEXCEPT {
87 intptr_t tmp =
reinterpret_cast<intptr_t
>(ptr);
88 return reinterpret_cast<uint8_t*
>(tmp + (-tmp & (algn - 1)));
90 static uint8_t* RoundDown(uint8_t* ptr,
size_t algn) NLIB_NOEXCEPT {
92 intptr_t tmp =
reinterpret_cast<intptr_t
>(ptr);
93 return reinterpret_cast<uint8_t*
>(tmp & (~algn + 1));
95 void ChangeHeapRange(
void* start,
void* end) NLIB_NOEXCEPT {
96 start_ =
reinterpret_cast<uint8_t*
>(start);
97 end_ =
reinterpret_cast<uint8_t*
>(end);
102 uint32_t heap_option_;
105 DestructorHandler handler_;
111 #if defined(_MSC_VER) && defined(nx_heap_EXPORTS) 112 #undef NLIB_VIS_PUBLIC 113 #define NLIB_VIS_PUBLIC NLIB_WINIMPORT 116 #endif // INCLUDE_NN_NLIB_HEAP_FRAMEHEAP_H_ bool operator==(const State &rhs) noexcept
ヒープの状態を比較して、等価ならばtrueを返します。
void FreeAll() noexcept
メモリを全て解放し、ヒープを初期化直後の状態に戻します。
void FreeBot() noexcept
ヒープの下部から確保したメモリを全て解放します。
void FreeTop() noexcept
ヒープの上部から確保したメモリを全て解放します。
State SaveState() noexcept
現在のヒープの状態をセーブします。
bool operator!=(const State &rhs) noexcept
ヒープの状態を比較して、等価でなければtrueを返します。
void RestoreState(State state) noexcept
セーブしたヒープの状態に戻します。
#define NLIB_NOEXCEPT
環境に合わせてnoexcept 又は同等の定義がされます。
void * Alloc(size_t n, size_t algn) noexcept
アライメントを指定してメモリブロックを確保します。
AllocOption
アロケートをヒープのどちらがわから行うかを指定します。
#define NLIB_FINAL
利用可能であればfinalが定義されます。そうでない場合は空文字列です。
void * Alloc(size_t n) noexcept
メモリブロックを確保します。