dune-fem  2.4.1-rc
reader.hh
Go to the documentation of this file.
1 #ifndef DUNE_FEM_IO_PARAMETER_READER_HH
2 #define DUNE_FEM_IO_PARAMETER_READER_HH
3 
4 #include <cassert>
5 
6 #include <functional>
7 #include <iostream>
8 #include <string>
9 #include <utility>
10 
13 
14 namespace Dune
15 {
16 
17  namespace Fem
18  {
19 
20  // BasicParameterReader
21  // --------------------
22 
23  template< class Parameter >
25  {
26  explicit BasicParameterReader ( Parameter parameter = Parameter() )
27  : parameter_( std::move( parameter ) )
28  {}
29 
37  bool exists ( const std::string &key ) const { return static_cast< bool >( parameter_( key, nullptr ) ); }
38 
48  template< class T >
49  void get ( const std::string &key, T &value ) const
50  {
51  const std::string *string = parameter_( key, nullptr );
52  if( !string )
53  DUNE_THROW( ParameterNotFound, "Parameter '" << key << "' not found." );
54  if( !ParameterParser< T >::parse( *string, value ) )
55  DUNE_THROW( ParameterInvalid, "Parameter '" << key << "' invalid." );
56  }
57 
68  template< class T >
69  void get ( const std::string &key, const T &defaultValue, T &value ) const
70  {
71  const std::string defaultString = ParameterParser< T >::toString( defaultValue );
72  const std::string *string = parameter_( key, &defaultString );
73  assert( string );
74  if( !ParameterParser< T >::parse( *string, value ) )
75  DUNE_THROW( ParameterInvalid, "Parameter '" << key << "' invalid." );
76  }
77 
88  void get ( const std::string &key, const char* defaultValue, std::string &value ) const
89  {
90  const std::string defaultString( defaultValue );
91  const std::string *string = parameter_( key, &defaultString );
92  assert( string );
93  if( !ParameterParser< std::string >::parse( *string, value ) )
94  DUNE_THROW( ParameterInvalid, "Parameter '" << key << "' invalid." );
95  }
96 
107  template< class T, class Validator >
108  void getValid ( const std::string &key, const Validator &validator, T &value ) const
109  {
110  const std::string *string = parameter_( key, nullptr );
111  if( !string )
112  DUNE_THROW( ParameterNotFound, "Parameter '" << key << "' not found." );
113  if( !ParameterParser< T >::parse( *string, value ) || !validator( value ) )
114  DUNE_THROW( ParameterInvalid, "Parameter '" << key << "' invalid." );
115  }
116 
128  template< class T, class Validator >
129  void getValid ( const std::string &key, const T &defaultValue, const Validator &validator, T &value ) const
130  {
131  const std::string defaultString = ParameterParser< T >::toString( defaultValue );
132  const std::string *string = parameter_( key, &defaultString );
133  assert( string );
134  if( !ParameterParser< T >::parse( *string, value ) || !validator( value ) )
135  DUNE_THROW( ParameterInvalid, "Parameter '" << key << "' invalid." );
136  }
137 
148  template< class T >
149  T getValue ( const std::string &key ) const
150  {
151  T value;
152  get( key, value );
153  return value;
154  }
155 
167  template< class T >
168  T getValue ( const std::string &key, const T &defaultValue ) const
169  {
170  T value = defaultValue;
171  get( key, defaultValue, value );
172  return value;
173  }
174 
186  template< class T, class Validator >
187  T getValidValue ( const std::string &key, const Validator &validator ) const
188  {
189  T value;
190  getValid( key, validator, value );
191  return value;
192  }
193 
206  template< class T, class Validator >
207  T getValidValue ( const std::string &key, const T &defaultValue, const Validator &validator ) const
208  {
209  T value;
210  getValid( key, defaultValue, validator, value );
211  return value;
212  }
213 
214  template< int n >
215  int getEnum ( const std::string &key, const std::string (&values)[ n ] ) const
216  {
217  const std::string *string = parameter_( key, nullptr );
218  if( !string )
219  DUNE_THROW( ParameterNotFound, "Parameter '" << key << "' not found." );
220  return getEnumeration( key, *string, values );
221  }
222 
223  template< int n >
224  int getEnum ( const std::string &key, const std::string (&values)[ n ], int defaultValue ) const
225  {
226  const std::string *string = parameter_( key, &values[ defaultValue ] );
227  return getEnumeration( key, *string, values );
228  }
229 
230  private:
231  template< int n >
232  static int getEnumeration ( const std::string &key, const std::string& value, const std::string (&values)[ n ] )
233  {
234  for( int i = 0; i < n; ++i )
235  {
236  if( value == values[ i ] )
237  return i;
238  }
239 
240  int j = -1;
241  if( !ParameterParser< int >::parse( value, j ) )
242  j = -1;
243  if( (j < 0) || (j >= n) )
244  {
245  std::cerr << std::endl << "Parameter '" << key << "' invalid." << std::endl;
246  std::cerr << "Valid values are: ";
247  for( int i = 0; i < n; ++i )
248  std::cerr << values[ i ] << (i < n-1 ? ", " : "");
249  std::cerr << std::endl << std::endl;
250  DUNE_THROW( ParameterInvalid, "Parameter '" << key << "' invalid." );
251  }
252  return j;
253  }
254 
255  protected:
257  };
258 
259 
260 
261  // ParameterReader
262  // ---------------
263 
265 
266  } // namespace Fem
267 
268 } // namespace Dune
269 
270 #endif // #ifndef DUNE_FEM_IO_PARAMETER_READER_HH
BasicParameterReader(Parameter parameter=Parameter())
Definition: reader.hh:26
BasicParameterReader< std::function< const std::string *(const std::string &, const std::string *) > > ParameterReader
Definition: reader.hh:264
Container for User Specified Parameters.
Definition: io/parameter.hh:187
Definition: io/parameter/exceptions.hh:24
bool exists(const std::string &key) const
check, whether a parameter is defined
Definition: reader.hh:37
int getEnum(const std::string &key, const std::string(&values)[n]) const
Definition: reader.hh:215
Definition: reader.hh:24
int getEnum(const std::string &key, const std::string(&values)[n], int defaultValue) const
Definition: reader.hh:224
T getValue(const std::string &key, const T &defaultValue) const
get optional parameter
Definition: reader.hh:168
void getValid(const std::string &key, const T &defaultValue, const Validator &validator, T &value) const
get optional parameter
Definition: reader.hh:129
Definition: coordinate.hh:4
T getValidValue(const std::string &key, const T &defaultValue, const Validator &validator) const
get optional parameter
Definition: reader.hh:207
T getValidValue(const std::string &key, const Validator &validator) const
get optional parameter
Definition: reader.hh:187
Definition: parser.hh:20
STL namespace.
void move(ArrayInterface< T > &array, const unsigned int oldOffset, const unsigned int newOffset, const unsigned int length)
Definition: array_inline.hh:38
T getValue(const std::string &key) const
get mandatory parameter
Definition: reader.hh:149
Definition: io/parameter/exceptions.hh:15
Parameter parameter_
Definition: reader.hh:256
void getValid(const std::string &key, const Validator &validator, T &value) const
get mandatory parameter
Definition: reader.hh:108
static std::string toString(const T &value)
Definition: parser.hh:35