vtf-logo

ParseOptionsArguments.h

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 
00008 #if !defined(__ads_utility_ParseOptionsArguments_h__)
00009 #define __ads_utility_ParseOptionsArguments_h__
00010 
00011 #include "../defs.h"
00012 
00013 #include <set>
00014 #include <map>
00015 #include <list>
00016 #include <string>
00017 #include <sstream>
00018 
00019 #include <cassert>
00020 
00021 BEGIN_NAMESPACE_ADS
00022 
00024 class ParseOptionsArguments {
00025   //
00026   // Public types.
00027   //
00028 
00029 public:
00030 
00032   typedef std::string String;
00033 
00034   //
00035   // Private types.
00036   //
00037 
00038 private:
00039 
00041   typedef std::set<String> OptionsContainer;
00043   typedef std::map<String,String> OptionsWithValuesContainer;
00045   typedef std::list<String> ArgumentsContainer;
00046 
00047   //
00048   // Member data.
00049   //
00050 
00051 private:
00052 
00053   // The character that prefixes an option.
00054   char _optionPrefix;
00055   // The program name.
00056   String _programName;
00057   // The options (without values).
00058   OptionsContainer _options;
00059   // The options with values.
00060   OptionsWithValuesContainer _optionsWithValues;
00061   // The arguments.
00062   ArgumentsContainer _arguments;
00063 
00064   //
00065   // Not implemented.
00066   //
00067 
00068 private:
00069 
00070   // Copy constructor not implemented.
00071   ParseOptionsArguments(const ParseOptionsArguments& other);
00072   
00073   // Assignment operator not implemented.
00074   ParseOptionsArguments&
00075   operator=(const ParseOptionsArguments& other);
00076   
00077 
00078 public:
00079 
00080   //--------------------------------------------------------------------------
00082 
00083 
00085   ParseOptionsArguments() :
00086     // Default value.
00087     _optionPrefix('-'),
00088     // Empty string.
00089     _programName(),
00090     // Empty.
00091     _options(),
00092     // Empty.
00093     _optionsWithValues(),
00094     // Empty.
00095     _arguments()
00096   {}
00097   
00099   ParseOptionsArguments(const int argc, char* argv[], 
00100                         const char optionPrefix = '-') :
00101     // Default value.
00102     _optionPrefix(optionPrefix),
00103     // Empty string.
00104     _programName(),
00105     // Empty.
00106     _options(),
00107     // Empty.
00108     _optionsWithValues(),
00109     // Empty.
00110     _arguments() {
00111     // Parse the options and arguments.
00112     parse(argc, argv);
00113   }
00114  
00116   ~ParseOptionsArguments()
00117   {}
00118 
00120   //--------------------------------------------------------------------------
00122 
00123 
00125   const String&
00126   getProgramName() const {
00127     return _programName;
00128   }
00129 
00131   char
00132   getOptionPrefix() const {
00133     return _optionPrefix;
00134   }
00135 
00137   int
00138   getNumberOfOptions() const {
00139     return int(_options.size() + _optionsWithValues.size());
00140   }
00141 
00143   bool
00144   areOptionsEmpty() const {
00145     return getNumberOfOptions() == 0;
00146   }
00147 
00149   int
00150   getNumberOfArguments() const {
00151     return int(_arguments.size());
00152   }
00153 
00155   bool
00156   areArgumentsEmpty() const {
00157     return _arguments.empty();
00158   }
00159 
00161   //--------------------------------------------------------------------------
00163 
00164 
00166   void
00167   parse(int argc, char* argv[]);
00168 
00170   void
00171   setOptionPrefix(const char optionPrefix) {
00172     _optionPrefix = optionPrefix;
00173   }
00174 
00176   bool
00177   getOption(const String& key) {
00178     OptionsContainer::iterator i = _options.find(key);
00179     if (i == _options.end()) {
00180       return false;
00181     }
00182     _options.erase(i);
00183     return true;
00184   }
00185 
00187 
00190   bool
00191   getOption(const char key) {
00192     return getOption(String(1, key));
00193   }
00194 
00196   template<typename T>
00197   bool
00198   getOption(const String& key, T* value);
00199 
00201 
00204   template<typename T>
00205   bool
00206   getOption(const char key, T* value) {
00207     return getOption(String(1,key), value);
00208   }
00209 
00211   bool
00212   getOption(const String& key, String* value);
00213 
00215 
00218   String
00219   getArgument() {
00220     assert(! _arguments.empty());
00221     String argument = _arguments.front();
00222     _arguments.pop_front();
00223     return argument;
00224   }
00225 
00227 
00235   template<typename T>
00236   bool
00237   getArgument(T* x) {
00238     assert(! _arguments.empty());
00239     // Make an input string stream from the current argument.
00240     std::istringstream in(_arguments.front());
00241     // Pop the current argument.
00242     _arguments.pop_front();
00243     // Read from the input string stream.
00244     in >> *x;
00245     // Check the state of the stream.
00246     if (in) {
00247       return true;
00248     }
00249     return false;
00250   }
00251 
00253   //--------------------------------------------------------------------------
00255 
00256 
00258   void
00259   printOptions(std::ostream& out) const;
00260 
00262   void
00263   printArguments(std::ostream& out) const;
00264 
00266 };
00267 
00268 END_NAMESPACE_ADS
00269 
00270 #define __ads_utility_ParseOptionsArguments_ipp__
00271 #include "ParseOptionsArguments.ipp"
00272 #undef __ads_utility_ParseOptionsArguments_ipp__
00273 
00274 #endif

Generated on Fri Aug 24 12:55:27 2007 for Algorithms and Data Structures Package by  doxygen 1.4.7