3 #ifndef INCLUDE_NN_NLIB_HEAP_FRAMEHEAP_H_ 4 #define INCLUDE_NN_NLIB_HEAP_FRAMEHEAP_H_ 8 #if defined(_MSC_VER) && defined(nx_heap_EXPORTS) 10 #define NLIB_VIS_PUBLIC NLIB_WINEXPORT 18 typedef void (*DestructorHandler)(
void* start,
void* end);
20 ALLOCOPTION_ALLOCHEAD = 0x00000000,
21 ALLOCOPTION_ALLOCTAIL = 0x00000001
27 return _[0] == rhs._[0] && _[1] == rhs._[1];
30 return _[0] != rhs._[0] || _[1] != rhs._[1];
34 cur_.interlocked._[0] = cur_.interlocked._[1] = 0;
38 (*handler_)(start_, end_);
41 errno_t Init(
void* start,
size_t size, DestructorHandler handler,
46 to.tb.botidx = end_ - start_;
49 void FreeTop() NLIB_NOEXCEPT { cur_.tb.topidx = 0; }
51 size_t bot = end_ - start_;
59 void*
Alloc(
size_t n) NLIB_NOEXCEPT {
return this->
Alloc(n, 8, 0); }
60 void*
Alloc(
size_t n,
size_t algn) NLIB_NOEXCEPT {
return this->
Alloc(n, algn, 0); }
61 void* Alloc(
size_t n,
size_t algn, uint32_t alloc_option)
NLIB_NOEXCEPT;
72 static uint8_t* RoundUp(uint8_t* ptr,
size_t algn) NLIB_NOEXCEPT {
74 intptr_t tmp =
reinterpret_cast<intptr_t
>(ptr);
75 return reinterpret_cast<uint8_t*
>(tmp + (-tmp & (algn - 1)));
77 static uint8_t* RoundDown(uint8_t* ptr,
size_t algn) NLIB_NOEXCEPT {
79 intptr_t tmp =
reinterpret_cast<intptr_t
>(ptr);
80 return reinterpret_cast<uint8_t*
>(tmp & (~algn + 1));
82 void ChangeHeapRange(
void* start,
void* end) NLIB_NOEXCEPT {
83 start_ =
reinterpret_cast<uint8_t*
>(start);
84 end_ =
reinterpret_cast<uint8_t*
>(end);
89 uint32_t heap_option_;
92 DestructorHandler handler_;
98 #if defined(_MSC_VER) && defined(nx_heap_EXPORTS) 99 #undef NLIB_VIS_PUBLIC 100 #define NLIB_VIS_PUBLIC NLIB_WINIMPORT 103 #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
メモリブロックを確保します。