VISR  0.11.6
Versatile Interactive Scene Renderer
options.hpp
Go to the documentation of this file.
1 /* Copyright Institute of Sound and Vibration Research - All rights reserved */
2 
3 #ifndef VISR_APPS_GAIN_MATRIX_OPTIONS_HPP_INCLUDED
4 #define VISR_APPS_GAIN_MATRIX_OPTIONS_HPP_INCLUDED
5 
6 #include <boost/program_options.hpp>
7 
8 #include <iosfwd>
9 #include <string>
10 
11 namespace visr
12 {
13 namespace apps
14 {
15 namespace gain_matrix
16 {
17 
22 class Options
23 {
24 public:
25  Options();
26 
27  ~Options();
28 
29  enum class ParseResult
30  {
31  Success,
32  Failure,
33  Version,
34  Help
35  };
36 
37  ParseResult parse( int argc, char const * const * argv, std::ostream & errMsg );
38 
39  bool hasOption( char const * optionName ) const;
40 
41  template< typename DataType >
42  DataType getOption( char const * optionName ) const;
43 
44  template< typename DataType >
45  DataType getDefaultedOption( char const * optionName, DataType const & defaultValue ) const;
46 
51  void printDescription( std::ostream & out );
52 
53 protected:
54  template<typename DataType >
55  void registerOption( char const * optionName, char const * description );
56 
57  template<typename DataType >
58  void registerPositionalOption( char const * optionName, int position, char const * description );
59 
60  boost::program_options::options_description mDescription;
61  boost::program_options::positional_options_description mPositionalDescription;
62 
63  boost::program_options::variables_map mVariablesMap;
64 };
65 
66 template< typename DataType >
67 inline DataType Options::getDefaultedOption( char const * optionName, DataType const & defaultValue) const
68 {
69  return hasOption( optionName ) ? getOption<DataType>( optionName ) : defaultValue;
70 }
71 
72 template< typename DataType >
73 inline DataType Options::getOption( char const * optionName ) const
74 {
75  if( mVariablesMap.count( optionName ) != 1 )
76  {
77  throw std::logic_error( std::string( "The mandatory command line option \"" )
78  + optionName + "\" must be specified exactly once." );
79  }
80  try
81  {
82  auto const val = mVariablesMap[optionName];
83  DataType const d = val.as<DataType>( );
84  return d;
85  }
86  catch( std::exception const & ex )
87  {
88  throw std::logic_error( std::string( "The value \"" ) // + mVariablesMap[optionName]
89  + "\" of the command line option \"" + optionName
90  + "\" could not be converted to the target type: " + ex.what( ) );
91  }
92 }
93 
94 template<typename DataType >
95 inline void Options::registerOption( char const * optionName, char const * description )
96 {
97  mDescription.add_options()( optionName, boost::program_options::value<DataType>(), description );
98 }
99 
100 template<>
101 inline void Options::registerOption<bool>( char const * optionName, char const * description )
102 {
103  mDescription.add_options( )(optionName, boost::program_options::bool_switch(), description);
104 }
105 
106 template<typename DataType >
107 inline void Options::registerPositionalOption( char const * optionName, int position, char const * description )
108 {
109  registerOption< DataType >( optionName, description );
110  mPositionalDescription.add( optionName, position );
111 }
112 
113 } // namespace gain_matrix
114 } // namespace apps
115 } // namespace visr
116 
117 #endif // #ifndef VISR_APPS_GAIN_MATRIX_OPTIONS_HPP_INCLUDED
boost::program_options::variables_map mVariablesMap
Definition: options.hpp:63
Definition: options.hpp:22
void registerPositionalOption(char const *optionName, int position, char const *description)
Definition: options.hpp:107
bool hasOption(char const *optionName) const
Definition: options.cpp:61
Definition: options.cpp:10
DataType getDefaultedOption(char const *optionName, DataType const &defaultValue) const
Definition: options.hpp:67
ParseResult parse(int argc, char const *const *argv, std::ostream &errMsg)
Definition: options.cpp:37
~Options()
Definition: options.cpp:33
DataType getOption(char const *optionName) const
Definition: options.hpp:73
void registerOption(char const *optionName, char const *description)
Definition: options.hpp:95
Options()
Definition: options.cpp:19
ParseResult
Definition: options.hpp:29
boost::program_options::positional_options_description mPositionalDescription
Definition: options.hpp:61
boost::program_options::options_description mDescription
Definition: options.hpp:60
void printDescription(std::ostream &out)
Definition: options.cpp:66