b3CommandLineArgs.h 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #ifndef COMMAND_LINE_ARGS_H
  2. #define COMMAND_LINE_ARGS_H
  3. /******************************************************************************
  4. * Command-line parsing
  5. ******************************************************************************/
  6. #include <map>
  7. #include <algorithm>
  8. #include <string>
  9. #include <cstring>
  10. #include <sstream>
  11. class b3CommandLineArgs
  12. {
  13. protected:
  14. std::map<std::string, std::string> pairs;
  15. public:
  16. // Constructor
  17. b3CommandLineArgs(int argc, char **argv)
  18. {
  19. addArgs(argc, argv);
  20. }
  21. void addArgs(int argc, char **argv)
  22. {
  23. for (int i = 1; i < argc; i++)
  24. {
  25. std::string arg = argv[i];
  26. if ((arg.length() < 2) || (arg[0] != '-') || (arg[1] != '-'))
  27. {
  28. continue;
  29. }
  30. std::string::size_type pos;
  31. std::string key, val;
  32. if ((pos = arg.find('=')) == std::string::npos)
  33. {
  34. key = std::string(arg, 2, arg.length() - 2);
  35. val = "";
  36. }
  37. else
  38. {
  39. key = std::string(arg, 2, pos - 2);
  40. val = std::string(arg, pos + 1, arg.length() - 1);
  41. }
  42. //only add new keys, don't replace existing
  43. if (pairs.find(key) == pairs.end())
  44. {
  45. pairs[key] = val;
  46. }
  47. }
  48. }
  49. bool CheckCmdLineFlag(const char *arg_name)
  50. {
  51. std::map<std::string, std::string>::iterator itr;
  52. if ((itr = pairs.find(arg_name)) != pairs.end())
  53. {
  54. return true;
  55. }
  56. return false;
  57. }
  58. template <typename T>
  59. bool GetCmdLineArgument(const char *arg_name, T &val);
  60. int ParsedArgc()
  61. {
  62. return pairs.size();
  63. }
  64. };
  65. template <typename T>
  66. inline bool b3CommandLineArgs::GetCmdLineArgument(const char *arg_name, T &val)
  67. {
  68. std::map<std::string, std::string>::iterator itr;
  69. if ((itr = pairs.find(arg_name)) != pairs.end())
  70. {
  71. std::istringstream strstream(itr->second);
  72. strstream >> val;
  73. return true;
  74. }
  75. return false;
  76. }
  77. template <>
  78. inline bool b3CommandLineArgs::GetCmdLineArgument<char *>(const char *arg_name, char *&val)
  79. {
  80. std::map<std::string, std::string>::iterator itr;
  81. if ((itr = pairs.find(arg_name)) != pairs.end())
  82. {
  83. std::string s = itr->second;
  84. val = (char *)malloc(sizeof(char) * (s.length() + 1));
  85. std::strcpy(val, s.c_str());
  86. return true;
  87. }
  88. else
  89. {
  90. val = NULL;
  91. }
  92. return false;
  93. }
  94. #endif //COMMAND_LINE_ARGS_H