KrisLibrary  1.0.0
CommandLine.h
1 #ifndef COMMAND_LINE_H
2 #define COMMAND_LINE_H
3 
4 #include <vector>
5 #include <sstream>
6 
7 namespace CommandLine {
8 
9 enum BasicType { None,Bool,Int,Float,Double,String };
10 
11 struct CommandArg
12 {
13  CommandArg() : type(None),name(NULL),data(NULL) {}
14  CommandArg(BasicType type_input,const char* name_input,void* data_input)
15  :type(type_input),name(name_input),data(data_input) {}
16 
17  BasicType type;
18  const char* name;
19  void* data;
20 };
21 
23 {
24  CommandBase() :line(NULL) {}
25  virtual ~CommandBase() {}
26  void AddBoolArg(const char* name, bool& val);
27  void AddIntArg(const char* name, int& val);
28  void AddFloatArg(const char* name, float& val);
29  void AddDoubleArg(const char* name, double& val);
30  void AddStringArg(const char* name, const char*& val);
31  const char* GetArgName(int arg) const { return args[arg].name; }
32 
33  virtual const char* Name() = 0;
34  virtual void PrintDescription(std::ostream& out);
35  virtual void PrintDetailedDescription(std::ostream& out);
36  virtual const char* Description() { return "unknown function."; }
37  virtual size_t NumArgs() { return args.size(); }
38  virtual int MinInputs() { return 0; }
39  virtual int MaxInputs() { return 0; } //if < 0, possibly infinite }
40  virtual int NumOutputs() { return 0; } //can only be 0 or 1, for now
41  virtual bool ProcessLine();
42  virtual bool SetArg(int arg, const char* val);
43  virtual int Do() = 0; //return > 0 if success, <=0 on failure
44 
45  const char* GetInput(int i) const { return inputs[i]; }
46  const char* GetOutput(int i=1) { return outputs[i]; }
47  int NumInputs() const { return inputs.size(); }
48 
49  std::vector<const char*>* line; //the input line is divided into args,inputs,outputs
50  std::vector<const char*> inputs;
51  std::vector<const char*> outputs;
52  std::vector<CommandArg> args;
53 };
54 
55 
56 
57 struct CommandAuto : public CommandBase
58 {
59  CommandAuto(const char* name_input, const char* desc_input=NULL)
60  :name(name_input),desc(desc_input) {}
61  virtual ~CommandAuto() {}
62  virtual const char* Name() { return name; }
63  virtual const char* Description() { if(desc) return desc; else return CommandBase::Description(); }
64 
65  const char* name;
66  const char* desc;
67 };
68 
69 //T is assumed to have istream >> defined
70 template <class T>
72 {
73  CommandInputValue(const char* name_input, T* target_input)
74  :CommandAuto(name,": sets a value."),target(target_input) {}
75  virtual size_t NumArgs() { return 1; }
76  virtual bool SetArg(int arg, const char* val)
77  {
78  std::istringstream str;
79  str.str(val);
80  str >> *target;
81  if(!str)
82  return false;
83  return true;
84  }
85  virtual int Do() { return 1; }
86 
87  T* target;
88 };
89 
90 template <class T>
92 {
93  CommandSetValue(const char* name_input, T* target_input, const T& val_input)
94  :CommandAuto(name_input,": sets a value."),target(target_input),val(val_input) {}
95  virtual int Do()
96  {
97  *target = val;
98  return 1;
99  }
100 
101  T* target;
102  const T& val;
103 };
104 
105 void PrintUsage(const char* appName);
106 void PrintCommands(CommandBase* commands [], int numCommands);
107 int ReadArguments(CommandBase* commands [], int numCommands, int argc, const char** argv);
108 
109 } //namespace CommandLine
110 #endif
Definition: CommandLine.h:11
Definition: CommandLine.h:71
Definition: CommandLine.cpp:11
Definition: CommandLine.h:57
Definition: CommandLine.h:22
Definition: CommandLine.h:91