DragonNest/Server/ServiceMonitorEx/Source/DebugSet.hpp

676 lines
23 KiB
C++
Raw Permalink Normal View History

2024-12-19 09:48:26 +08:00
/*//===============================================================
<< DEBUG >>
PRGM : B4nFter, milkji
FILE : DEBUGSET.HPP
DESC : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>޼<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
INIT BUILT DATE : 2005. 04. 28
LAST BUILT DATE : 2006. 03. 07
Copyright<EFBFBD><EFBFBD> 2002~2009 B4nFter (b4nfter@gmail.com) and Co-Writers. All Rights Reserved.
*///===============================================================
#pragma once
///////////////////////////////////////////////////////////////////
// INCLUDE
///////////////////////////////////////////////////////////////////
// P.S.> SYSBASEBASE.H <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> WINDOWS.H <20><> <20><EFBFBD><E2BABB><EFBFBD><EFBFBD> <20><><EFBFBD>ܽ<EFBFBD>Ŵ)
#if defined(_DEBUG)
#include <STRSAFE.H>
#include <CRTDBG.H> // DCRT<52><54> <20><><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> include <20>Ǿ<EFBFBD><C7BE><EFBFBD> <20><>
#endif // _DEBUG
///////////////////////////////////////////////////////////////////
// DEFINE
///////////////////////////////////////////////////////////////////
/*
<VISUAL STUDIO <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>>
Minimum system required Macros to define
------------------------ ------------------------
Visual Studio.net 9.0 (2008) _MSC_VER 15.00 (1500)
Visual Studio.net 8.0 (2005) _MSC_VER 14.00 (1400)
Visual Studio.net 7.1 (2003) _MSC_VER 13.10 (1310)
Visual Studio.net 7.0 _MSC_VER 13.00 (1300)
Visual Studio 6.0 _MSC_VER 12.00 (1200)
Visual Studio 5.0 _MSC_VER 10.00 (1000)
*/
/*
<<EFBFBD>޸<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>°<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> (WIN32 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>)>
0xCDCDCDCD : HEAP <EFBFBD><EFBFBD> <EFBFBD>Ҵ<EFBFBD><EFBFBD>Ǿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʱ<EFBFBD>ȭ <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
0xDDDDDDDD : HEAP <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
0xFDFDFDFD : HEAP <EFBFBD>޸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ġ<EFBFBD>ϴ<EFBFBD> 'NoMansLand' <EFBFBD><EFBFBD>Ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʵ<EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٸ<EFBFBD> <EFBFBD>Ƹ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
0xCCCCCCCC : STACK <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ġ<EFBFBD>Ǿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʱ<EFBFBD>ȭ <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
#if defined(_X86_)
#define DF_MEMSTATE_CDCD ((DWORD_PTR)(0xCDCDCDCD))
#define DF_MEMSTATE_DDDD ((DWORD_PTR)(0xDDDDDDDD))
#define DF_MEMSTATE_FDFD ((DWORD_PTR)(0xFDFDFDFD))
#define DF_MEMSTATE_CCCC ((DWORD_PTR)(0xCCCCCCCC))
#elif defined(_AMD64_)
#define DF_MEMSTATE_CDCD ((DWORD_PTR)(0xCDCDCDCDCDCDCDCD))
#define DF_MEMSTATE_DDDD ((DWORD_PTR)(0xDDDDDDDDDDDDDDDD))
#define DF_MEMSTATE_FDFD ((DWORD_PTR)(0xFDFDFDFDFDFDFDFD))
#define DF_MEMSTATE_CCCC ((DWORD_PTR)(0xCCCCCCCCCCCCCCCC))
#elif defined(_IA64_)
#pragma FORCE COMPILE ABORT!
#else // !_X86 && !_AMD64_ && !_IA64_
#pragma FORCE COMPILE ABORT!
#endif // !_X86 && !_AMD64_ && !_IA64_
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ּ<EFBFBD> <20><>ũ<EFBFBD><C5A9> <20>Լ<EFBFBD>
// P.S.>
/*
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<EFBFBD>ӿ<EFBFBD> Ʈ<EFBFBD><EFBFBD><EFBFBD>̽<EFBFBD> â<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ּ<EFBFBD>
- <EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ٹ<EFBFBD>ȣ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> Ŭ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>̵<EFBFBD>
- #pragma COMPILE_COMMENT("<EFBFBD>ּ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>") <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
#define __COMPILE_COMMENTX__(pMSG) #pMSG
#define __COMPILE_COMMENT__(pMSG) __COMPILE_COMMENTX__(pMSG)
#define COMPILE_COMMENT(pCMT) message(__FILE__ "(" __COMPILE_COMMENT__(__LINE__) ") : "pCMT)
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ũ<EFBFBD><C5A9> <20>Լ<EFBFBD><D4BC><EFBFBD>
#if defined(_DEBUG)
#if !defined(_CRTDBG_MAP_ALLOC)
#define _CRTDBG_MAP_ALLOC
#endif // _CRTDBG_MAP_ALLOC
#if defined(MFC_VER)
#define malloc(s) _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__)
#define calloc(c, s) _calloc_dbg(c, s, _NORMAL_BLOCK, __FILE__, __LINE__)
#define realloc(p, s) _realloc_dbg(p, s, _NORMAL_BLOCK, __FILE__, __LINE__)
#define _expand(p, s) _expand_dbg(p, s, _NORMAL_BLOCK, __FILE__, __LINE__)
#define free(p) _free_dbg(p, _NORMAL_BLOCK)
#define _msize(p) _msize_dbg(p, _NORMAL_BLOCK)
#define _aligned_malloc(s, a) _aligned_malloc_dbg(s, a, __FILE__, __LINE__)
#define _aligned_realloc(p, s, a) _aligned_realloc_dbg(p, s, a, __FILE__, __LINE__)
#define _aligned_offset_malloc(s, a, o) _aligned_offset_malloc_dbg(s, a, o, __FILE__, __LINE__)
#define _aligned_offset_realloc(p, s, a, o) _aligned_offset_realloc_dbg(p, s, a, o, __FILE__, __LINE__)
#define _aligned_free(p) _aligned_free_dbg(p)
#endif // MFC_VER
#define BASE_TRACE CDebugSet::Trace
#define BASE_MESSAGEBOX CDebugSet::MessageBox
#define BASE_CHECK_MEMORYLEAK() { \
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); \
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_DEBUG); \
)
#define BASE_ASSERT_CMP(pEXP) {typedef char DUM[(pEXP)? 1: -1];} // COMPILE-TIME (<28><EFBFBD><E8BFAD> ũ<>Ⱑ 0 <20><><EFBFBD>ϰ<EFBFBD> <20><> <20><> <20><><EFBFBD>ٴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>̿<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ʋ<><C6B2><EFBFBD><EFBFBD> C2118 ('÷<>ڰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.') <20><><EFBFBD><EFBFBD> <20>߻<EFBFBD>)
#define BASE_ASSERT(pEXP, pMSG) { \
BOOL bEXP = static_cast<BOOL>(pEXP); \
if ((FALSE == bEXP) && CBaseSet::IsWindowStationVisible()) { \
DWORD dwLastError = ::GetLastError(); \
/* Retry Button => 1, Abort => <20><><EFBFBD><EFBFBD>, Ignore => -1*/ \
INT iRetVal = CDebugSet::CrtDbgReport(__FILE__, __LINE__, (const CHAR*)pMSG, #pEXP); \
::SetLastError(dwLastError); \
if (iRetVal == 1) { \
::__debugbreak(); /*_asm { int 3 }, ::_CrtDbgBreak();*/ \
} \
} \
}
#define BASE_VERIFY(pEXP, pTRUEVAL, pMSG) BASE_ASSERT((pEXP) == (pTRUEVAL), pMSG)
#define BASE_RETURN(pEXP) {BASE_ASSERT(0, "BASE_RETURN!");return(pEXP);}
#define BASE_RETURN_NONE {BASE_ASSERT(0, "BASE_RETURN!");return;}
#define BASE_BREAK {BASE_ASSERT(0, "BASE_CONTINUE!");break;}
#define BASE_CONTINUE {BASE_ASSERT(0, "BASE_CONTINUE!");continue;}
#define BASE_LEAVE {BASE_ASSERT(0, "BASE_LEAVE!");__leave;}
#else // _DEBUG
#define BASE_TRACE /##/ // Release <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20>ּ<EFBFBD><D6BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD> 'C1075' (¦<><C2A6> <20>DZ<EFBFBD><C7B1><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߻<EFBFBD><DFBB><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
#define BASE_MESSAGEBOX /##/ // Release <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20>ּ<EFBFBD><D6BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD> 'C1075' (¦<><C2A6> <20>DZ<EFBFBD><C7B1><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߻<EFBFBD><DFBB><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
#define BASE_CHECK_MEMORYLEAK /##/ // Release <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20>ּ<EFBFBD><D6BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD> 'C1075' (¦<><C2A6> <20>DZ<EFBFBD><C7B1><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߻<EFBFBD><DFBB><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
#define BASE_ASSERT_CMP(pEXP)
#define BASE_ASSERT(pEXP, pMSG)
#define BASE_VERIFY(pEXP, pTRUEVAL, pMSG) ((void)(pEXP))
#define BASE_RETURN(pEXP) return(pEXP)
#define BASE_RETURN_NONE return
#define BASE_BREAK break
#define BASE_CONTINUE continue
#define BASE_LEAVE __leave
#endif // _DEBUG
// HEAP üũ <20><><EFBFBD><EFBFBD> <20><>ũ<EFBFBD><C5A9> <20>Լ<EFBFBD><D4BC><EFBFBD>
// P.S.>
/*
- DCRT<EFBFBD><EFBFBD> HEAP üũ<EFBFBD><EFBFBD> Ȱ<EFBFBD><EFBFBD>ȭ <EFBFBD>ϱ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ݵ<EFBFBD><EFBFBD><EFBFBD> BASE_DCRT_ON()<EFBFBD><EFBFBD> <EFBFBD>ѹ<EFBFBD> ȣ<EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <EFBFBD><EFBFBD>
- CRTDBG_CHECK_ALWAYS_DF<EFBFBD><EFBFBD> new/delete<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> HEAP <EFBFBD>޸𸮸<EFBFBD> <EFBFBD>˻<EFBFBD><EFBFBD>ϰ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϹǷ<EFBFBD> Overhead<EFBFBD><EFBFBD> <EFBFBD>ʹ<EFBFBD> ũ<EFBFBD>Ƿ<EFBFBD> Ȱ<EFBFBD><EFBFBD>ȭ<EFBFBD><EFBFBD>Ű<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- DCRT<EFBFBD><EFBFBD> <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҷ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ݵ<EFBFBD><EFBFBD><EFBFBD> _CrtSetDbgFlag()<EFBFBD><EFBFBD> ȣ<EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <EFBFBD><EFBFBD>
*/
#if defined(_DEBUG)
#if (1 == BASE_DCRT_LEVEL)
#define BASE_DCRT_ON() ::_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF)
#elif (2 == BASE_DCRT_LEVEL)
#define BASE_DCRT_ON() ::_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_DELAY_FREE_MEM_DF | \
_CRTDBG_LEAK_CHECK_DF)
#elif (3 == BASE_DCRT_LEVEL)
#define BASE_DCRT_ON() ::_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_DELAY_FREE_MEM_DF | \
_CRTDBG_LEAK_CHECK_DF| _CRTDBG_CHECK_ALWAYS_DF)
#else
#define BASE_DCRT_ON()
#endif
#if (0 < BASE_DCRT_LEVEL)
#define BASE_DCRT_OFF() ::_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF)
#define BASE_HEAP_CHECK() BASE_ASSERT(::_CrtCheckMemory(), "Under/Overwrite or Invalid Access!")
#define BASE_HEAP_PTR(pPTR) BASE_ASSERT(!::_CrtIsValidHeapPointer(pPTR), "Invalid Heap Pointer")
#define BASE_HEAP_LEAK() BASE_ASSERT(!::_CrtDumpMemoryLeaks(), "Memory Leakage!")
#define BASE_CODE(pCODE) BASE_ASSERT(!::IsBadCodePtr((FARPROC)pCODE), "Bad Code!");
#else
#define BASE_DCRT_OFF()
#define BASE_HEAP_CHECK()
#define BASE_HEAP_PTR(pPTR)
#define BASE_HEAP_LEAK()
#define BASE_CODE(pCODE) BASE_ASSERT(NULL != pCODE, "Bad Code!");
#endif
// Desc : null<6C><6C> check<63>ְ<EFBFBD>, pSZ<53><5A> 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD><EFBFBD> <20>ش<EFBFBD>.
#if (3 > BASE_DCRT_LEVEL)
#define BASE_READ(pMSG, pSZ) BASE_ASSERT((NULL != pMSG) && (0 < pSZ), "Can`t Read!");
#define BASE_WRITE(pBUF, pSZ) BASE_ASSERT((NULL != pBUF) && (0 < pSZ), "Can`t Write!");
#define BASE_STRINGA(pMSG, pSZ) BASE_ASSERT((NULL != pMSG) && ('\0' != pMSG[0]) && (0 < pSZ), "Invalid String!");
#define BASE_STRINGW(pMSG, pSZ) BASE_ASSERT((NULL != pMSG) && (L'\0' != pMSG[0]) && (0 < pSZ), "Invalid String!");
#else
#define BASE_READ(pMSG, pSZ) BASE_ASSERT(!::IsBadReadPtr(pMSG, pSZ), "Can`t Read!");
#define BASE_WRITE(pBUF, pSZ) BASE_ASSERT(!::IsBadWritePtr(pBUF, pSZ), "Can`t Write!");
#define BASE_STRINGA(pMSG, pSZ) BASE_ASSERT(!::IsBadStringPtrA(pMSG, pSZ) && ('\0' != pMSG[0]) && (::strlen(pMSG) <= (size_t)pSZ), "Invalid String!");
#define BASE_STRINGW(pMSG, pSZ) BASE_ASSERT(!::IsBadStringPtrW(pMSG, pSZ) && (L'\0' != pMSG[0]) && (::wcslen(pMSG) <= (size_t)pSZ), "Invalid String!");
#endif
#else // _DEBUG
#define BASE_DCRT_ON()
#define BASE_DCRT_OFF()
#define BASE_HEAP_CHECK()
#define BASE_HEAP_PTR(pPTR)
#define BASE_HEAP_LEAK()
#define BASE_READ(pMSG, pSZ)
#define BASE_WRITE(pBUF, pSZ)
#define BASE_STRINGA(pMSG, pSZ)
#define BASE_STRINGW(pMSG, pSZ)
#define BASE_CODE(pCODE)
#endif // _DEBUG
#if defined(_UNICODE)
#define BASE_STRING BASE_STRINGW
#else // _UNICODE
#define BASE_STRING BASE_STRINGA
#endif // _UNICODE
// <20>ݺ<EFBFBD><DDBA><EFBFBD> üũ <20><>ũ<EFBFBD><C5A9> <20>Լ<EFBFBD><D4BC><EFBFBD>
#if defined(_DEBUG)
#define _UNIQUE_VAR(pVAR) __XONLY__VAR__ ## pVAR
#define _WHILE(pCOND, pLIMIT, pVAR) \
INT _UNIQUE_VAR(pVAR) = pLIMIT+1; \
while((pCOND) && \
((--_UNIQUE_VAR(pVAR)>=0)?true:(_ASSERTE(!"Infinite loop!"),false)))
#define WHILE(pCOND, pLIMIT) \
_WHILE(pCOND, pLIMIT, __COUNTER__)
#define _FOR(pINIT, pCOND, pLOOP, pLIMIT, pVAR) \
INT _UNIQUE_VAR(pVAR) = pLIMIT+1; \
for (pINIT; \
((pCOND)&&((--_UNIQUE_VAR(pVAR)>=0)?true:(_ASSERTE(!"Infinite loop!"),false))); \
pLOOP)
#define FOR(pINIT, pCOND, pLOOP, pLIMIT) \
_FOR(pINIT, pCOND, pLOOP, pLIMIT, __COUNTER__)
#else // _DEBUG
#define WHILE(pCOND, pLIMIT) while((pCOND))
#define FOR(pINIT, pCOND, pLOOP, pLIMIT) for (pINIT; pCOND; pLOOP)
#endif // _DEBUG
#define WHILE_INFINITE for (;;)
// <20><>ü <20><><EFBFBD><EFBFBD>, <20><><EFBFBD>Թ<EFBFBD><D4B9><EFBFBD> <20><>ũ<EFBFBD>ε<EFBFBD> (<28><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>ٷ<EFBFBD><D9B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <20><>)
#define DISABLE_COPY_ASSIGN(pCLS) \
private: \
pCLS(const pCLS##&) \
{ \
BASE_ASSERT(0, "Don`t use Copy Constructor!"); \
} \
pCLS##& operator=(const pCLS##&) \
{ \
BASE_ASSERT(0, "Don`t use Assignment operator!"); \
return(*this); \
}
#define DISABLE_COPY_ASSIGN_DEFAULT(pCLS) \
public: \
pCLS() \
{ \
/*BASE_ASSERT(0, "Don`t use Default constructor!");*/ \
} \
private: \
pCLS(const pCLS##&) \
{ \
BASE_ASSERT(0, "Don`t use Copy constructor!"); \
} \
pCLS##& operator=(const pCLS##&) \
{ \
BASE_ASSERT(0, "Don`t use Assignment operator!"); \
return(*this); \
}
// <20><> <20><>ȯ, <20><><EFBFBD><EFBFBD>Ȯ<EFBFBD><C8AE> <20><><EFBFBD><EFBFBD> Ÿ<><C5B8>, <20><>ũ<EFBFBD><C5A9> <20>Լ<EFBFBD><D4BC><EFBFBD>
template<typename TDERV, typename TBASE>
class CCnvChker
{
private:
typedef char TP_SMALL;
typedef class { TP_SMALL DUM[2];} TP_BIG;
static TP_SMALL Test(TBASE);
static TP_BIG Test(...);
static TDERV MakeDerv();
public:
#pragma warning (disable:4244) //possible loss of data
enum {EV_ISCONV = (sizeof(Test(MakeDerv())) == sizeof(TP_SMALL))};
#pragma warning (default:4244)
enum {EV_ISSAME = false};
};
template<typename TDERV>
class CCnvChker<TDERV, TDERV>
{
public:
enum {EV_ISCONV = true};
enum {EV_ISSAME = true};
};
#define IS_SUPER_CLASS(pDERV, pBASE) \
(CCnvChker<const pDERV*, const pBASE*>::EV_ISCONV && !CCnvChker<const pDERV*, const void*>::EV_ISSAME)
#define IS_SAME_CLASS(pDERV, pBASE) \
(IS_SUPER_CLASS(pDERV, pBASE) && CCnvChker<const pDERV, const pBASE>::EV_ISSAME)
// <20><>Ÿ <20><>ũ<EFBFBD><C5A9> <20>Լ<EFBFBD><D4BC><EFBFBD>
#if defined(_DEBUG)
#if !defined(NEW)
//#define NEW ::new(_CLIENT_BLOCK, __FILE__, __LINE__) // new <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ڵ<EFBFBD><DAB5><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>µ<EFBFBD> (_CLIENT_BLOCK <20><> <20>Ҵ<EFBFBD> <20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 16<31><36>Ʈ<EFBFBD><C6AE> Client Block ID <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> ID<49><44><EFBFBD><EFBFBD> <20>޸𸮸<DEB8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ֵ<EFBFBD><D6B5><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>)
#define NEW ::new(_NORMAL_BLOCK, __FILE__, __LINE__) // new <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ڵ<EFBFBD><DAB5><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>µ<EFBFBD>
#endif // #if defined(NEW)
#define UNUSED(pVAL) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> RELEASE <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> C4100 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߻<EFBFBD><DFBB><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
#else // _DEBUG
#if !defined(NEW)
#define NEW ::new(std::nothrow)
#endif // #if defined(NEW)
#define UNUSED(pVAL) pVAL // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> RELEASE <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> C4100 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߻<EFBFBD><DFBB><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
#endif // _DEBUG
#define UNUSED_ALWAYS(pVAL) pVAL // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɼǰ<C9BC> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> C4100 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߻<EFBFBD><DFBB><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
///////////////////////////////////////////////////////////////////
// DECLARATION
///////////////////////////////////////////////////////////////////
//*---------------------------------------------------------------
// TYPE : CLASS
// NAME : CDebugSet
//*---------------------------------------------------------------
// DESC : System Base Library <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>޼<EFBFBD><DEBC><EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> static <20><><EFBFBD><EFBFBD> <20>޼<EFBFBD><DEBC><EFBFBD><EFBFBD><EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
class CDebugSet
{
public:
static VOID Trace(LPCTSTR lpszFormat, ...);
static VOID MessageBox(HWND hWnd, UINT uType, LPCTSTR lpszCaption, LPCTSTR lpszFormat, ...);
static VOID SetProgramName(LPTSTR lpszOutBuffer, INT nOutBufferSize, LPCTSTR lpszProgamName = NULL);
static LPCTSTR GetProgramName();
static LPCTSTR GetProgramPath();
#if defined(_DEBUG)
inline static INT CrtDbgReport(LPCSTR lpszFileName, INT iLineNo, LPCSTR lpszMsg, LPCSTR lpszReason);
#endif // _DEBUG
static size_t StrLenA(LPCSTR pStr, DWORD pStrSz);
static size_t StrLenW(LPCWSTR pStr, DWORD pStrSz);
static FILE* FOpenA(LPCSTR pPath, LPCSTR pMode);
static FILE* FOpenW(LPCWSTR pPath, LPCWSTR pMode);
static BOOL IsSpaceAllA(LPCSTR pMSG);
static BOOL IsSpaceAllW(LPCWSTR pMSG);
template<typename TTYPE>
static TTYPE TypeMax(const TTYPE /*pVar*/);
template<typename TTYPE>
static TTYPE TypeMin(const TTYPE /*pVar*/);
template<typename TTYPE>
static BOOL IsOverflow(const TTYPE pBase, const TTYPE pPlus);
template<typename TTYPE>
static BOOL IsUnderflow(const TTYPE pBase, const TTYPE pMinus);
template<typename TTYPE, typename TVAL>
static BOOL IsAssignable(const TTYPE /*pType*/, const TVAL pVal);
template<typename TTYPE, typename TVAL>
VOID Assign(TTYPE& pType, const TVAL pVal);
};
///////////////////////////////////////////////////////////////////
// IMPLEMENTATION
///////////////////////////////////////////////////////////////////
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CDebugSet::Trace
//*---------------------------------------------------------------
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> TRACE <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>޼<EFBFBD><DEBC><EFBFBD>
// PARM : 1 . lpszFormat - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
inline VOID CDebugSet::Trace(LPCTSTR lpszFormat, ...)
{
_ASSERTE(NULL != lpszFormat);
if (!CBaseSet::IsWindowStationVisible()) {
return;
}
TCHAR szBuffer[1024];
va_list szArgs;
va_start(szArgs, lpszFormat);
#if (_MSC_VER >= 1400) // VS.NET 2005 <20>̻<EFBFBD>
_vsntprintf_s(szBuffer, COUNT_OF(szBuffer), _TRUNCATE, lpszFormat, szArgs);
#else // #if (_MSC_VER >= 1400)
#pragma warning (disable:4995)
_vsntprintf(szBuffer, COUNT_OF(szBuffer), lpszFormat, szArgs);
#pragma warning (default:4995)
#endif // #if (_MSC_VER >= 1400)
va_end(szArgs);
::OutputDebugString(szBuffer);
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CDebugSet::MessageBox
//*---------------------------------------------------------------
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޽<EFBFBD><DEBD><EFBFBD> <20>ڽ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>޼<EFBFBD><DEBC><EFBFBD>
// PARM : 1 . hWnd - ǥ<><C7A5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڵ<EFBFBD>
// 2 . uType - <20><><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD>
// 3 . lpszCaption - Ÿ<><C5B8>Ʋ
// 4 . lpszFormat - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
inline VOID CDebugSet::MessageBox(HWND hWnd, UINT uType, LPCTSTR lpszCaption, LPCTSTR lpszFormat, ...)
{
_ASSERTE(NULL != lpszCaption);
_ASSERTE(NULL != lpszFormat);
if (!CBaseSet::IsWindowStationVisible()) {
return;
}
TCHAR szBuffer[1024];
va_list szArgs;
va_start(szArgs, lpszFormat);
#if (_MSC_VER >= 1400) // VS.NET 2005 <20>̻<EFBFBD>
_vsntprintf_s(szBuffer, COUNT_OF(szBuffer), _TRUNCATE, lpszFormat, szArgs);
#else // #if (_MSC_VER >= 1400)
#pragma warning (disable:4995)
_vsntprintf(szBuffer, COUNT_OF(szBuffer), lpszFormat, szArgs);
#pragma warning (default:4995)
#endif // #if (_MSC_VER >= 1400)
va_end(szArgs);
::MessageBox(hWnd, szBuffer, lpszCaption, uType | MB_SERVICE_NOTIFICATION);
}
#if defined(_DEBUG)
inline INT CDebugSet::CrtDbgReport(LPCSTR lpszFileName, INT iLineNo, LPCSTR lpszMsg, LPCSTR lpszReason)
{
_ASSERTE(NULL != lpszFileName);
_ASSERTE(NULL != lpszMsg);
_ASSERTE(NULL != lpszReason);
return(::_CrtDbgReport(_CRT_ERROR, lpszFileName, iLineNo, NULL, "%s\n(Reason:%s)", lpszMsg, lpszReason));
}
#endif // _DEBUG
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CDebugSet::SetProgramName
//*---------------------------------------------------------------
// DESC : <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>λ簡 <20>Ǵ<EFBFBD> <20><><EFBFBD>α׷<CEB1> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// PARM : 1 . lpszOutBuffer - <20><><EFBFBD>α׷<CEB1> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// 2 . nOutBufferSize - <20><><EFBFBD>α׷<CEB1> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<><C5A9>
// 3 . lpszProgamName - <20><><EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD> <20><><EFBFBD>Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>α׷<CEB1> <20≯<EFBFBD>
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
inline VOID CDebugSet::SetProgramName(LPTSTR lpszOutBuffer, INT nOutBufferSize, LPCTSTR lpszProgamName)
{
if (!lpszProgamName) {
TCHAR szDrive[MAX_PATH], szDir[MAX_PATH], szFileName[MAX_PATH], szFileExt[MAX_PATH];
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD>
::GetModuleFileName(NULL, lpszOutBuffer, nOutBufferSize);
#if (_MSC_VER >= 1400) // VS.NET 2005 <20>̻<EFBFBD>
_tsplitpath_s(lpszOutBuffer, szDrive, szDir, szFileName, szFileExt);
_tcsncpy_s(lpszOutBuffer, nOutBufferSize, szFileName, _TRUNCATE);
#else // #if (_MSC_VER >= 1400)
_tsplitpath(lpszOutBuffer, szDrive, szDir, szFileName, szFileExt);
_tcsncpy(lpszOutBuffer, szFileName, nOutBufferSize);
#endif // #if (_MSC_VER >= 1400)
}
else {
#if (_MSC_VER >= 1400) // VS.NET 2005 <20>̻<EFBFBD>
_tcsncpy_s(lpszOutBuffer, nOutBufferSize, lpszProgamName, _TRUNCATE);
#else // #if (_MSC_VER >= 1400)
_tcsncpy(lpszOutBuffer, lpszProgamName, nOutBufferSize);
#endif // #if (_MSC_VER >= 1400)
}
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CDebugSet::GetProgramName
//*---------------------------------------------------------------
// DESC : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>α׷<CEB1><D7B7><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><>ȯ
// PARM : N/A
// RETV : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>α׷<CEB1><D7B7><EFBFBD> <20≯<EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
inline LPCTSTR CDebugSet::GetProgramName()
{
static TCHAR szProgramName[MAX_PATH] = { _T('\0'), };
if (_T('\0') == szProgramName[0]) {
TCHAR szDrive[MAX_PATH], szDir[MAX_PATH], szFileName[MAX_PATH], szFileExt[MAX_PATH];
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD>
::GetModuleFileName(NULL, szProgramName, COUNT_OF(szProgramName));
#if (_MSC_VER >= 1400) // VS.NET 2005 <20>̻<EFBFBD>
_tsplitpath_s(szProgramName, szDrive, szDir, szFileName, szFileExt);
_tcsncpy_s(szProgramName, COUNT_OF(szProgramName), szFileName, _TRUNCATE);
#else // #if (_MSC_VER >= 1400)
_tsplitpath(szProgramName, szDrive, szDir, szFileName, szFileExt);
_tcsncpy(szProgramName, szFileName, COUNT_OF(szProgramName));
#endif // #if (_MSC_VER >= 1400)
}
return szProgramName;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CDebugSet::GetProgramPath
//*---------------------------------------------------------------
// DESC : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>α׷<CEB1><D7B7><EFBFBD> <20><><EFBFBD>θ<EFBFBD> <20><>ȯ
// PARM : N/A
// RETV : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>α׷<CEB1><D7B7><EFBFBD> <20><><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
inline LPCTSTR CDebugSet::GetProgramPath()
{
static TCHAR szProgramPath[MAX_PATH] = { _T('\0'), };
if (_T('\0') == szProgramPath[0]) {
TCHAR szDrive[MAX_PATH], szDir[MAX_PATH], szFileName[MAX_PATH], szFileExt[MAX_PATH];
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD>
::GetModuleFileName(NULL, szProgramPath, COUNT_OF(szProgramPath));
#if (_MSC_VER >= 1400) // VS.NET 2005 <20>̻<EFBFBD>
_tsplitpath_s(szProgramPath, szDrive, szDir, szFileName, szFileExt);
_sntprintf_s(szProgramPath, COUNT_OF(szProgramPath), _T("%s%s"), szDrive, szDir);
#else // #if (_MSC_VER >= 1400)
_tsplitpath(szProgramPath, szDrive, szDir, szFileName, szFileExt);
#pragma warning(disable:4995)
_sntprintf(szProgramPath, _T("%s%s"), szDrive, szDir);
#pragma warning(default:4995)
#endif // #if (_MSC_VER >= 1400)
}
return szProgramPath;
}
#if defined(_DEBUG)
inline size_t CDebugSet::StrLenA(LPCSTR pStr, DWORD pStrSz)
{
// <20><><EFBFBD>̰<EFBFBD> 0<>ΰ<EFBFBD><CEB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>.
size_t aRv = 0;
if ('\0' != *pStr)
{
if (!SUCCEEDED(::StringCchLengthA(pStr, ((STRSAFE_MAX_CCH<pStrSz)? STRSAFE_MAX_CCH:pStrSz), &aRv)))
{
BASE_ASSERT(0, "Invalid String!");
}
}
return(aRv);
}
inline size_t CDebugSet::StrLenW(LPCWSTR pStr, DWORD pStrSz)
{
// <20><><EFBFBD>̰<EFBFBD> 0<>ΰ<EFBFBD><CEB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>.
size_t aRv = 0;
if (L'\0' != *pStr)
{
if (!SUCCEEDED(::StringCchLengthW(pStr, ((STRSAFE_MAX_CCH<pStrSz)? STRSAFE_MAX_CCH:pStrSz), &aRv)))
{
BASE_ASSERT(0, "Invalid String!");
}
}
return(aRv);
}
inline FILE* CDebugSet::FOpenA(LPCSTR pPath, LPCSTR pMode)
{
#if (_MSC_VER >= 1400) // VS.NET 2005 <20>̻<EFBFBD>
FILE* aFp = NULL;
::fopen_s(&aFp, pPath, pMode);
return(aFp);
#else // #if (_MSC_VER >= 1400)
return(::fopen(pPath, pMode));
#endif // #if (_MSC_VER >= 1400)
}
inline FILE* CDebugSet::FOpenW(LPCWSTR pPath, LPCWSTR pMode)
{
#if (_MSC_VER >= 1400) // VS.NET 2005 <20>̻<EFBFBD>
FILE* aFp = NULL;
::_wfopen_s(&aFp, pPath, pMode);
return(aFp);
#else // #if (_MSC_VER >= 1400)
return(::_wfopen(pPath, pMode));
#endif // #if (_MSC_VER >= 1400)
}
#endif // _DEBUG
inline BOOL CDebugSet::IsSpaceAllA(LPCSTR pMSG)
{
BASE_ASSERT(NULL != pMSG, "Invalid!");
while('\0' != (*pMSG))
{
if (!::isspace((*pMSG++)&0xFF)) // 0xFF => DCRT <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> assert <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
return FALSE;
}
}
return TRUE;
}
inline BOOL CDebugSet::IsSpaceAllW(LPCWSTR pMSG)
{
BASE_ASSERT(NULL != pMSG, "Invalid!");
while(L'\0' != (*pMSG))
{
if (!::iswspace((*pMSG++)&0xFFFF)) // 0xFFFF => DCRT <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> assert <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
return FALSE;
}
}
return TRUE;
}
#if defined(max)
#undef max
#endif // max
#if defined(min)
#undef min
#endif // min
template<typename TTYPE>
inline TTYPE CDebugSet::TypeMax(const TTYPE /*pVar*/)
{
return(std::numeric_limits<TTYPE>::max());
}
template<typename TTYPE>
inline TTYPE CDebugSet::TypeMin(const TTYPE /*pVar*/)
{
return(std::numeric_limits<TTYPE>::min());
}
template<typename TTYPE>
inline BOOL CDebugSet::IsOverflow(const TTYPE pBase, const TTYPE pPlus)
{
// BASE_ASSERT(0 <= pPlus, "Invalid parameter!");
return((pPlus <= 0)? FALSE:((pBase+pPlus)<pBase));
}
template<typename TTYPE>
inline BOOL CDebugSet::IsUnderflow(const TTYPE pBase, const TTYPE pMinus)
{
// BASE_ASSERT(0 <= pMinus, "Invalid parameter!"); //pMinus<75><73> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̴<EFBFBD>.
return((pMinus <= 0)? FALSE:(pBase<(pBase-pMinus)));
}
template<typename TTYPE, typename TVAL>
inline BOOL CDebugSet::IsAssignable(const TTYPE /*pType*/, const TVAL pVal)
{
// singed<65><64> unsinged<65><64> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߻<EFBFBD><DFBB>ϹǷ<CFB9> <20>Ҵ<EFBFBD><D2B4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ϲ<EFBFBD><CFB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> INT64<36><34> <20>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ذ<EFBFBD><D8B0><EFBFBD> <20><> <20><>
return((std::numeric_limits<TTYPE>::min() <= static_cast<INT64>(pVal)) &&
(static_cast<INT64>(pVal) <= std::numeric_limits<TTYPE>::max()));
}
template<typename TTYPE, typename TVAL>
inline VOID CDebugSet::Assign(TTYPE& pType, const TVAL pVal)
{
BASE_ASSERT(IsAssignable(pType, pVal), "Invalid!");
pType = static_cast<TTYPE>(pVal);
}