VR-Link API Documentation for HLA Evolved
cmdArg.h
Go to the documentation of this file.
1 /******************************************************************************
2  *
3  * file: Arg.h
4  *
5  * Copyright (c) 2003, Michael E. Smoot .
6  * Copyright (c) 2004, Michael E. Smoot, Daniel Aarno .
7  * All rights reverved.
8  *
9  * See the file COPYING in the top directory of this distribution for
10  * more information.
11  *
12  * THE SOFTWARE IS PROVIDED _AS IS_, WITHOUT WARRANTY OF ANY KIND, EXPRESS
13  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
14  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
15  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
16  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
17  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
18  * DEALINGS IN THE SOFTWARE.
19  *
20  *****************************************************************************/
24 
25 #ifndef DtCmdLine_ARGUMENT_H
26 #define DtCmdLine_ARGUMENT_H
27 
28 #include <string>
29 #include <vector>
30 #include <list>
31 #include <iostream>
32 
33 #include "cmdArgException.h"
34 #include "cmdVisitor.h"
35 #include "cmdLineInterface.h"
36 
37 #ifdef DtUSE_UTILITIES_NAMESPACE
38 namespace DtUSE_UTILITIES_NAMESPACE
39 {
40 #endif
41 
42 namespace DtCmdLine {
43 
48  class Arg
49  {
50  private:
51 
55  static bool& ignoreRestRef() { static bool ign = false; return ign; }
56 
61  static char& delimiterRef() { static char delim = ' '; return delim; }
62 
63  protected:
64 
73  std::string _flag;
74 
82  std::string _name;
83 
87  std::string _description;
88 
92  bool _required;
93 
98  std::string _requireLabel;
99 
106 
113 
121 
126 
131  bool _xorSet;
132 
136  void _checkWithVisitor() const;
137 
151  Arg( const std::string& flag,
152  const std::string& name,
153  const std::string& desc,
154  bool req,
155  bool valreq,
156  Visitor* v = NULL );
157 
158  public:
162  virtual ~Arg();
163 
168  virtual void addToList( std::list<Arg*>& argList ) const;
169 
173  static void beginIgnoring() { ignoreRestRef() = true; }
174 
178  static bool ignoreRest() { return ignoreRestRef(); }
179 
184  static char delimiter() { return delimiterRef(); }
185 
191  static const char blankChar() { return '*'; }
192 
196  static const char flagStartChar() { return '-'; }
197 
202  static const std::string flagStartString() { return "-"; }
203 
208  static const std::string nameStartString() { return "--"; }
209 
213  static const std::string ignoreNameString() { return "ignore_rest"; }
214 
219  static void setDelimiter( char c ) { delimiterRef() = c; }
220 
228  virtual bool processArg(int *i, std::vector<std::string>& args) = 0;
229 
235  virtual bool operator==(const Arg& a);
236 
240  const std::string& getFlag() const;
241 
245  const std::string& getName() const;
246 
250  std::string getDescription() const;
251 
255  virtual bool isRequired() const;
256 
261  void forceRequired();
262 
267  void xorSet();
268 
272  bool isValueRequired() const;
273 
278  bool isSet() const;
279 
283  bool isIgnoreable() const;
284 
293  virtual bool argMatches( const std::string& s ) const;
294 
299  virtual std::string toString() const;
300 
305  virtual std::string shortID( const std::string& valueId = "val" ) const;
306 
311  virtual std::string longID( const std::string& valueId = "val" ) const;
312 
320  virtual void trimFlag( std::string& flag, std::string& value ) const;
321 
328  bool _hasBlanks( const std::string& s ) const;
329 
335  void setRequireLabel( const std::string& s );
336 
337  };
338 
342  typedef std::list<Arg*>::iterator ArgListIterator;
343 
347  typedef std::vector<Arg*>::iterator ArgVectorIterator;
348 
352  typedef std::list<Visitor*>::iterator VisitorListIterator;
353 
354 
356  //BEGIN Arg.cpp
358 
359  inline Arg::Arg(const std::string& flag,
360  const std::string& name,
361  const std::string& desc,
362  bool req,
363  bool valreq,
364  Visitor* v) :
365  _flag(flag),
366  _name(name),
367  _description(desc),
368  _required(req),
369  _requireLabel("required"),
370  _valueRequired(valreq),
371  _alreadySet(false),
372  _visitor( v ),
373  _ignoreable(true),
374  _xorSet(false)
375  {
376  if ( _flag.length() > 1 )
378  "Argument flag can only be one character long", toString() ) );
379 
380  if ( _name != ignoreNameString() &&
381  ( _flag == Arg::flagStartString() ||
382  _flag == Arg::nameStartString() ||
383  _flag == " " ) )
384  throw(SpecificationException("Argument flag cannot be either '" +
385  Arg::flagStartString() + "' or '" +
386  Arg::nameStartString() + "' or a space.",
387  toString() ) );
388 
389  if ( ( _name.find( Arg::flagStartString(), 0 ) != std::string::npos ) ||
390  ( _name.find( Arg::nameStartString(), 0 ) != std::string::npos ) ||
391  ( _name.find( " ", 0 ) != std::string::npos ) )
392  throw(SpecificationException("Argument name cannot contain either '" +
393  Arg::flagStartString() + "' or '" +
394  Arg::nameStartString() + "' or space.",
395  toString() ) );
396 
397  }
398 
399  inline Arg::~Arg() { }
400 
401  inline std::string Arg::shortID( const std::string& valueId ) const
402  {
403  std::string id = "";
404 
405  if ( _flag != "" )
406  id = Arg::flagStartString() + _flag;
407  else
408  id = Arg::nameStartString() + _name;
409 
410  std::string delim = " ";
411  delim[0] = Arg::delimiter();
412 
413  if ( _valueRequired )
414  id += delim + "<" + valueId + ">";
415 
416  if ( !_required )
417  id = "[" + id + "]";
418 
419  return id;
420  }
421 
422  inline std::string Arg::longID( const std::string& valueId ) const
423  {
424  std::string id = "";
425 
426  if ( _flag != "" )
427  {
428  id += Arg::flagStartString() + _flag;
429 
430  if ( _valueRequired )
431  id += " <" + valueId + ">";
432 
433  id += ", ";
434  }
435 
436  id += Arg::nameStartString() + _name;
437 
438  if ( _valueRequired )
439  id += " <" + valueId + ">";
440 
441  return id;
442 
443  }
444 
445  inline bool Arg::operator==(const Arg& a)
446  {
447  if ( ( _flag != "" && _flag == a._flag ) ||
448  (_name == a._name))
449  {
450  return true;
451  }
452  else
453  {
454  return false;
455  }
456  }
457 
458  inline std::string Arg::getDescription() const
459  {
460  std::string desc = "";
461  if ( _required )
462  desc = "(" + _requireLabel + ") ";
463 
464  //if ( _valueRequired )
466 
467  desc += _description;
468  return desc;
469  }
470 
471  inline const std::string& Arg::getFlag() const { return _flag; }
472 
473  inline const std::string& Arg::getName() const { return _name; }
474 
475  inline bool Arg::isRequired() const { return _required; }
476 
477  inline bool Arg::isValueRequired() const { return _valueRequired; }
478 
479  inline bool Arg::isSet() const
480  {
481  if ( _alreadySet && !_xorSet )
482  return true;
483  else
484  return false;
485  }
486 
487  inline bool Arg::isIgnoreable() const { return _ignoreable; }
488 
489  inline void Arg::setRequireLabel( const std::string& s)
490  {
491  _requireLabel = s;
492  }
493 
494  inline bool Arg::argMatches( const std::string& argFlag ) const
495  {
496  if ( ( argFlag == Arg::flagStartString() + _flag && _flag != "" ) ||
497  argFlag == Arg::nameStartString() + _name )
498  return true;
499  else
500  return false;
501  }
502 
503  inline std::string Arg::toString() const
504  {
505  std::string s = "";
506 
507  if ( _flag != "" )
508  s += Arg::flagStartString() + _flag + " ";
509 
510  s += "(" + Arg::nameStartString() + _name + ")";
511 
512  return s;
513 }
514 
515 inline void Arg::_checkWithVisitor() const
516 {
517  if ( _visitor != NULL )
518  _visitor->visit();
519 }
520 
524 inline void Arg::trimFlag(std::string& flag, std::string& value) const
525 {
526  int stop = 0;
527  for ( int i = 0; (unsigned int)i < flag.length(); i++ )
528  if ( flag[i] == Arg::delimiter() )
529  {
530  stop = i;
531  break;
532  }
533 
534  if ( stop > 1 )
535  {
536  value = flag.substr(stop+1);
537  flag = flag.substr(0,stop);
538  }
539 
540 }
541 
545 inline bool Arg::_hasBlanks( const std::string& s ) const
546 {
547  for ( int i = 1; (unsigned int)i < s.length(); i++ )
548  if ( s[i] == Arg::blankChar() )
549  return true;
550 
551  return false;
552 }
553 
554 inline void Arg::forceRequired()
555 {
556  _required = true;
557 }
558 
559 inline void Arg::xorSet()
560 {
561  _alreadySet = true;
562  _xorSet = true;
563 }
564 
568 inline void Arg::addToList( std::list<Arg*>& argList ) const
569 {
570  argList.push_front( (Arg*)this );
571 }
572 
574 //END Arg.cpp
576 
577 } //namespace DtCmdLine
578 
579 #ifdef DtUSE_UTILITIES_NAMESPACE
580 }
581 #endif
582 
583 #endif
584 

Document ID: Generated on Wed Aug 14 15:35:11 EDT 2013 from SVN revision 130445
Copyright © 2005-2013 VT MÄK. All Rights Reserved (www.mak.com)