[ATL]
[reactos.git] / reactos / lib / atl / atlmem.h
1 #ifndef __ATLMEM_H__
2 #define __ATLMEM_H__
3
4 #pragma once
5 #include <atlcore.h>
6
7 namespace ATL
8 {
9
10 __interface __declspec(uuid("654F7EF5-CFDF-4df9-A450-6C6A13C622C0")) IAtlMemMgr
11 {
12 public:
13 _Ret_maybenull_ _Post_writable_byte_size_(SizeBytes) void* Allocate(
14 _In_ size_t SizeBytes
15 );
16
17 void Free(
18 _Inout_opt_ void* Buffer
19 );
20
21 _Ret_maybenull_ _Post_writable_byte_size_(SizeBytes) void* Reallocate(
22 _Inout_updates_bytes_opt_(SizeBytes) void* Buffer,
23 _In_ size_t SizeBytes
24 );
25
26 size_t GetSize(
27 _In_ void* Buffer
28 );
29 };
30
31 class CWin32Heap : public IAtlMemMgr
32 {
33 public:
34 HANDLE m_hHeap;
35
36 public:
37 CWin32Heap() :
38 m_hHeap(NULL)
39 {
40 }
41
42 CWin32Heap(_In_ HANDLE hHeap) :
43 m_hHeap(hHeap)
44 {
45 ATLASSERT(hHeap != NULL);
46 }
47
48 virtual ~CWin32Heap()
49 {
50 }
51
52
53 // IAtlMemMgr
54 _Ret_maybenull_ _Post_writable_byte_size_(SizeBytes) virtual void* Allocate(
55 _In_ size_t SizeBytes
56 )
57 {
58 return ::HeapAlloc(m_hHeap, 0, SizeBytes);
59 }
60
61 virtual void Free(
62 _In_opt_ void* Buffer
63 )
64 {
65 if (Buffer)
66 {
67 BOOL FreeOk;
68 FreeOk = ::HeapFree(m_hHeap, 0, Buffer);
69 ATLASSERT(FreeOk == TRUE);
70 }
71 }
72
73 _Ret_maybenull_ _Post_writable_byte_size_(SizeBytes) virtual void* Reallocate(
74 _In_opt_ void* Buffer,
75 _In_ size_t SizeBytes
76 )
77 {
78 if (SizeBytes == 0)
79 {
80 Free(Buffer);
81 return NULL;
82 }
83
84 if (Buffer == NULL)
85 {
86 return Allocate(SizeBytes);
87 }
88
89 return ::HeapReAlloc(m_hHeap, 0, Buffer, SizeBytes);
90 }
91
92 virtual size_t GetSize(
93 _Inout_ void* Buffer
94 )
95 {
96 return ::HeapSize(m_hHeap, 0, Buffer);
97 }
98 };
99
100 }
101
102 #endif