#ifndef _SP_COMM_H__ #define _SP_COMM_H__ #define _CRTDBG_MAP_ALLOC #include #ifdef _WIN32 #include #endif //_WIN32 #include #include #include #include "SpBase.h" namespace SP { struct MachineFormat { enum Site { CMB_UNKNOWN, CMB_LIB, /** 行内大堂*/ CMB_SSB, /** 自助网点*/ CMB_LSS, /** 生活销售机*/ CMB_FLB, /** 离行机器*/ CMB_OSB, /** 外拓PAD*/ CMB_SMM /** 商户终端*/ }; #define SITE_ENUM_TYPE(MACRO) \ MACRO(LIB)\ MACRO(SSB)\ MACRO(LSS)\ MACRO(FLB)\ MACRO(OSB)\ MACRO(SMM) #define ENUM_MAP_CONVERT(elem) \ if (stricmp(lpcszSiteName, "CMB."#elem) == 0) return CMB_##elem; /*! * convert cmb site name to enum type. */ static Site Str2Site(LPCSTR lpcszSiteName) { if (lpcszSiteName == NULL || strlen(lpcszSiteName) == 0) return CMB_UNKNOWN; SITE_ENUM_TYPE(ENUM_MAP_CONVERT) return CMB_UNKNOWN; } #undef ENUM_MAP_CONVERT #define ENUM_MAP_CONVERT(elem) case CMB_##elem: return "CMB."#elem; static LPCSTR Site2Str(Site site) { switch (site) { SITE_ENUM_TYPE(ENUM_MAP_CONVERT) default: break; } return "Unkown"; } enum What { RVC_UNKNOWN, RVC_Stand2S, /** 落地式大机*/ RVC_PAD, /** PAD*/ RVC_Desk2S, /** 低柜双屏*/ RVC_IL, /** 简版*/ RVC_Desk1S, /** 低柜一体机*/ RPM_Stand1S /** 扩展柜*/ }; #define MACHINE_ENUM_TYPE(MACRO) \ MACRO(Stand2S)\ MACRO(PAD)\ MACRO(Desk2S)\ MACRO(IL)\ MACRO(Desk1S) #undef ENUM_MAP_CONVERT #define ENUM_MAP_CONVERT(elem) \ if (stricmp(lpcszTypeName, "RVC."#elem) == 0) return RVC_##elem; /*! * convert cmb site name to enum type. */ static What Str2Type(LPCSTR lpcszTypeName) { if (lpcszTypeName == NULL || strlen(lpcszTypeName) == 0) return RVC_UNKNOWN; MACHINE_ENUM_TYPE(ENUM_MAP_CONVERT) if (stricmp(lpcszTypeName, "RPM.Stand1S") == 0) return RPM_Stand1S; return RVC_UNKNOWN; } #undef ENUM_MAP_CONVERT #define ENUM_MAP_CONVERT(elem) case RVC_##elem: return "RVC."#elem; static LPCSTR Type2Str(What what) { switch (what) { MACHINE_ENUM_TYPE(ENUM_MAP_CONVERT) default: break; } if (what == RPM_Stand1S) return "RPM.Stand1S"; return "Unkown"; } }; /** Leak Detector*/ namespace Perf { struct LeakDetector { LeakDetector() { #if defined(_WIN32) && ( defined(_DEBUG) || defined(DEBUG)) int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); flag |= _CRTDBG_LEAK_CHECK_DF; flag |= _CRTDBG_ALLOC_MEM_DF; _CrtSetDbgFlag(flag); #endif //defined(_WIN32) && ( defined(_DEBUG) || defined(DEBUG)) } ~LeakDetector() { } }; struct LineLeakDetector { LineLeakDetector() { #if defined(_WIN32) && ( defined(_DEBUG) || defined(DEBUG)) _CrtMemCheckpoint(&s1); #endif //defined(_WIN32) && ( defined(_DEBUG) || defined(DEBUG)) } ~LineLeakDetector() { #if defined(_WIN32) && ( defined(_DEBUG) || defined(DEBUG)) _CrtMemCheckpoint(&s2); if (_CrtMemDifference(&s3, &s1, &s2)) _CrtMemDumpStatistics(&s3); //_CrtDumpMemoryLeaks(); #endif //defined(_WIN32) && ( defined(_DEBUG) || defined(DEBUG)) } #if defined(_WIN32) && ( defined(_DEBUG) || defined(DEBUG)) _CrtMemState s1, s2, s3; #endif //defined(_WIN32) && ( defined(_DEBUG) || defined(DEBUG)) }; } namespace Detail { struct SourceLineInfo { SourceLineInfo() :file(""), line(0){/*empty*/} SourceLineInfo(char const* file, std::size_t line) :file(file), line(line){/*empty*/} SourceLineInfo(SourceLineInfo const& rhs) = default; SourceLineInfo(SourceLineInfo&& rhs) = default; SourceLineInfo& operator = (SourceLineInfo const& rhs) = default; SourceLineInfo& operator =(SourceLineInfo&& rhs) = default; bool operator == (SourceLineInfo const& rhs) const { return line < rhs.line || (line == rhs.line && (std::strcmp(file, rhs.file) < 0)); } bool operator < (SourceLineInfo const& rhs) const { return line == rhs.line && (file == rhs.file || std::strcmp(file, rhs.file) == 0); } const std::string ToString() const { std::ostringstream oss; oss << "file: {" << _GetFileName(file) << "} ,line: {" << line << "}"; return oss.str(); } char const* file; std::size_t line; }; inline std::ostream& operator << (std::ostream& os, SourceLineInfo const& info) { os << info.file << '(' << info.line << ')'; return os; } } } #define SP_INTERNAL_LINEINFO ::SP::Detail::SourceLineInfo( __FILE__, static_cast( __LINE__ ) ) #endif // _SP_COMM_H__