SpComm.hpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. #ifndef _SP_COMM_H__
  2. #define _SP_COMM_H__
  3. #define _CRTDBG_MAP_ALLOC
  4. #include <stdlib.h>
  5. #ifdef _WIN32
  6. #include <crtdbg.h>
  7. #endif //_WIN32
  8. #include <cstring>
  9. #include <iostream>
  10. #include <sstream>
  11. #include "SpBase.h"
  12. namespace SP
  13. {
  14. struct MachineFormat
  15. {
  16. enum Site
  17. {
  18. CMB_UNKNOWN,
  19. CMB_LIB, /** 行内大堂*/
  20. CMB_SSB, /** 自助网点*/
  21. CMB_LSS, /** 生活销售机*/
  22. CMB_FLB, /** 离行机器*/
  23. CMB_OSB, /** 外拓PAD*/
  24. CMB_SMM /** 商户终端*/
  25. };
  26. #define SITE_ENUM_TYPE(MACRO) \
  27. MACRO(LIB)\
  28. MACRO(SSB)\
  29. MACRO(LSS)\
  30. MACRO(FLB)\
  31. MACRO(OSB)\
  32. MACRO(SMM)
  33. #define ENUM_MAP_CONVERT(elem) \
  34. if (stricmp(lpcszSiteName, "CMB."#elem) == 0) return CMB_##elem;
  35. /*!
  36. * convert cmb site name to enum type.
  37. */
  38. static Site Str2Site(LPCSTR lpcszSiteName)
  39. {
  40. if (lpcszSiteName == NULL || strlen(lpcszSiteName) == 0)
  41. return CMB_UNKNOWN;
  42. SITE_ENUM_TYPE(ENUM_MAP_CONVERT)
  43. return CMB_UNKNOWN;
  44. }
  45. #undef ENUM_MAP_CONVERT
  46. #define ENUM_MAP_CONVERT(elem) case CMB_##elem: return "CMB."#elem;
  47. static LPCSTR Site2Str(Site site) {
  48. switch (site) {
  49. SITE_ENUM_TYPE(ENUM_MAP_CONVERT)
  50. default:
  51. break;
  52. }
  53. return "Unkown";
  54. }
  55. enum What
  56. {
  57. RVC_UNKNOWN,
  58. RVC_Stand2S, /** 落地式大机*/
  59. RVC_PAD, /** PAD*/
  60. RVC_Desk2S, /** 低柜双屏*/
  61. RVC_IL, /** 简版*/
  62. RVC_Desk1S, /** 低柜一体机*/
  63. RPM_Stand1S /** 扩展柜*/
  64. };
  65. #define MACHINE_ENUM_TYPE(MACRO) \
  66. MACRO(Stand2S)\
  67. MACRO(PAD)\
  68. MACRO(Desk2S)\
  69. MACRO(IL)\
  70. MACRO(Desk1S)
  71. #undef ENUM_MAP_CONVERT
  72. #define ENUM_MAP_CONVERT(elem) \
  73. if (stricmp(lpcszTypeName, "RVC."#elem) == 0) return RVC_##elem;
  74. /*!
  75. * convert cmb site name to enum type.
  76. */
  77. static What Str2Type(LPCSTR lpcszTypeName)
  78. {
  79. if (lpcszTypeName == NULL || strlen(lpcszTypeName) == 0)
  80. return RVC_UNKNOWN;
  81. MACHINE_ENUM_TYPE(ENUM_MAP_CONVERT)
  82. if (stricmp(lpcszTypeName, "RPM.Stand1S") == 0)
  83. return RPM_Stand1S;
  84. return RVC_UNKNOWN;
  85. }
  86. #undef ENUM_MAP_CONVERT
  87. #define ENUM_MAP_CONVERT(elem) case RVC_##elem: return "RVC."#elem;
  88. static LPCSTR Type2Str(What what) {
  89. switch (what) {
  90. MACHINE_ENUM_TYPE(ENUM_MAP_CONVERT)
  91. default:
  92. break;
  93. }
  94. if (what == RPM_Stand1S)
  95. return "RPM.Stand1S";
  96. return "Unkown";
  97. }
  98. };
  99. /** Leak Detector*/
  100. namespace Perf
  101. {
  102. struct LeakDetector
  103. {
  104. LeakDetector()
  105. {
  106. #if defined(_WIN32) && ( defined(_DEBUG) || defined(DEBUG))
  107. int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
  108. flag |= _CRTDBG_LEAK_CHECK_DF;
  109. flag |= _CRTDBG_ALLOC_MEM_DF;
  110. _CrtSetDbgFlag(flag);
  111. #endif //defined(_WIN32) && ( defined(_DEBUG) || defined(DEBUG))
  112. }
  113. ~LeakDetector()
  114. {
  115. }
  116. };
  117. struct LineLeakDetector
  118. {
  119. LineLeakDetector() {
  120. #if defined(_WIN32) && ( defined(_DEBUG) || defined(DEBUG))
  121. _CrtMemCheckpoint(&s1);
  122. #endif //defined(_WIN32) && ( defined(_DEBUG) || defined(DEBUG))
  123. }
  124. ~LineLeakDetector()
  125. {
  126. #if defined(_WIN32) && ( defined(_DEBUG) || defined(DEBUG))
  127. _CrtMemCheckpoint(&s2);
  128. if (_CrtMemDifference(&s3, &s1, &s2))
  129. _CrtMemDumpStatistics(&s3);
  130. //_CrtDumpMemoryLeaks();
  131. #endif //defined(_WIN32) && ( defined(_DEBUG) || defined(DEBUG))
  132. }
  133. #if defined(_WIN32) && ( defined(_DEBUG) || defined(DEBUG))
  134. _CrtMemState s1, s2, s3;
  135. #endif //defined(_WIN32) && ( defined(_DEBUG) || defined(DEBUG))
  136. };
  137. }
  138. namespace Detail {
  139. struct SourceLineInfo {
  140. SourceLineInfo() :file(""), line(0){/*empty*/}
  141. SourceLineInfo(char const* file, std::size_t line) :file(file), line(line){/*empty*/}
  142. SourceLineInfo(SourceLineInfo const& rhs) = default;
  143. SourceLineInfo(SourceLineInfo&& rhs) = default;
  144. SourceLineInfo& operator = (SourceLineInfo const& rhs) = default;
  145. SourceLineInfo& operator =(SourceLineInfo&& rhs) = default;
  146. bool operator == (SourceLineInfo const& rhs) const {
  147. return line < rhs.line || (line == rhs.line && (std::strcmp(file, rhs.file) < 0));
  148. }
  149. bool operator < (SourceLineInfo const& rhs) const {
  150. return line == rhs.line && (file == rhs.file || std::strcmp(file, rhs.file) == 0);
  151. }
  152. const std::string ToString() const {
  153. std::ostringstream oss;
  154. oss << "file: {" << _GetFileName(file) << "} ,line: {" << line << "}";
  155. return oss.str();
  156. }
  157. char const* file;
  158. std::size_t line;
  159. };
  160. inline std::ostream& operator << (std::ostream& os, SourceLineInfo const& info)
  161. {
  162. os << info.file << '(' << info.line << ')';
  163. return os;
  164. }
  165. }
  166. }
  167. #define SP_INTERNAL_LINEINFO ::SP::Detail::SourceLineInfo( __FILE__, static_cast<std::size_t>( __LINE__ ) )
  168. #endif // _SP_COMM_H__