2
0

b3CommandLineArgs.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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. using namespace std;
  20. for (int i = 1; i < argc; i++)
  21. {
  22. string arg = argv[i];
  23. if ((arg[0] != '-') || (arg[1] != '-')) {
  24. continue;
  25. }
  26. string::size_type pos;
  27. string key, val;
  28. if ((pos = arg.find( '=')) == string::npos) {
  29. key = string(arg, 2, arg.length() - 2);
  30. val = "";
  31. } else {
  32. key = string(arg, 2, pos - 2);
  33. val = string(arg, pos + 1, arg.length() - 1);
  34. }
  35. pairs[key] = val;
  36. }
  37. }
  38. bool CheckCmdLineFlag(const char* arg_name)
  39. {
  40. using namespace std;
  41. map<string, string>::iterator itr;
  42. if ((itr = pairs.find(arg_name)) != pairs.end()) {
  43. return true;
  44. }
  45. return false;
  46. }
  47. template <typename T>
  48. void GetCmdLineArgument(const char *arg_name, T &val);
  49. int ParsedArgc()
  50. {
  51. return pairs.size();
  52. }
  53. };
  54. template <typename T>
  55. inline void b3CommandLineArgs::GetCmdLineArgument(const char *arg_name, T &val)
  56. {
  57. using namespace std;
  58. map<string, string>::iterator itr;
  59. if ((itr = pairs.find(arg_name)) != pairs.end()) {
  60. istringstream strstream(itr->second);
  61. strstream >> val;
  62. }
  63. }
  64. template <>
  65. inline void b3CommandLineArgs::GetCmdLineArgument<char*>(const char* arg_name, char* &val)
  66. {
  67. using namespace std;
  68. map<string, string>::iterator itr;
  69. if ((itr = pairs.find(arg_name)) != pairs.end()) {
  70. string s = itr->second;
  71. val = (char*) malloc(sizeof(char) * (s.length() + 1));
  72. std::strcpy(val, s.c_str());
  73. } else {
  74. val = NULL;
  75. }
  76. }
  77. #endif //COMMAND_LINE_ARGS_H