#ifndef _MEMUTILS_H_ #define _MEMUTILS_H_ #include #include #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 struct fnCreate { Object* operator() () { return new Object; } }; // °³Ã¼ »èÁ¦ struct fnDelete { template void operator() (Object* pObject) { delete pObject; } }; // MapÀÇ Pair¿¡ ÀÖ´Â °³Ã¼ »èÁ¦ struct fnDelete2nd { template void operator() (Pair& pair) { delete pair.second; } }; // ¹è¿­ »èÁ¦ struct fnDeleteArray { template void operator() (Object* pObject) { delete [] pObject; } }; // Release ÇÔ. struct fnRelease { template void operator() (Object* pObject) { pObject->Release(); } }; // MapÀÇ Pair¿¡ ÀÖ´Â °³Ã¼ »èÁ¦. struct fnRelease2nd { template void operator() (Pair& pair) { pair.second->Release(); } }; // Á¶°ÇÀÌ trueÀÌ¸é º¹»ç¸¦ ÇÏ´Â iterator. template 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 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 inline void ClearContainer(ContainerType& Container, DestructType fnDestructor) { std::for_each(Container.begin(), Container.end(), fnDestructor); Container.clear(); } }; #endif