Stan  2.5.0
probability, sampling & optimization
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
categorical_argument.hpp
Go to the documentation of this file.
1 #ifndef STAN__GM__ARGUMENTS__CATEGORY__ARGUMENT__BETA
2 #define STAN__GM__ARGUMENTS__CATEGORY__ARGUMENT__BETA
3 
4 #include <vector>
6 
7 namespace stan {
8 
9  namespace gm {
10 
12 
13  public:
14 
16  for (std::vector<argument*>::iterator it = _subarguments.begin();
17  it != _subarguments.end(); ++it) {
18  delete *it;
19  }
20 
21  _subarguments.clear();
22  }
23 
24  void print(std::ostream* s, const int depth, const std::string prefix) {
25  if (!s)
26  return;
27  std::string indent(compute_indent(depth), ' ');
28  *s << prefix << indent << _name << std::endl;
29 
30  for (std::vector<argument*>::iterator it = _subarguments.begin();
31  it != _subarguments.end(); ++it)
32  (*it)->print(s, depth + 1, prefix);
33  }
34 
35  void print_help(std::ostream* s, const int depth, const bool recurse) {
36 
37  if (!s)
38  return;
39 
40  std::string indent(indent_width * depth, ' ');
41  std::string subindent(indent_width, ' ');
42 
43  *s << indent << _name << std::endl;
44  *s << indent << subindent << _description << std::endl;
45  if (_subarguments.size() > 0) {
46  *s << indent << subindent << "Valid subarguments:";
47 
48  std::vector<argument*>::iterator it = _subarguments.begin();
49  *s << " " << (*it)->name();
50  ++it;
51 
52  for (; it != _subarguments.end(); ++it)
53  *s << ", " << (*it)->name();
54  *s << std::endl << std::endl;
55 
56  if (recurse) {
57  for (std::vector<argument*>::iterator it = _subarguments.begin();
58  it != _subarguments.end(); ++it)
59  (*it)->print_help(s, depth + 1, true);
60  }
61  }
62  else {
63  *s << std::endl;
64  }
65 
66  }
67 
68  bool parse_args(std::vector<std::string>& args, std::ostream* out,
69  std::ostream* err, bool& help_flag) {
70 
71  bool good_arg = true;
72  bool valid_arg = true;
73 
74  while(good_arg) {
75  if (args.size() == 0)
76  return valid_arg;
77 
78  good_arg = false;
79 
80  std::string cat_name = args.back();
81 
82  if (cat_name == "help") {
83  print_help(out, 0, false);
84  help_flag |= true;
85  args.clear();
86  return true;
87  } else if (cat_name == "help-all") {
88  print_help(out, 0, true);
89  help_flag |= true;
90  args.clear();
91  return true;
92  }
93 
94  std::string val_name;
95  std::string val;
96  split_arg(cat_name, val_name, val);
97 
98  if (_subarguments.size() == 0)
99  valid_arg = true;
100  for (std::vector<argument*>::iterator it = _subarguments.begin();
101  it != _subarguments.end(); ++it) {
102  if ( (*it)->name() == cat_name) {
103  args.pop_back();
104  valid_arg &= (*it)->parse_args(args, out, err, help_flag);
105  good_arg = true;
106  break;
107  } else if ( (*it)->name() == val_name ) {
108  valid_arg &= (*it)->parse_args(args, out, err, help_flag);
109  good_arg = true;
110  break;
111  } else {
112  good_arg = false;
113  }
114  }
115  }
116  return valid_arg;
117  };
118 
119  virtual void probe_args(argument* base_arg, std::stringstream& s) {
120  for (std::vector<argument*>::iterator it = _subarguments.begin();
121  it != _subarguments.end(); ++it) {
122  (*it)->probe_args(base_arg, s);
123  }
124  }
125 
126  void find_arg(std::string name,
127  std::string prefix,
128  std::vector<std::string>& valid_paths) {
129 
130  argument::find_arg(name, prefix, valid_paths);
131 
132  prefix += _name + " ";
133  for (std::vector<argument*>::iterator it = _subarguments.begin();
134  it != _subarguments.end(); ++it)
135  (*it)->find_arg(name, prefix, valid_paths);
136 
137  }
138 
139  std::vector<argument*>& subarguments() {
140  return _subarguments;
141  }
142 
143  argument* arg(const std::string name) {
144  for (std::vector<argument*>::iterator it = _subarguments.begin();
145  it != _subarguments.end(); ++it)
146  if ( name == (*it)->name() )
147  return (*it);
148  return 0;
149  }
150 
151  protected:
152 
153  std::vector<argument*> _subarguments;
154 
155  };
156 
157  } // gm
158 
159 } // stan
160 
161 #endif
bool parse_args(std::vector< std::string > &args, std::ostream *out, std::ostream *err, bool &help_flag)
argument * arg(const std::string name)
virtual void probe_args(argument *base_arg, std::stringstream &s)
std::vector< argument * > _subarguments
virtual void find_arg(std::string name, std::string prefix, std::vector< std::string > &valid_paths)
Definition: argument.hpp:46
std::vector< argument * > & subarguments()
static void split_arg(const std::string &arg, std::string &name, std::string &value)
Definition: argument.hpp:54
int compute_indent(const int depth)
Definition: argument.hpp:71
void print_help(std::ostream *s, const int depth, const bool recurse)
void print(std::ostream *s, const int depth, const std::string prefix)
void find_arg(std::string name, std::string prefix, std::vector< std::string > &valid_paths)
std::string _name
Definition: argument.hpp:76
std::string name() const
Definition: argument.hpp:26
std::string _description
Definition: argument.hpp:77

     [ Stan Home Page ] © 2011–2014, Stan Development Team.