Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
92 lines
2.5 KiB
C++
92 lines
2.5 KiB
C++
#ifndef _MEMUTILS_H_
|
|
#define _MEMUTILS_H_
|
|
|
|
#include <winsock2.h>
|
|
#include <windows.h>
|
|
|
|
#define SAFE_FREE(p) { if (p) { free(p); (p) = NULL; } }
|
|
#define SAFE_DELETE(p) { if (p) { delete (p); (p) = NULL; } }
|
|
#define SAFE_DELETE_ARRAY(p) { if (p) { delete[] (p); (p) = NULL; } }
|
|
#define SAFE_RELEASE(p) { if (p) { (p)->Release(); (p) = NULL; } }
|
|
#define SAFE_CLOSESOCK(p) { if (INVALID_SOCKET != (p)) { closesocket(p); (p) = INVALID_SOCKET; } }
|
|
#define SAFE_CLOSEHANDLE(p) { if (INVALID_HANDLE_VALUE != (p)) { CloseHandle(p); (p) = INVALID_HANDLE_VALUE; } }
|
|
|
|
// 각종 유용한 함수자와, 알고리즘들을 담고 있습니다.
|
|
namespace MemUtils
|
|
{
|
|
// 개체 생성
|
|
template<typename Object>
|
|
struct fnCreate {
|
|
Object* operator() () {
|
|
return new Object;
|
|
}
|
|
};
|
|
|
|
// 개체 삭제
|
|
struct fnDelete {
|
|
template<typename Object>
|
|
void operator() (Object* pObject) {
|
|
delete pObject;
|
|
}
|
|
};
|
|
|
|
// Map의 Pair에 있는 개체 삭제
|
|
struct fnDelete2nd {
|
|
template<typename Pair>
|
|
void operator() (Pair& pair) {
|
|
delete pair.second;
|
|
}
|
|
};
|
|
|
|
// 배열 삭제
|
|
struct fnDeleteArray {
|
|
template<typename Object>
|
|
void operator() (Object* pObject) {
|
|
delete [] pObject;
|
|
}
|
|
};
|
|
|
|
// Release 함.
|
|
struct fnRelease {
|
|
template<typename Object>
|
|
void operator() (Object* pObject) {
|
|
pObject->Release();
|
|
}
|
|
};
|
|
|
|
// Map의 Pair에 있는 개체 삭제.
|
|
struct fnRelease2nd {
|
|
template<typename Pair>
|
|
void operator() (Pair& pair) {
|
|
pair.second->Release();
|
|
}
|
|
};
|
|
|
|
// 조건이 true이면 복사를 하는 iterator.
|
|
template<typename InputIterator, typename OutputIterator, typename Predicate>
|
|
inline OutputIterator copy_if(InputIterator begin, InputIterator end, OutputIterator destBegin, Predicate Pred) {
|
|
while(begin != end) {
|
|
if(Pred(*begin)) *destBegin++ = *begin;
|
|
++begin;
|
|
}
|
|
|
|
return destBegin;
|
|
}
|
|
|
|
// 컨테이너를 받아, 컨테이너 내의 모든 멤버에 대해서 delete를 수행. DestructType 은 fnDelete나 fnRelease중 하나
|
|
template<typename ContainerType, typename DesturctType, typename LockType>
|
|
inline void ClearContainer(ContainerType& Container, DesturctType fnDestructor, LockType& Lock) {
|
|
LockType::Syncronize sync(Lock);
|
|
std::for_each(Container.begin(), Container.end(), fnDestructor);
|
|
Container.clear();
|
|
}
|
|
|
|
// 컨테이너를 받아, 컨테이너 내의 모든 멤버에 대해서 delete를 수행. DestructType 은 fnDelete나 fnRelease중 하나
|
|
template<typename ContainerType, typename DestructType>
|
|
inline void ClearContainer(ContainerType& Container, DestructType fnDestructor) {
|
|
std::for_each(Container.begin(), Container.end(), fnDestructor);
|
|
Container.clear();
|
|
}
|
|
};
|
|
|
|
#endif |