11using namespace Microsoft::VisualStudio::CppUnitTestFramework;
18 TEST_CLASS_INITIALIZE (ClassInitialize)
20 Logger::WriteMessage (
"HeapMemoryTest class initialize.\n");
23 TEST_CLASS_CLEANUP (ClassCleanup)
25 Logger::WriteMessage (
"HeapMemoryTest class cleanup.\n");
28 TEST_METHOD_INITIALIZE (MethodInitialize)
30 Logger::WriteMessage (
"HeapMemoryTest method initialize.\n");
33 TEST_METHOD_CLEANUP (MethodCleanup)
35 Logger::WriteMessage (
"HeapMemoryTest method cleanup.\n");
38 TEST_METHOD (HeapMemoryBasicTest)
41 Assert::IsTrue(memory.
Create ());
43 for (
char n =
'A'; n <
'Z'; n++)
45 for (
int i = 0; i < 100; i++)
48 Assert::IsNotNull (mem);
49 FillMemory (mem, 100, n);
50 Assert::IsTrue(memory.
Free (mem));
52 Assert::IsTrue(memory.
Compact ());
55 Assert::IsTrue(memory.
Close ());
59 const int counter = 100;
61 const int counter = 10000;
63 typedef std::function<LPBYTE (
int)> MemoryCreator;
64 typedef std::function<void (LPBYTE)> MemoryDeleter;
69 Parameters (
int size,
int count, MemoryCreator creator, MemoryDeleter deleter)
70 :iSize (
size), iCount (count), creator (creator), deleter (deleter)
74 MemoryCreator creator;
75 MemoryDeleter deleter;
78 void ByteMemTest (
int size,
int count, MemoryCreator creator, MemoryDeleter deleter)
81 Parameters params (
size, count, creator, deleter);
83 auto function = [](LPVOID lpvParam)->DWORD
85 Parameters* params = (Parameters*)lpvParam;
87 for (
int i = 0; i < params->iCount; i++)
89 LPBYTE lpbyMemory = params->creator (params->iSize);
90 BYTE data = (
'a' + (i % 20));
91 FillMemory (lpbyMemory, params->iSize, data);
92 Assert::AreEqual<BYTE> (data, lpbyMemory[params->iSize - 1], _T (
"character mismatched.\n"));
93 params->deleter (lpbyMemory);
99 for (
int i = 0; i < 10; i++)
101 thread[i].
Create (function, ¶ms);
104 HANDLE hThreads[10]{ 0,0,0,0,0,0,0,0,0,0 };
105 for (
int i = 0; i < 10; i++)
109 ::WaitForMultipleObjects (10, hThreads, TRUE, INFINITE);
111 for (
int i = 0; i < 10; i++)
119 MemoryCreator newCreator = [](
int size)->LPBYTE {
return new BYTE[
size]; };
120 MemoryDeleter newDeleter = [](LPBYTE lpbyData)->
void {
delete lpbyData; };
122 TEST_METHOD (ByteMemTest_New____16)
124 ByteMemTest (16, counter, newCreator, newDeleter);
127 TEST_METHOD (ByteMemTest_New____64)
129 ByteMemTest (64, counter, newCreator, newDeleter);
132 TEST_METHOD (ByteMemTest_New___256)
134 ByteMemTest (256, counter, newCreator, newDeleter);
137 TEST_METHOD (ByteMemTest_New__1024)
139 ByteMemTest (1024, counter, newCreator, newDeleter);
142 TEST_METHOD (ByteMemTest_New__4096)
144 ByteMemTest (4096, counter, newCreator, newDeleter);
147 TEST_METHOD (ByteMemTest_New_16384)
149 ByteMemTest (16384, counter, newCreator, newDeleter);
152 TEST_METHOD (ByteMemTest_New_512k)
154 ByteMemTest (1024 * 512, counter, newCreator, newDeleter);
158 MemoryCreator basicCreator = [&](
int size)->LPBYTE {
return (LPBYTE)basicMemory.
Allocate (
size,0); };
159 MemoryDeleter basicDeleter = [&](LPBYTE lpbyData)->
void { basicMemory.
Free (lpbyData); };
161 TEST_METHOD (ByteMemTest_Basic____16)
163 ByteMemTest (16, counter, basicCreator, basicDeleter);
166 TEST_METHOD (ByteMemTest_Basic____64)
168 ByteMemTest (64, counter, basicCreator, basicDeleter);
171 TEST_METHOD (ByteMemTest_Basic___256)
173 ByteMemTest (256, counter, basicCreator, basicDeleter);
176 TEST_METHOD (ByteMemTest_Basic__1024)
178 ByteMemTest (1024, counter, basicCreator, basicDeleter);
181 TEST_METHOD (ByteMemTest_Basic__4096)
183 ByteMemTest (4096, counter, basicCreator, basicDeleter);
186 TEST_METHOD (ByteMemTest_Basic_16384)
188 ByteMemTest (16384, counter, basicCreator, basicDeleter);
191 TEST_METHOD (ByteMemTest_Basic_512k)
193 ByteMemTest (1024 * 512, counter, basicCreator, basicDeleter);
197 MemoryCreator heapCreator = [&](
int size)->LPBYTE {
return (LPBYTE)heapMemory->
Allocate (
size,0); };
198 MemoryDeleter heapDeleter = [&](LPBYTE lpbyData)->
void { heapMemory->
Free (lpbyData); };
200 TEST_METHOD (ByteMemTest_SystemHeap____16)
203 Assert::IsTrue (heapMemory->
Open ());
204 ByteMemTest (16, counter, heapCreator, heapDeleter);
205 Assert::IsTrue (heapMemory->
Close ());
209 TEST_METHOD (ByteMemTest_SystemHeap____64)
212 Assert::IsTrue(heapMemory->
Open());
213 ByteMemTest(64, counter, heapCreator, heapDeleter);
214 Assert::IsTrue(heapMemory->
Close());
218 TEST_METHOD (ByteMemTest_SystemHeap___256)
221 Assert::IsTrue(heapMemory->
Open());
222 ByteMemTest(256, counter, heapCreator, heapDeleter);
223 Assert::IsTrue(heapMemory->
Close());
227 TEST_METHOD (ByteMemTest_SystemHeap__1024)
230 Assert::IsTrue(heapMemory->
Open());
231 ByteMemTest(1024, counter, heapCreator, heapDeleter);
232 Assert::IsTrue(heapMemory->
Close());
236 TEST_METHOD (ByteMemTest_SystemHeap__4096)
239 Assert::IsTrue(heapMemory->
Open());
240 ByteMemTest(4096, counter, heapCreator, heapDeleter);
241 Assert::IsTrue(heapMemory->
Close());
245 TEST_METHOD (ByteMemTest_SystemHeap_16384)
248 Assert::IsTrue(heapMemory->
Open());
249 ByteMemTest(16384, counter, heapCreator, heapDeleter);
250 Assert::IsTrue(heapMemory->
Close());
254 TEST_METHOD (ByteMemTest_SystemHeap_512k)
257 Assert::IsTrue(heapMemory->
Open());
258 ByteMemTest(1024 * 512, counter, heapCreator, heapDeleter);
259 Assert::IsTrue(heapMemory->
Close());
263 TEST_METHOD (ByteMemTest_UserHeap____16)
266 Assert::IsTrue(heapMemory->
Create());
267 ByteMemTest(16, counter, heapCreator, heapDeleter);
268 Assert::IsTrue(heapMemory->
Close());
272 TEST_METHOD (ByteMemTest_UserHeap____64)
275 Assert::IsTrue(heapMemory->
Create());
276 ByteMemTest(64, counter, heapCreator, heapDeleter);
277 Assert::IsTrue(heapMemory->
Close());
281 TEST_METHOD (ByteMemTest_UserHeap___256)
284 Assert::IsTrue(heapMemory->
Create());
285 ByteMemTest(256, counter, heapCreator, heapDeleter);
286 Assert::IsTrue(heapMemory->
Close());
290 TEST_METHOD (ByteMemTest_UserHeap__1024)
293 Assert::IsTrue(heapMemory->
Create());
294 ByteMemTest(1024, counter, heapCreator, heapDeleter);
295 Assert::IsTrue(heapMemory->
Close());
299 TEST_METHOD (ByteMemTest_UserHeap__4096)
302 Assert::IsTrue(heapMemory->
Create());
303 ByteMemTest(4096, counter, heapCreator, heapDeleter);
304 Assert::IsTrue(heapMemory->
Close());
308 TEST_METHOD (ByteMemTest_UserHeap_16384)
311 Assert::IsTrue(heapMemory->
Create());
312 ByteMemTest(16384, counter, heapCreator, heapDeleter);
313 Assert::IsTrue(heapMemory->
Close());
317 TEST_METHOD (ByteMemTest_UserHeap_512k)
320 Assert::IsTrue(heapMemory->
Create());
321 ByteMemTest(1024 * 512, counter, heapCreator, heapDeleter);
322 Assert::IsTrue(heapMemory->
Close());
326 TEST_METHOD (HeapReallocTest)
330 BOOL ret = memory.
Create ();
331 Assert::IsTrue (ret, _T (
"HeapMemory::Create() failed.\n"));
333 int allocSize = 1024;
334 message.
Format (_T (
"now allocSize is %d\n"), allocSize);
335 Logger::WriteMessage (message.
Ctr ());
337 char* lpszMemory =
static_cast<char*
>(memory.
Allocate (allocSize));
338 FillMemory (lpszMemory, allocSize,
'a');
340 for (
int i = 0; i < 100; i++)
343 message.
Format (_T (
"now allocSize is %d\n"), allocSize);
344 Logger::WriteMessage (message.
Ctr ());
346 lpszMemory =
static_cast<char*
>(memory.
Reallocate (lpszMemory, allocSize));
347 FillMemory (lpszMemory, allocSize, (
'a' + i));
349 Assert::AreEqual<char> ((
'a' + i), lpszMemory[allocSize - 1], _T (
"character mismatched.\n"));
352 ret = memory.
Free (lpszMemory);
353 Assert::IsTrue (ret, _T (
"HeapMemory::Free() failed.\n"));
355 ret = memory.
Close();
356 Assert::IsTrue (ret, _T (
"HeapMemory::Close() failed.\n"));
文字列に関するWindowsAPIを集約したクラス
スレッドに関するWindowsAPIを集約したクラス
malloc/realloc/freeを使った標準的なメモリクラス
virtual LPVOID APIENTRY Allocate(SIZE_T bytes, DWORD dwFlags=MEM_ZERO)
メモリの取得
virtual BOOL APIENTRY Free(LPVOID lpvMem)
メモリの返却
HANDLE APIENTRY GetHandle() const
継承先はこの関数でハンドルを取得します。
BOOL APIENTRY Close()
使用しなくなったハンドルはこれでクローズします。
virtual BOOL APIENTRY Free(LPVOID lpvMem)
メモリの返却
virtual LPVOID APIENTRY Allocate(SIZE_T bytes, DWORD dwFlags=MEM_ZERO)
メモリの取得
SIZE_T APIENTRY Compact() const
取得したヒープ領域の整理
virtual LPVOID APIENTRY Reallocate(LPVOID lpvMem, SIZE_T bytes, DWORD dwFlags=MEM_ZERO)
取得メモリの拡大
BOOL APIENTRY Create(SIZE_T initialSize=0, SIZE_T maximumSize=0, DWORD dwOptions=0)
ヒープ領域の取得
BOOL APIENTRY Close()
取得したヒープ領域の解放
BOOL APIENTRY Open()
システムヒープ領域の取得
文字列に関するWindowsAPIを集約したクラス
TString &APIENTRY Format(LPCTSTR format,...)
フォーマットに従ってパラメータを文字列化します。
LPCTSTR APIENTRY Ctr() const
内部で確保している文字列ポインタを取得します。
スレッドに関するWindowsAPIを集約したクラス
BOOL APIENTRY Create(PTHREAD_START_ROUTINE function=NULL, LPVOID lpvParam=NULL, DWORD dwCreationFlag=0)
スレッドを作成します。