#ifndef COMMAND_LINE_ARGS_H #define COMMAND_LINE_ARGS_H /****************************************************************************** * Command-line parsing ******************************************************************************/ #include #include #include #include #include class CommandLineArgs { protected: std::map pairs; public: // Constructor CommandLineArgs(int argc, char **argv) { using namespace std; for (int i = 1; i < argc; i++) { string arg = argv[i]; if ((arg[0] != '-') || (arg[1] != '-')) { continue; } string::size_type pos; string key, val; if ((pos = arg.find( '=')) == string::npos) { key = string(arg, 2, arg.length() - 2); val = ""; } else { key = string(arg, 2, pos - 2); val = string(arg, pos + 1, arg.length() - 1); } pairs[key] = val; } } bool CheckCmdLineFlag(const char* arg_name) { using namespace std; map::iterator itr; if ((itr = pairs.find(arg_name)) != pairs.end()) { return true; } return false; } template void GetCmdLineArgument(const char *arg_name, T &val); int ParsedArgc() { return pairs.size(); } }; template void CommandLineArgs::GetCmdLineArgument(const char *arg_name, T &val) { using namespace std; map::iterator itr; if ((itr = pairs.find(arg_name)) != pairs.end()) { istringstream strstream(itr->second); strstream >> val; } } template <> void CommandLineArgs::GetCmdLineArgument(const char* arg_name, char* &val) { using namespace std; map::iterator itr; if ((itr = pairs.find(arg_name)) != pairs.end()) { string s = itr->second; val = (char*) malloc(sizeof(char) * (s.length() + 1)); std::strcpy(val, s.c_str()); } else { val = NULL; } } #endif //COMMAND_LINE_ARGS_H