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 m_Cur.interlocked._[0] = m_Cur.interlocked._[1] = 0;
38 (*m_Handler)(m_Start, m_End);
41 errno_t Initialize(
void* start,
size_t size, DestructorHandler handler,
46 to.tb.botidx = m_End - m_Start;
49 void FreeTop() NLIB_NOEXCEPT { m_Cur.tb.topidx = 0; }
51 size_t bot = m_End - m_Start;
52 m_Cur.tb.botidx = bot;
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;
62 void Dump() 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));
83 m_Start =
reinterpret_cast<uint8_t*
>(start);
84 m_End =
reinterpret_cast<uint8_t*
>(end);
90 uint32_t m_HeapOption;
93 DestructorHandler m_Handler;
99 #if defined(_MSC_VER) && defined(nx_heap_EXPORTS)
100 #undef NLIB_VIS_PUBLIC
101 #define NLIB_VIS_PUBLIC NLIB_WINIMPORT
104 #endif // INCLUDE_NN_NLIB_HEAP_FRAMEHEAP_H_
#define NLIB_NOEXCEPT
環境に合わせてnoexcept 又は同等の定義がされます。
bool operator==(const State &rhs) noexcept
ヒープの状態を比較して、等価ならばtrueを返します。
void FreeAll() noexcept
メモリを全て解放し、ヒープを初期化直後の状態に戻します。
#define NLIB_FINAL
利用可能であればfinalが定義されます。そうでない場合は空文字列です。
void FreeBot() noexcept
ヒープの下部から確保したメモリを全て解放します。
void FreeTop() noexcept
ヒープの上部から確保したメモリを全て解放します。
State SaveState() noexcept
現在のヒープの状態をセーブします。
bool operator!=(const State &rhs) noexcept
ヒープの状態を比較して、等価でなければtrueを返します。
void RestoreState(State state) noexcept
セーブしたヒープの状態に戻します。
void * Alloc(size_t n, size_t algn) noexcept
アライメントを指定してメモリブロックを確保します。
AllocOption
アロケートをヒープのどちらがわから行うかを指定します。
void * Alloc(size_t n) noexcept
メモリブロックを確保します。