Blame view

stim/parser/arguments.h 13.7 KB
2e73e7bc   David Mayerich   basic changes for...
1
2
  #ifndef STIM_ARGUMENTS
  #define STIM_ARGUMENTS
7a2d0012   David Mayerich   mirst1d updates
3
4
5
6
7
8
9
10
11
12
13
14
15
  
  #include <string>
  #include <vector>
  #include <iostream>
  #include <iomanip>
  #include <sstream>
  #include <iterator>
  #include <algorithm>
  
  #ifdef _WIN32
  #include <Windows.h>
  #endif
  
2e73e7bc   David Mayerich   basic changes for...
16
  namespace stim{
7a2d0012   David Mayerich   mirst1d updates
17
  
81e0d221   David Mayerich   separated executa...
18
  	class cmd_option
7a2d0012   David Mayerich   mirst1d updates
19
20
21
22
23
24
25
  	{
  	private:
  		bool ansi;
  
  		//argument name
  		std::string name;
  
904614c3   David Mayerich   added normalizati...
26
  		//description of the option
7a2d0012   David Mayerich   mirst1d updates
27
28
29
  		std::vector<std::string> desc;
  
  		//argument values
3b012a80   David Mayerich   added code for co...
30
31
  		std::vector<std::string> vals;
  
904614c3   David Mayerich   added normalizati...
32
33
34
35
  		//integral and numerical flags for each argument
  		std::vector<bool> integral;
  		std::vector<bool> numerical;
  
3b012a80   David Mayerich   added code for co...
36
37
38
39
  		//range or example
  		std::string range;
  
  		//flag is true when the argument is user-specified
7a2d0012   David Mayerich   mirst1d updates
40
41
  		bool flag;
  
904614c3   David Mayerich   added normalizati...
42
43
44
  		bool char_numerical(char c){
  			if( (c >= '0' && c <= '9') || c == '-' || c == '.')
  				return true;
963d0676   David Mayerich   bug fixes related...
45
  			return false;
904614c3   David Mayerich   added normalizati...
46
47
48
49
50
  		}
  
  		bool char_integral(char c){
  			if( (c >= '0' && c <= '9') || c == '-')
  				return true;
963d0676   David Mayerich   bug fixes related...
51
  			return false;
904614c3   David Mayerich   added normalizati...
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
  		}
  
  		/// Test if a given string contains a numerical (real) value
  		bool test_numerical(std::string v){
  			for(size_t i = 0; i < v.length(); i++){			//for each character in the string
  				if(!char_numerical(v[i]))
  					return false;
  			}
  			return true;
  		}
  
  		/// Test if a given string contains an integer value
  		bool test_integral(std::string v){
  			for(size_t i = 0; i < v.length(); i++){			//for each character in the string
  				if(!char_integral(v[i]))
  					return false;
  			}
  			return true;
  		}
  
7a2d0012   David Mayerich   mirst1d updates
72
73
  		void parse_val(const std::string &s){
  
3b012a80   David Mayerich   added code for co...
74
75
  			vals.clear();
  
7a2d0012   David Mayerich   mirst1d updates
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
  			std::stringstream ss(s);
  			std::string item;
  			while (std::getline(ss, item, ' ')) {
  				vals.push_back(item);
  			}
  		}
  
  		void parse_desc(const std::string &s){
  
  			desc.clear();
  
  			std::stringstream ss(s);
  			std::string item;
  			while (std::getline(ss, item, '\n')) {
  				desc.push_back(item);
  			}
  		}
  
3b012a80   David Mayerich   added code for co...
94
95
  	public:
  		void set_ansi(bool b){ ansi = b; }
81e0d221   David Mayerich   separated executa...
96
97
          //create an option with a given name, description, and default value
  		cmd_option(std::string _name, std::string _desc, std::string _default = "", std::string _range = "")
7a2d0012   David Mayerich   mirst1d updates
98
99
100
  		{
  			name = _name;
  			parse_desc(_desc);
3b012a80   David Mayerich   added code for co...
101
102
103
104
105
106
107
108
109
  			parse_val(_default);
  
  			//if a default value is provided, set the flag
  			if(_default != "")
                  flag = true;
              else flag = false;
  
  			range = _range;
  
7a2d0012   David Mayerich   mirst1d updates
110
  
3b012a80   David Mayerich   added code for co...
111
112
  		}
  
9d3ba0b1   David Mayerich   added stim::hsi a...
113
  		size_t nargs()
3b012a80   David Mayerich   added code for co...
114
115
116
117
  		{
              return vals.size();
          }
  
81e0d221   David Mayerich   separated executa...
118
  		//return the value of a text option
a2bf1d08   David Mayerich   general bug fixes...
119
  		std::string as_string(size_t n = 0)
3b012a80   David Mayerich   added code for co...
120
121
122
  		{
              if(!flag)
              {
81e0d221   David Mayerich   separated executa...
123
                  std::cout<<"ERROR - Option requested without being set: "<<name<<std::endl;
3b012a80   David Mayerich   added code for co...
124
125
126
127
128
129
130
131
132
                  exit(1);
              }
  
              if(vals.size() > n)
                  return vals[n];
  
              else return "";
  		}
  
81e0d221   David Mayerich   separated executa...
133
          //return the value of a floating point option
ba51ae6a   David Mayerich   fixed metric calc...
134
  		double as_float(size_t n = 0)
3b012a80   David Mayerich   added code for co...
135
136
137
  		{
              if(!flag)
              {
81e0d221   David Mayerich   separated executa...
138
                  std::cout<<"ERROR - option requested without being set: "<<name<<std::endl;
3b012a80   David Mayerich   added code for co...
139
140
141
142
143
144
                  exit(1);
              }
  
              if(vals.size() > n)
              {
                  float r;
2e73e7bc   David Mayerich   basic changes for...
145
                  if ( ! (std::istringstream(vals[n]) >> r) ) r = 0;
3b012a80   David Mayerich   added code for co...
146
147
148
149
150
151
                  return r;
              }
  
              else return 0;
  		}
  
81e0d221   David Mayerich   separated executa...
152
  		//return the value of an integer option
a2bf1d08   David Mayerich   general bug fixes...
153
  		int as_int(size_t n = 0)
3b012a80   David Mayerich   added code for co...
154
155
156
  		{
              if(!flag)
              {
81e0d221   David Mayerich   separated executa...
157
                  std::cout<<"ERROR - option requested without being set: "<<name<<std::endl;
3b012a80   David Mayerich   added code for co...
158
159
160
161
162
163
                  exit(1);
              }
  
              if(vals.size() > n)
              {
                  int r;
2e73e7bc   David Mayerich   basic changes for...
164
                  if ( ! (std::istringstream(vals[n]) >> r) ) r = 0;
3b012a80   David Mayerich   added code for co...
165
166
167
168
169
170
171
                  return r;
              }
  
              else return 0;
  		}
  
  		//get the width of the left column
9d3ba0b1   David Mayerich   added stim::hsi a...
172
  		size_t col_width()
3b012a80   David Mayerich   added code for co...
173
  		{
9d3ba0b1   David Mayerich   added stim::hsi a...
174
              size_t n = 3;
81e0d221   David Mayerich   separated executa...
175
              //add the length of the option name
3b012a80   David Mayerich   added code for co...
176
177
178
179
180
181
182
183
              n += name.size();
  
              //if there are any default parameters
              if(vals.size() > 0)
              {
                  //padding (parenthesis, =, etc.)
                  n += 6;
  
81e0d221   David Mayerich   separated executa...
184
                  //for each default option value
9d3ba0b1   David Mayerich   added stim::hsi a...
185
                  for(size_t v=0; v<vals.size(); v++)
3b012a80   David Mayerich   added code for co...
186
187
188
189
190
191
192
                      n += vals[v].size() + 1;
              }
  
              //add a buffer of 4 characters
              n += 4;
  
              return n;
7a2d0012   David Mayerich   mirst1d updates
193
194
195
196
  		}
  
  
  		//string output
9d3ba0b1   David Mayerich   added stim::hsi a...
197
  		std::string toStr(size_t width = 0)
7a2d0012   David Mayerich   mirst1d updates
198
  		{
3b012a80   David Mayerich   added code for co...
199
200
201
202
  			std::stringstream ss;
  
  			int color_size = 0;
  
7a2d0012   David Mayerich   mirst1d updates
203
204
205
206
  
  			//create the left column
  			std::string left_part = std::string(" --") + name;
  			if(vals.size() != 0)
3b012a80   David Mayerich   added code for co...
207
208
209
  			{
  				if(ansi)
  					left_part += "\033[1;32m";
7a2d0012   David Mayerich   mirst1d updates
210
  				left_part += " ( = ";
9d3ba0b1   David Mayerich   added stim::hsi a...
211
  				for(size_t v=0; v<vals.size(); v++)
7a2d0012   David Mayerich   mirst1d updates
212
  					left_part += vals[v] + std::string(" ");
3b012a80   David Mayerich   added code for co...
213
214
215
216
217
218
219
  				left_part += ")";
  				if(ansi)
  					left_part += "\033[0m";
  				if(ansi)
  					color_size = 11;
  			}
  			else
7a2d0012   David Mayerich   mirst1d updates
220
221
222
                  color_size = 0;
  
  			//if no width is passed, put 4 spaces between left and right columns
3b012a80   David Mayerich   added code for co...
223
  			if(width == 0) width = col_width();
7a2d0012   David Mayerich   mirst1d updates
224
225
226
227
  
  			ss<<std::left<<std::setw(width + color_size)<<left_part;
  
  			//output right column
9d3ba0b1   David Mayerich   added stim::hsi a...
228
  			for(size_t d=0; d<desc.size(); d++)
7a2d0012   David Mayerich   mirst1d updates
229
230
231
  			{
  				if(d == 0)
  					ss<<desc[0];
3b012a80   David Mayerich   added code for co...
232
  				else
0ef519a4   David Mayerich   optimized materia...
233
  					ss<<std::endl<<std::setfill(' ')<<std::setw(width)<<" "<<desc[d];
7a2d0012   David Mayerich   mirst1d updates
234
  
3b012a80   David Mayerich   added code for co...
235
236
237
238
  			}
  
  			//output the range in the right column
  			if(range != "" && ansi)
0ef519a4   David Mayerich   optimized materia...
239
                  ss<<std::endl<<std::setfill(' ')<<std::setw(width)<<" "<<"    "<<std::string("\033[1;36m") + range + "\033[0m";
7a2d0012   David Mayerich   mirst1d updates
240
  			else if(range != "")
0ef519a4   David Mayerich   optimized materia...
241
  				ss<<std::endl<<std::setfill(' ')<<std::setw(width)<<" "<<"    "<<range;
7a2d0012   David Mayerich   mirst1d updates
242
243
  
  			return ss.str();
3b012a80   David Mayerich   added code for co...
244
245
  		}
  
81e0d221   David Mayerich   separated executa...
246
  		//compare the name of the option to a string
3b012a80   David Mayerich   added code for co...
247
248
249
250
251
  		bool operator==(std::string rhs)
  		{
              return (name == rhs);
  		}
  
81e0d221   David Mayerich   separated executa...
252
  		//set the option to a given value
3b012a80   David Mayerich   added code for co...
253
254
255
256
257
258
259
260
261
262
263
  		void set(std::string _value)
  		{
              parse_val(_value);
  
              //set the flag
              flag = true;
  		}
  
  		bool is_set()
  		{
              return flag;
7a2d0012   David Mayerich   mirst1d updates
264
265
          }
  
3b012a80   David Mayerich   added code for co...
266
267
268
269
270
  	};
  
  	struct argsection
  	{
  		std::string name;
9d3ba0b1   David Mayerich   added stim::hsi a...
271
  		size_t index;
3b012a80   David Mayerich   added code for co...
272
273
  	};
  
025d4bf3   David Mayerich   added documentati...
274
275
      /**The arglist class implements command line arguments.
          Example:
025d4bf3   David Mayerich   added documentati...
276
  
9c97e126   David Mayerich   added an axis-ali...
277
          1) Create an arglist instance:
025d4bf3   David Mayerich   added documentati...
278
  
9c97e126   David Mayerich   added an axis-ali...
279
              stim::arglist args;
025d4bf3   David Mayerich   added documentati...
280
  
9c97e126   David Mayerich   added an axis-ali...
281
          2) Add arguments:
025d4bf3   David Mayerich   added documentati...
282
283
284
285
286
  
              args.add("help", "prints this help");
              args.add("foo", "foo takes a single integer value", "", "[intval]");
              args.add("bar", "bar takes two floating point values", "", "[value1], [value2]");
  
9c97e126   David Mayerich   added an axis-ali...
287
          3) Parse the command line:
27b826a8   David Mayerich   added a spherical...
288
289
290
  
              args.parse(argc, argv);
  
9c97e126   David Mayerich   added an axis-ali...
291
          4) You generally want to immediately test for help and output available arguments:
025d4bf3   David Mayerich   added documentati...
292
293
294
295
  
              if(args["help"].is_set())
                  std::cout<<args.str();
  
025d4bf3   David Mayerich   added documentati...
296
  
9c97e126   David Mayerich   added an axis-ali...
297
298
  
          5)  Retrieve values:
025d4bf3   David Mayerich   added documentati...
299
300
301
302
303
304
305
306
307
308
309
310
311
  
              int foo;
              float bar1, bar2;
              if(args["foo"])
                  foo = args["foo"].as_int();
              if(args["bar"]){
                  bar1 = args["bar"].as_float(0);
                  bar2 = args["bar"].as_float(1);
              }
  
  
      **/
  
3b012a80   David Mayerich   added code for co...
312
313
314
315
316
  	class arglist
  	{
      private:
  		bool ansi;
  
81e0d221   David Mayerich   separated executa...
317
318
319
  		//vector of options
          std::vector<cmd_option> opts;
          std::vector<std::string> args;
3b012a80   David Mayerich   added code for co...
320
  
81e0d221   David Mayerich   separated executa...
321
  		//column width of the longest option
9d3ba0b1   David Mayerich   added stim::hsi a...
322
          size_t col_width;
3b012a80   David Mayerich   added code for co...
323
324
325
326
327
328
  
  		//list of sections
  		std::vector<argsection> sections;
  
      public:
  
0ef519a4   David Mayerich   optimized materia...
329
330
          arglist(){
          	col_width = 0;
9c97e126   David Mayerich   added an axis-ali...
331
332
333
334
335
336
337
338
339
  
  			ansi = true;
  
  			//set ansi to false by default if this is a Windows system
  			//		(console doesn't support ANSI colors)
  			#ifdef _WIN32
  				ansi=false;
  			#endif
  
0ef519a4   David Mayerich   optimized materia...
340
          }
3b012a80   David Mayerich   added code for co...
341
  
025d4bf3   David Mayerich   added documentati...
342
343
344
          ///Sets ANSI support (default is on), which allows colored values in the help output.
  
          /// @param b is a boolean value specifying ANSI support (true is on, false is off)
3b012a80   David Mayerich   added code for co...
345
346
347
  		void set_ansi(bool b)
  		{
  			ansi = b;
81e0d221   David Mayerich   separated executa...
348
349
  			for(unsigned int i=0; i<opts.size(); i++)
  				opts[i].set_ansi(ansi);
3b012a80   David Mayerich   added code for co...
350
351
  		}
  
025d4bf3   David Mayerich   added documentati...
352
353
354
355
356
357
          ///Add a supported command line argument.
  
          /// @param _name is the name of the command line argument (supplied as --name)
          /// @param _desc is a text description of the argument
          /// @param _default is the default value of the argument
          /// @param _range is the supported range of values, list of values, etc. It will be displayed to the user.
3b012a80   David Mayerich   added code for co...
358
359
          void add(std::string _name, std::string _desc, std::string _default = "", std::string _range = "")
          {
81e0d221   David Mayerich   separated executa...
360
361
362
              cmd_option opt(_name, _desc, _default, _range);
  			opt.set_ansi(ansi);
              opts.push_back(opt);
3b012a80   David Mayerich   added code for co...
363
  
9d3ba0b1   David Mayerich   added stim::hsi a...
364
              col_width = std::max<size_t>(col_width, opt.col_width());
3b012a80   David Mayerich   added code for co...
365
366
          }
  
025d4bf3   David Mayerich   added documentati...
367
368
369
          ///Specifies a section name that can be used to organize parameters in the output.
  
          /// @param _name is the name of the section, which will be displayed to the user
3b012a80   David Mayerich   added code for co...
370
371
372
373
  		void section(std::string _name)
  		{
  			argsection s;
  			s.name = _name;
81e0d221   David Mayerich   separated executa...
374
  			s.index = opts.size();
3b012a80   David Mayerich   added code for co...
375
376
377
  			sections.push_back(s);
  		}
  
025d4bf3   David Mayerich   added documentati...
378
          ///Outputs supported arguments. If ANSI support is available, they will be color-coded. Generally this is called in response to "--help"
7a2d0012   David Mayerich   mirst1d updates
379
          std::string str()
3b012a80   David Mayerich   added code for co...
380
381
382
383
384
385
386
387
          {
              std::stringstream ss;
  
              int si = -1;
  
              if(sections.size() > 0)
                  si = 0;
  
81e0d221   David Mayerich   separated executa...
388
389
              //for each option
              for(unsigned int a=0; a<opts.size(); a++)
3b012a80   David Mayerich   added code for co...
390
391
392
393
              {
                  if(si != -1 && a == sections[si].index)
                  {
  					if(ansi)
eb5dfb2b   David Mayerich   fixed linux compa...
394
  						ss<<std::endl<<std::left<<std::setw(col_width)<<std::string("\033[1;31m") + sections[si].name<<"\033[0m"<<std::endl;
3b012a80   David Mayerich   added code for co...
395
  					else
eb5dfb2b   David Mayerich   fixed linux compa...
396
  						ss<<std::endl<<std::left<<std::setw(col_width)<<sections[si].name<<std::endl;
3b012a80   David Mayerich   added code for co...
397
                      si++;
2e73e7bc   David Mayerich   basic changes for...
398
                      if(si == (int)sections.size()) si = -1;
3b012a80   David Mayerich   added code for co...
399
400
                  }
  
81e0d221   David Mayerich   separated executa...
401
                  ss<<opts[a].toStr(col_width)<<std::endl;
3b012a80   David Mayerich   added code for co...
402
403
404
405
406
              }
  
              return ss.str();
          }
  
025d4bf3   David Mayerich   added documentati...
407
408
409
          ///Retrieves the index for a supported argument, given that argument's name.
  
          /// @param _name is the name of the requested argument
9d3ba0b1   David Mayerich   added stim::hsi a...
410
          size_t index(std::string _name)
3b012a80   David Mayerich   added code for co...
411
          {
9d3ba0b1   David Mayerich   added stim::hsi a...
412
          	size_t i = find(opts.begin(), opts.end(), _name) - opts.begin();
3b012a80   David Mayerich   added code for co...
413
  
9d3ba0b1   David Mayerich   added stim::hsi a...
414
415
416
417
              if(i >= opts.size()){
  				std::cout<<"ERROR stim::arglist: option name '"<<_name<<"' not found"<<std::endl; 
                  exit(1);
  			}
3b012a80   David Mayerich   added code for co...
418
  
9d3ba0b1   David Mayerich   added stim::hsi a...
419
              return i;
3b012a80   David Mayerich   added code for co...
420
421
          }
  
025d4bf3   David Mayerich   added documentati...
422
423
424
425
          ///Sets an argument to a specified value
  
          /// @param _name is the name of the argument to be set
          /// @param _value is the value that it is given
9d3ba0b1   David Mayerich   added stim::hsi a...
426
427
          void set(std::string _name, std::string _value){
              size_t i = index(_name);
3b012a80   David Mayerich   added code for co...
428
  
9d3ba0b1   David Mayerich   added stim::hsi a...
429
430
431
  			opts[i].set(_value);
  			//adjust the column width if necessary
  			col_width = (std::max)(col_width, opts[i].col_width());
3b012a80   David Mayerich   added code for co...
432
433
          }
  
025d4bf3   David Mayerich   added documentati...
434
435
436
437
          ///Parses the command line
  
          /// @param argc is the number of command line arguments (provided by the OS)
          /// @param argv[] is the list of command line arguments (provided by the OS)
3b012a80   David Mayerich   added code for co...
438
439
          void parse(int argc, char* argv[])
          {
81e0d221   David Mayerich   separated executa...
440
              //if the number of options is 1, we're done
3b012a80   David Mayerich   added code for co...
441
442
443
444
445
              if(argc <= 1) return;
  
              std::string name;
              std::string params;
  
81e0d221   David Mayerich   separated executa...
446
447
              bool args_done = false;		//create a flag that turns true when the first option is encountered
  
3b012a80   David Mayerich   added code for co...
448
449
              for(int i=1; i<argc; i++)
              {
81e0d221   David Mayerich   separated executa...
450
                  //if the argument is an option
3b012a80   David Mayerich   added code for co...
451
452
                  if(argv[i][0] == '-' && argv[i][1] == '-')
                  {
81e0d221   David Mayerich   separated executa...
453
454
                  	args_done = true;				//arguments for the executable are done, all options now
                      //add any previous options
3b012a80   David Mayerich   added code for co...
455
456
                      if(name != "")
                          set(name, params);
81e0d221   David Mayerich   separated executa...
457
                      //set the current option to this name
3b012a80   David Mayerich   added code for co...
458
459
460
461
                      name = argv[i]+2;
                      //clear the parameters list
                      params = "";
                  }
81e0d221   David Mayerich   separated executa...
462
463
464
465
                  else if(!args_done){
                  	args.push_back(argv[i]);
                  }
                  else{	//everything else is an arg for the most recent option
3b012a80   David Mayerich   added code for co...
466
467
468
469
470
471
  					if(params != "")
  						params += " ";
                      params += argv[i];
                  }
              }
  
81e0d221   David Mayerich   separated executa...
472
              //set the last option
27b826a8   David Mayerich   added a spherical...
473
474
              if(name != "")
              	set(name, params);
3b012a80   David Mayerich   added code for co...
475
476
          }
  
025d4bf3   David Mayerich   added documentati...
477
478
479
          ///Determines of a parameter has been set and returns true if it has
  
          /// @param _name is the name of the argument
963d0676   David Mayerich   bug fixes related...
480
481
482
          bool operator()(std::string _name){
  			std::vector<cmd_option>::iterator it;
              it = std::find(opts.begin(), opts.end(), _name);// - opts.begin();
3b012a80   David Mayerich   added code for co...
483
  
963d0676   David Mayerich   bug fixes related...
484
              if(it == opts.end()){
3b012a80   David Mayerich   added code for co...
485
486
487
488
                  std::cout<<"ERROR - Unspecified parameter name: "<<_name<<std::endl;
                  exit(1);
              }
  
963d0676   David Mayerich   bug fixes related...
489
              return it->is_set();
3b012a80   David Mayerich   added code for co...
490
491
          }
  
025d4bf3   David Mayerich   added documentati...
492
493
494
          ///Returns the number of parameters for a specified argument
  
          /// @param _name is the name of the argument whose parameter number will be returned
963d0676   David Mayerich   bug fixes related...
495
496
497
          size_t nargs(std::string _name){
  			std::vector<cmd_option>::iterator it;
              it = find(opts.begin(), opts.end(), _name);// - opts.begin();
3b012a80   David Mayerich   added code for co...
498
  
963d0676   David Mayerich   bug fixes related...
499
              if(it == opts.end()){
3b012a80   David Mayerich   added code for co...
500
501
502
503
                  std::cout<<"ERROR - Unspecified parameter name: "<<_name<<std::endl;
                  exit(1);
              }
  
963d0676   David Mayerich   bug fixes related...
504
              return it->nargs();
81e0d221   David Mayerich   separated executa...
505
506
          }
  
025d4bf3   David Mayerich   added documentati...
507
          ///Returns the number of arguments that have been set
9d3ba0b1   David Mayerich   added stim::hsi a...
508
          size_t nargs(){
81e0d221   David Mayerich   separated executa...
509
510
511
          	return args.size();
          }
  
e9bddc57   David Mayerich   added band croppi...
512
          /// Returns the number of options that are set
9d3ba0b1   David Mayerich   added stim::hsi a...
513
514
515
          size_t nopts(){
          	size_t n = 0;									//initialize the counter for the number of options
          	for(size_t i = 0; i < opts.size(); i++)		//go through each option
e9bddc57   David Mayerich   added band croppi...
516
517
518
519
          		if(opts[i].is_set()) n++;						//if a value is specified, increment the counter
          	return n;
          }
  
025d4bf3   David Mayerich   added documentati...
520
521
522
          ///Returns the name of an argument, given its index
  
          /// @param a is the index of the requested argument
9d3ba0b1   David Mayerich   added stim::hsi a...
523
          std::string arg(size_t a){
81e0d221   David Mayerich   separated executa...
524
          	return args[a];
3b012a80   David Mayerich   added code for co...
525
526
          }
  
025d4bf3   David Mayerich   added documentati...
527
528
529
          ///Returns an object describing the argument
  
          /// @param _name is the name of the requested argument
963d0676   David Mayerich   bug fixes related...
530
531
532
          cmd_option operator[](std::string _name){
  			std::vector<cmd_option>::iterator it;
              it = find(opts.begin(), opts.end(), _name);// - opts.begin();
3b012a80   David Mayerich   added code for co...
533
  
963d0676   David Mayerich   bug fixes related...
534
              if(it == opts.end()){
3b012a80   David Mayerich   added code for co...
535
536
537
538
                  std::cout<<"ERROR - Unspecified parameter name: "<<_name<<std::endl;
                  exit(1);
              }
  
963d0676   David Mayerich   bug fixes related...
539
              return *it;
3b012a80   David Mayerich   added code for co...
540
541
542
          }
  
  
7a2d0012   David Mayerich   mirst1d updates
543
544
545
546
  	};
  
  
  
2e73e7bc   David Mayerich   basic changes for...
547
  }	//end namespace stim
3b012a80   David Mayerich   added code for co...
548
549
  
  #endif