Blame view

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