Files
LGram16 dd97ddec92 Restructure repository to include all source folders
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>
2025-11-29 20:17:20 +09:00

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