OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
CmdArguments.h
Go to the documentation of this file.
1 #ifndef __CMD_ARGUMENTS__
2 #define __CMD_ARGUMENTS__
3 
4 #include <map>
5 #include <string>
6 #include <iostream>
7 #include <sstream>
8 #include <set>
9 
10 #include "boost/smart_ptr.hpp"
11 #include "boost/algorithm/string.hpp"
12 #include "boost/utility/value_init.hpp"
13 
14 #include "Util/OptPilotException.h"
15 
26 class CmdArguments {
27 
28 public:
29 
30  CmdArguments(int argc, char **argv) {
31  addArguments(argc, argv);
32  }
33 
35  {}
36 
38  {}
39 
43  template<class T>
44  T getArg(const std::string name, bool isFatal = false) {
45  boost::value_initialized<T> value;
46  return getArg<T>(name, value, isFatal);
47  }
48 
59  template<class T>
60  T getArg(const std::string name, T default_value, bool isFatal = false) {
61  T value = default_value;
62  try {
63  value = this->arg<T>(name);
64  } catch(OptPilotException &e) {
65  if(isFatal) {
66  std::ostringstream exe;
67  exe << "Fatal: argument \"";
68  exe << name;
69  exe << "\" not found!";
70  throw OptPilotException("CmdArguments::getArg", exe.str());
71  } else {
72  if(warned_.count(name) == 0) {
73  std::ostringstream warn;
74  warn << "\033[01;35m";
75  warn << "Warning: argument \"";
76  warn << name;
77  warn << "\" not found! Using default value (";
78  warn << default_value;
79  warn << ").";
80  warn << "\e[0m" << std::endl;
81  std::cout << warn.str() << std::flush;
82  warned_.insert(name);
83  }
84  }
85  }
86 
87  return value;
88  }
89 
90  template <class T>
91  void addArgument(const std::string &name, const T &value) {
92  std::ostringstream oss;
93  oss << value;
94 
95  if (arguments_.find(name) != arguments_.end()) {
96  throw OptPilotException("CmdArguments::addArgument",
97  "Argument '" + name + "' exists");
98  }
99 
100  arguments_.insert(std::make_pair(name, oss.str()));
101  }
102 
103  template <class T>
104  void replaceArgument(const std::string &name, const T &value) {
105  std::ostringstream oss;
106  oss << value;
107 
108  if (arguments_.find(name) == arguments_.end()) {
109  arguments_.insert(std::make_pair(name, oss.str()));
110  return;
111  }
112 
113  arguments_.at(name) = oss.str();
114  }
115 
116  char** getArguments() const;
117  unsigned int getNumArguments() const {
118  return arguments_.size();
119  }
120  //template<>
121  //size_t getArg<size_t>(const std::string name, bool isFatal = false) {
122  //return getArg<size_t>(name, 0, isFatal);
123  //}
124 
125  //template<>
126  //int getArg<int>(const std::string name, bool isFatal = false) {
127  //return getArg<int>(name, 0, isFatal);
128  //}
129 
130  //template<>
131  //unsigned int getArg<unsigned int>(const std::string name, bool isFatal = false) {
132  //return getArg<unsigned int>(name, 0, isFatal);
133  //}
134 
135  //template<>
136  //std::string getArg<std::string>(const std::string name, bool isFatal = false) {
137  //return getArg<std::string>(name, "", isFatal);
138  //}
139 
140 private:
141 
143  std::map<std::string, std::string> arguments_;
144 
145  std::set<std::string> warned_;
146 
148  void addArguments(int argc, char **argv);
149 
151  void split(std::string &name, std::string &value, std::string arg);
152 
155  template<class T>
156  T arg(const std::string name) {
157  T t;
159  if(it != arguments_.end()) {
160  std::istringstream iss(arguments_[name]);
161  iss >> t;
162  return t;
163  } else {
164  throw OptPilotException("CmdArguments::getArg", "argument not found!");
165  }
166  }
167 };
168 
169 typedef boost::shared_ptr<CmdArguments> CmdArguments_t;
170 
171 #endif
constexpr double e
The value of .
Definition: Physics.h:40
Definition: rbendmap.h:8
CmdArguments(int argc, char **argv)
Definition: CmdArguments.h:30
boost::shared_ptr< CmdArguments > CmdArguments_t
Definition: CmdArguments.h:169
std::set< std::string > warned_
Definition: CmdArguments.h:145
T getArg(const std::string name, T default_value, bool isFatal=false)
Definition: CmdArguments.h:60
bool warn
Warn flag.
Definition: Options.cpp:10
T getArg(const std::string name, bool isFatal=false)
Definition: CmdArguments.h:44
void replaceArgument(const std::string &name, const T &value)
Definition: CmdArguments.h:104
T arg(const std::string name)
Definition: CmdArguments.h:156
void addArguments(int argc, char **argv)
parse user arguments
Definition: CmdArguments.cpp:3
Parsing command line arguments.
Definition: CmdArguments.h:26
void split(std::string &name, std::string &value, std::string arg)
helper to split string
std::map< std::string, std::string > arguments_
container for storing command line options
Definition: CmdArguments.h:143
const std::string name
char ** getArguments() const
unsigned int getNumArguments() const
Definition: CmdArguments.h:117
std::string::iterator iterator
Definition: MSLang.h:16
void addArgument(const std::string &name, const T &value)
Definition: CmdArguments.h:91
Inform & endl(Inform &inf)
Definition: Inform.cpp:42