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