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 はヒープと速度気にしなくていいから楽だなぁ……。