#ifndef _SP_COMM_H__ #define _SP_COMM_H__ #define _CRTDBG_MAP_ALLOC #include #ifdef RVC_OS_WIN #include #endif //RVC_OS_WIN #include #include #include #include "SpBase.h" namespace SP { //depecrated, to use defined at Module/include/CommEntityUtil.hpp struct MachineFormat { enum Site { CMB_UNKNOWN, CMB_LIB, /** 行内大堂*/ CMB_FLB, /** 离行机器*/ }; #define SITE_ENUM_TYPE(MACRO) \ MACRO(LIB)\ MACRO(FLB) #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_Stand1SPlus /** 单屏大机*/ }; #define MACHINE_ENUM_TYPE(MACRO) \ MACRO(Stand2S)\ MACRO(Stand1SPlus) #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) 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; } return "Unkown"; } }; /** Leak Detector*/ namespace Perf { struct LeakDetector { LeakDetector() { #if defined(RVC_OS_WIN) && defined(WITH_DEBUG) int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); flag |= _CRTDBG_LEAK_CHECK_DF; flag |= _CRTDBG_ALLOC_MEM_DF; _CrtSetDbgFlag(flag); #endif //defined(RVC_OS_WIN) && defined(WITH_DEBUG) } ~LeakDetector() { } }; struct LineLeakDetector { LineLeakDetector() { #if defined(RVC_OS_WIN) && defined(WITH_DEBUG) _CrtMemCheckpoint(&s1); #endif //defined(RVC_OS_WIN) && defined(WITH_DEBUG) } ~LineLeakDetector() { #if defined(RVC_OS_WIN) && defined(WITH_DEBUG) _CrtMemCheckpoint(&s2); if (_CrtMemDifference(&s3, &s1, &s2)) _CrtMemDumpStatistics(&s3); //_CrtDumpMemoryLeaks(); #endif //defined(RVC_OS_WIN) && defined(WITH_DEBUG) } #if defined(RVC_OS_WIN) && defined(WITH_DEBUG) _CrtMemState s1, s2, s3; #endif //defined(RVC_OS_WIN) && defined(WITH_DEBUG) }; } namespace Detail { struct SourceLineInfo { SourceLineInfo() :file(""), line(0){/*empty*/} SourceLineInfo(char const* file, std::size_t line) :file(file), line(line){/*empty*/} #if defined(_MSC_VER) #else SourceLineInfo(SourceLineInfo const& rhs) = default; SourceLineInfo(SourceLineInfo && rhs) = default; SourceLineInfo& operator = (SourceLineInfo const& rhs) = default; SourceLineInfo& operator =(SourceLineInfo && rhs) = default; #endif //_MSC_VER 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__ ) ) #ifdef RVC_OS_WIN #define SP_SLEEP(ms) Sleep(ms) #else #include #define SP_SLEEP(ms) usleep((ms) * 1000) #endif #ifndef ASSERT #include #define ASSERT assert #endif #endif // _SP_COMM_H__