Blame view

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