reactos/sdk/lib/atl/atlmem.h
2021-06-11 15:33:08 +03:00

105 lines
1.9 KiB
C++

#ifndef __ATLMEM_H__
#define __ATLMEM_H__
#pragma once
#include "atlcore.h"
namespace ATL
{
//__interface __declspec(uuid("654F7EF5-CFDF-4df9-A450-6C6A13C622C0"))
class IAtlMemMgr
{
public:
virtual ~IAtlMemMgr() {};
virtual _Ret_maybenull_ _Post_writable_byte_size_(SizeBytes) void* Allocate(
_In_ size_t SizeBytes
) = 0;
virtual void Free(
_Inout_opt_ void* Buffer
) = 0;
virtual _Ret_maybenull_ _Post_writable_byte_size_(SizeBytes) void* Reallocate(
_Inout_updates_bytes_opt_(SizeBytes) void* Buffer,
_In_ size_t SizeBytes
) = 0;
virtual size_t GetSize(
_In_ void* Buffer
) = 0;
};
class CWin32Heap : public IAtlMemMgr
{
public:
HANDLE m_hHeap;
public:
CWin32Heap() :
m_hHeap(NULL)
{
}
CWin32Heap(_In_ HANDLE hHeap) :
m_hHeap(hHeap)
{
ATLASSERT(hHeap != NULL);
}
virtual ~CWin32Heap()
{
}
// IAtlMemMgr
_Ret_maybenull_ _Post_writable_byte_size_(SizeBytes) virtual void* Allocate(
_In_ size_t SizeBytes
)
{
return ::HeapAlloc(m_hHeap, 0, SizeBytes);
}
virtual void Free(
_In_opt_ void* Buffer
)
{
if (Buffer)
{
if (!::HeapFree(m_hHeap, 0, Buffer))
ATLASSERT(FALSE);
}
}
_Ret_maybenull_ _Post_writable_byte_size_(SizeBytes) virtual void* Reallocate(
_In_opt_ void* Buffer,
_In_ size_t SizeBytes
)
{
if (SizeBytes == 0)
{
Free(Buffer);
return NULL;
}
if (Buffer == NULL)
{
return Allocate(SizeBytes);
}
return ::HeapReAlloc(m_hHeap, 0, Buffer, SizeBytes);
}
virtual size_t GetSize(
_Inout_ void* Buffer
)
{
return ::HeapSize(m_hHeap, 0, Buffer);
}
};
}
#endif