Blame view

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