dune-fem  2.8-git
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  static inline const std::string& checkParameterExistsString()
21  {
22  static const std::string defaultKeyForExistCheck("__ParameterReader::check-exists__");
23  return defaultKeyForExistCheck;
24  }
25 
26  // BasicParameterReader
27  // --------------------
28 
29  template< class Parameter >
31  {
34  : parameter_( std::move( parameter ) )
35  {}
36 
44  bool exists ( const std::string &key ) const
45  {
46  return static_cast< bool >( parameter_( key, &checkParameterExistsString() ) );
47  }
48 
58  template< class T >
59  void get ( const std::string &key, T &value ) const
60  {
61  const std::string *string = parameter_( key, nullptr );
62  if( !string )
63  DUNE_THROW( ParameterNotFound, "Parameter '" << key << "' not found." );
64  if( !ParameterParser< T >::parse( *string, value ) )
65  DUNE_THROW( ParameterInvalid, "Parameter '" << key << "' invalid." );
66  }
67 
78  template< class T >
79  void get ( const std::string &key, const T &defaultValue, T &value ) const
80  {
81  const std::string defaultString = ParameterParser< T >::toString( defaultValue );
82  const std::string *string = parameter_( key, &defaultString );
83  assert( string );
84  if( !ParameterParser< T >::parse( *string, value ) )
85  DUNE_THROW( ParameterInvalid, "Parameter '" << key << "' invalid." );
86  }
87 
98  void get ( const std::string &key, const char* defaultValue, std::string &value ) const
99  {
100  const std::string defaultString( defaultValue );
101  const std::string *string = parameter_( key, &defaultString );
102  assert( string );
103  if( !ParameterParser< std::string >::parse( *string, value ) )
104  DUNE_THROW( ParameterInvalid, "Parameter '" << key << "' invalid." );
105  }
106 
117  template< class T, class Validator >
118  void getValid ( const std::string &key, const Validator &validator, T &value ) const
119  {
120  const std::string *string = parameter_( key, nullptr );
121  if( !string )
122  DUNE_THROW( ParameterNotFound, "Parameter '" << key << "' not found." );
123  if( !ParameterParser< T >::parse( *string, value ) || !validator( value ) )
124  DUNE_THROW( ParameterInvalid, "Parameter '" << key << "' invalid." );
125  }
126 
138  template< class T, class Validator >
139  void getValid ( const std::string &key, const T &defaultValue, const Validator &validator, T &value ) const
140  {
141  const std::string defaultString = ParameterParser< T >::toString( defaultValue );
142  const std::string *string = parameter_( key, &defaultString );
143  assert( string );
144  if( !ParameterParser< T >::parse( *string, value ) || !validator( value ) )
145  DUNE_THROW( ParameterInvalid, "Parameter '" << key << "' invalid." );
146  }
147 
158  template< class T >
159  T getValue ( const std::string &key ) const
160  {
161  T value;
162  get( key, value );
163  return value;
164  }
165 
177  template< class T >
178  T getValue ( const std::string &key, const T &defaultValue ) const
179  {
180  T value = defaultValue;
181  get( key, defaultValue, value );
182  return value;
183  }
184 
196  template< class T, class Validator >
197  T getValidValue ( const std::string &key, const Validator &validator ) const
198  {
199  T value;
200  getValid( key, validator, value );
201  return value;
202  }
203 
216  template< class T, class Validator >
217  T getValidValue ( const std::string &key, const T &defaultValue, const Validator &validator ) const
218  {
219  T value;
220  getValid( key, defaultValue, validator, value );
221  return value;
222  }
223 
224  template< int n >
225  int getEnum ( const std::string &key, const std::string (&values)[ n ] ) const
226  {
227  const std::string *string = parameter_( key, nullptr );
228  if( !string )
229  DUNE_THROW( ParameterNotFound, "Parameter '" << key << "' not found." );
230  return getEnumeration( key, *string, values );
231  }
232 
233  template< int n >
234  int getEnum ( const std::string &key, const std::string (&values)[ n ], int defaultValue ) const
235  {
236  const std::string *string = parameter_( key, &values[ defaultValue ] );
237  return getEnumeration( key, *string, values );
238  }
239 
240  int getEnum ( const std::string &key, const std::vector<std::string> &values ) const
241  {
242  const std::string *string = parameter_( key, nullptr );
243  if( !string )
244  DUNE_THROW( ParameterNotFound, "Parameter '" << key << "' not found." );
245  return getEnumeration( key, *string, values );
246  }
247 
248  int getEnum ( const std::string &key, const std::vector<std::string> &values, int defaultValue ) const
249  {
250  const std::string *string = parameter_( key, &values[ defaultValue ] );
251  return getEnumeration( key, *string, values );
252  }
253 
254  ThisType* clone() const { return new ThisType(parameter_); }
256  const Parameter parameter() const { return parameter_; }
257  void reset() {}
258 
259  private:
260  template< int n >
261  static int getEnumeration ( const std::string &key, const std::string& value, const std::string (&values)[ n ] )
262  {
263  for( int i = 0; i < n; ++i )
264  {
265  if( value == values[ i ] )
266  return i;
267  }
268 
269  int j = -1;
270  if( !ParameterParser< int >::parse( value, j ) )
271  j = -1;
272  if( (j < 0) || (j >= n) )
273  {
274  std::cerr << std::endl << "Parameter '" << key << "' invalid." << std::endl;
275  std::cerr << "Valid values are: ";
276  for( int i = 0; i < n; ++i )
277  std::cerr << values[ i ] << (i < n-1 ? ", " : "");
278  std::cerr << std::endl << std::endl;
279  DUNE_THROW( ParameterInvalid, "Parameter '" << key << "' invalid." );
280  }
281  return j;
282  }
283  static int getEnumeration ( const std::string &key, const std::string& value, const std::vector<std::string> &values )
284  {
285  for( unsigned int i = 0; i < values.size(); ++i )
286  {
287  if( value == values[ i ] )
288  return i;
289  }
290 
291  int j = -1;
292  if( !ParameterParser< int >::parse( value, j ) )
293  j = -1;
294  if( (j < 0) || (j >= (int)values.size()) )
295  {
296  std::cerr << std::endl << "Parameter '" << key << "' invalid." << std::endl;
297  std::cerr << "Valid values are: ";
298  for( unsigned int i = 0; i < values.size(); ++i )
299  std::cerr << values[ i ] << (i < values.size()-1 ? ", " : "");
300  std::cerr << std::endl << std::endl;
301  DUNE_THROW( ParameterInvalid, "Parameter '" << key << "' invalid." );
302  }
303  return j;
304  }
305 
306  protected:
308  };
309 
310 
311 
312  // ParameterReader
313  // ---------------
314 
315  typedef BasicParameterReader< std::function< const std::string *( const std::string &, const std::string * ) > > ParameterReader;
316 
317  } // namespace Fem
318 
319 } // namespace Dune
320 
321 #endif // #ifndef DUNE_FEM_IO_PARAMETER_READER_HH
Definition: bindguard.hh:11
static const std::string & checkParameterExistsString()
Definition: reader.hh:20
Definition: io/parameter/exceptions.hh:17
Definition: io/parameter/exceptions.hh:26
Definition: parser.hh:21
static bool parse(const std::string &s, T &value)
Definition: parser.hh:22
static std::string toString(const T &value)
Definition: parser.hh:35
Definition: reader.hh:31
void reset()
Definition: reader.hh:257
void get(const std::string &key, const char *defaultValue, std::string &value) const
get optional parameter (special case for string)
Definition: reader.hh:98
int getEnum(const std::string &key, const std::string(&values)[n]) const
Definition: reader.hh:225
Parameter parameter()
Definition: reader.hh:255
T getValidValue(const std::string &key, const T &defaultValue, const Validator &validator) const
get optional parameter
Definition: reader.hh:217
const Parameter parameter() const
Definition: reader.hh:256
void get(const std::string &key, const T &defaultValue, T &value) const
get optional parameter
Definition: reader.hh:79
void getValid(const std::string &key, const T &defaultValue, const Validator &validator, T &value) const
get optional parameter
Definition: reader.hh:139
int getEnum(const std::string &key, const std::string(&values)[n], int defaultValue) const
Definition: reader.hh:234
void get(const std::string &key, T &value) const
get mandatory parameter
Definition: reader.hh:59
ThisType * clone() const
Definition: reader.hh:254
T getValue(const std::string &key) const
get mandatory parameter
Definition: reader.hh:159
T getValue(const std::string &key, const T &defaultValue) const
get optional parameter
Definition: reader.hh:178
int getEnum(const std::string &key, const std::vector< std::string > &values) const
Definition: reader.hh:240
bool exists(const std::string &key) const
check, whether a parameter is defined
Definition: reader.hh:44
Parameter parameter_
Definition: reader.hh:307
T getValidValue(const std::string &key, const Validator &validator) const
get optional parameter
Definition: reader.hh:197
BasicParameterReader(Parameter parameter=Parameter())
Definition: reader.hh:33
int getEnum(const std::string &key, const std::vector< std::string > &values, int defaultValue) const
Definition: reader.hh:248
BasicParameterReader< Parameter > ThisType
Definition: reader.hh:32
void getValid(const std::string &key, const Validator &validator, T &value) const
get mandatory parameter
Definition: reader.hh:118
Container for User Specified Parameters.
Definition: io/parameter.hh:191