BREWアプリを Windows へ移植(5)
今日は IHeap の実装について。
ガイドラインに従った BREWアプリを作る場合、かならず IHEAP_CheckAvail() を使うわけですが、Windows だとヒープの残量なんて気にする必要は無いので、必ず TRUE を返してやることにします。
で、IHEAP_Malloc() だの IHEAP_Free() だのは MALLOC() や FREE() といったヘルパ関数に置き換えてやればいいでしょう。
class WinHeap : public IHeap{ public: WinHeap(); ~WinHeap(); private: static uint32 AddRef(IHeap*); static uint32 Release(IHeap*); static void * Malloc(IHeap * pIHeap, uint32 dwSize); static void * Realloc(IHeap * pIHeap, void * pMemBlock, uint32 dwNewSize); static void Free(IHeap * pIHeap, void * pMemFree); static AECHAR * StrDup(IHeap * pIHeap, AECHAR * pStr); static boolean CheckAvail(IHeap *pIHeap, uint32 dwSize); static uint32 GetMemStats(IHeap *pIHeap); private: IHeapVtbl _vtbl; uint32 _ref; };
WinHeap::WinHeap() : _ref( 1 ){ _vtbl.AddRef = &AddRef; _vtbl.Release = &Release; _vtbl.Malloc = &Malloc; _vtbl.Realloc = &Realloc; _vtbl.Free = &Free; _vtbl.StrDup = &StrDup; _vtbl.CheckAvail = &CheckAvail; _vtbl.GetMemStats = &GetMemStats; this->pvt = &_vtbl; } WinHeap::~WinHeap(){ } uint32 WinHeap::AddRef(IHeap* po){ return ++((WinHeap*)po)->_ref; } uint32 WinHeap::Release(IHeap* po){ WinHeap* pMe = (WinHeap*)po; if( --pMe->_ref == 0 ){ delete pMe; return 0; } return pMe->_ref; } void * WinHeap::Malloc(IHeap * pIHeap, uint32 dwSize){ return MALLOC( dwSize ); } void * WinHeap::Realloc(IHeap * pIHeap, void * pMemBlock, uint32 dwNewSize){ return REALLOC( pMemBlock , dwNewSize ); } void WinHeap::Free(IHeap * pIHeap, void * pMemFree){ return FREE( pMemFree ); } AECHAR * WinHeap::StrDup(IHeap * pIHeap, AECHAR * pStr){ return (AECHAR*)::wcsdup( (wchar_t*)pStr ); } boolean WinHeap::CheckAvail(IHeap *pIHeap, uint32 dwSize){ return TRUE; } uint32 WinHeap::GetMemStats(IHeap *pIHeap){ return 0; }
これだけ。
やっぱり Windows はヒープと速度気にしなくていいから楽だなぁ……。