dune-fem 2.8.0
Loading...
Searching...
No Matches
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
14namespace 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
STL namespace.
Definition: bindguard.hh:11
static const std::string & checkParameterExistsString()
Definition: reader.hh:20
Container for User Specified Parameters.
Definition: io/parameter.hh:191
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
ThisType * clone() const
Definition: reader.hh:254
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
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