CmdHelper.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. #pragma once
  2. #include <vector>
  3. #include <map>
  4. #include <string>
  5. #include <algorithm>
  6. template <typename char_t>
  7. class CmdHelper
  8. {
  9. typedef std::vector<std::basic_string<char_t>> MODE_VEC;
  10. typedef std::pair<std::basic_string<char_t>, std::basic_string<char_t>> CMD_PAIR;
  11. typedef std::map<std::basic_string<char_t>, std::basic_string<char_t>> CMD_MAP;
  12. public:
  13. CmdHelper();
  14. virtual ~CmdHelper();
  15. virtual int initialize(int argc, char_t* argv[]);
  16. virtual void setModeTag(char_t tag);
  17. virtual void setCmdTag(char_t tag);
  18. virtual void setCaseSensitive(bool sensitive);
  19. virtual bool hasMode(const char_t* szMode);
  20. virtual bool hasCmd(const char_t* szCmd);
  21. virtual int getCmdValue(const char_t* szCmd, std::basic_string<char_t>& tcsValue);
  22. protected:
  23. virtual bool isModeKey(const char_t* szMode);
  24. virtual bool isCmdKey(const char_t* szCmd);
  25. virtual typename CmdHelper<char_t>::MODE_VEC::iterator getMode(const char_t* szCmd);
  26. virtual typename CmdHelper<char_t>::CMD_MAP::iterator getCmd(const char_t* szCmd);
  27. protected:
  28. MODE_VEC m_modeVec;
  29. CMD_MAP m_cmdMap;
  30. char_t m_modeTag;
  31. char_t m_cmdTag;
  32. bool m_caseSensitive;
  33. };
  34. template <typename char_t>
  35. CmdHelper<char_t>::CmdHelper()
  36. : m_modeTag('/')
  37. , m_cmdTag('-')
  38. , m_caseSensitive(false)
  39. {
  40. }
  41. template <typename char_t>
  42. CmdHelper<char_t>::~CmdHelper()
  43. {
  44. }
  45. template <typename char_t>
  46. int CmdHelper<char_t>::initialize(int argc, char_t* argv[])
  47. {
  48. int ret = 0;
  49. m_modeVec.clear();
  50. m_cmdMap.clear();
  51. for (int i = 1; i < argc; i++)
  52. {
  53. if (isModeKey(argv[i]))
  54. {
  55. m_modeVec.push_back(argv[i]);
  56. }
  57. else if (isCmdKey(argv[i]))
  58. {
  59. if ((i + 1 < argc) && !isCmdKey(argv[i + 1]))
  60. {
  61. m_cmdMap.insert(CMD_PAIR(argv[i], argv[i + 1]));
  62. i++;
  63. }
  64. else
  65. {
  66. std::basic_string<char_t> strEmpty;
  67. m_cmdMap.insert(CMD_PAIR(argv[i], strEmpty));
  68. }
  69. }
  70. }
  71. return ret;
  72. }
  73. template <typename char_t>
  74. void CmdHelper<char_t>::setModeTag(char_t tag)
  75. {
  76. m_modeTag = tag;
  77. }
  78. template <typename char_t>
  79. void CmdHelper<char_t>::setCmdTag(char_t tag)
  80. {
  81. m_cmdTag = tag;
  82. }
  83. template <typename char_t>
  84. void CmdHelper<char_t>::setCaseSensitive(bool sensitive)
  85. {
  86. m_caseSensitive = sensitive;
  87. }
  88. template <typename char_t>
  89. bool CmdHelper<char_t>::hasMode(const char_t* szMode)
  90. {
  91. typename MODE_VEC::iterator iter = getMode(szMode);
  92. return iter != m_modeVec.end();
  93. }
  94. template <typename char_t>
  95. bool CmdHelper<char_t>::hasCmd(const char_t* szCmd)
  96. {
  97. typename CMD_MAP::iterator iter = getCmd(szCmd);
  98. return iter != m_cmdMap.end();
  99. }
  100. template <typename char_t>
  101. int CmdHelper<char_t>::getCmdValue(const char_t* szCmd, std::basic_string<char_t>& tcsValue)
  102. {
  103. typename CMD_MAP::iterator iter = getCmd(szCmd);
  104. if (iter == m_cmdMap.end())
  105. return -1;
  106. tcsValue = iter->second;
  107. return 0;
  108. }
  109. template <typename char_t>
  110. bool CmdHelper<char_t>::isModeKey(const char_t* szMode)
  111. {
  112. std::basic_string<char_t> tcsMode = szMode;
  113. return tcsMode.find(m_modeTag) != std::basic_string<char_t>::npos;
  114. }
  115. template <typename char_t>
  116. bool CmdHelper<char_t>::isCmdKey(const char_t* szCmd)
  117. {
  118. std::basic_string<char_t> tcsCmd = szCmd;
  119. if (tcsCmd.empty())
  120. return false;
  121. else
  122. return tcsCmd[0] == m_cmdTag;
  123. //return tcsCmd.find(m_cmdTag) != std::basic_string<char_t>::npos;
  124. }
  125. template <typename char_t>
  126. typename CmdHelper<char_t>::MODE_VEC::iterator CmdHelper<char_t>::getMode(const char_t* szMode)
  127. {
  128. typename CmdHelper<char_t>::MODE_VEC::iterator iter = m_modeVec.begin();
  129. for (; iter != m_modeVec.end(); iter++)
  130. {
  131. std::basic_string<char_t> tcsMode(*iter);
  132. std::basic_string<char_t> tcsTargetMode(szMode);
  133. if (!m_caseSensitive)
  134. {
  135. transform(tcsMode.begin(), tcsMode.end(), tcsMode.begin(), ::tolower);
  136. transform(tcsTargetMode.begin(), tcsTargetMode.end(), tcsTargetMode.begin(), ::tolower);
  137. }
  138. if (tcsMode.compare(tcsTargetMode) == 0)
  139. break;
  140. }
  141. return iter;
  142. }
  143. template <typename char_t>
  144. typename CmdHelper<char_t>::CMD_MAP::iterator CmdHelper<char_t>::getCmd(const char_t* szCmd)
  145. {
  146. typename CmdHelper<char_t>::CMD_MAP::iterator iter = m_cmdMap.begin();
  147. for (; iter != m_cmdMap.end(); iter++)
  148. {
  149. std::basic_string<char_t> tcsCmd(iter->first);
  150. std::basic_string<char_t> tcsTargetCmd(szCmd);
  151. if (!m_caseSensitive)
  152. {
  153. transform(tcsCmd.begin(), tcsCmd.end(), tcsCmd.begin(), ::tolower);
  154. transform(tcsTargetCmd.begin(), tcsTargetCmd.end(), tcsTargetCmd.begin(), ::tolower);
  155. }
  156. if (tcsCmd.compare(tcsTargetCmd) == 0)
  157. break;
  158. }
  159. return iter;
  160. }