MeteoIODoc 20250312.660e6d76
Config.h
Go to the documentation of this file.
1/***********************************************************************************/
2/* Copyright 2009 WSL Institute for Snow and Avalanche Research SLF-DAVOS */
3/***********************************************************************************/
4/* This file is part of MeteoIO.
5 MeteoIO is free software: you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9
10 MeteoIO is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public License
16 along with MeteoIO. If not, see <http://www.gnu.org/licenses/>.
17*/
18#ifndef CONFIGREADER_H
19#define CONFIGREADER_H
20
21#include <meteoio/IOUtils.h>
23
24#include <string>
25#include <map>
26#include <vector>
27
28namespace mio {
29
75class ConfigProxy;
76
77class Config {
78 public:
82 Config();
83
88 Config(const std::string& filename_in);
89
94 void write(const std::string& filename) const;
95
100 void addFile(const std::string& filename_in);
101
109 void addKey(std::string key, std::string section, const std::string& value);
110
116 void deleteKey(std::string key, std::string section);
117
128 void deleteKeys(std::string keymatch, std::string section, const bool& anywhere=false);
129
134 std::string getSourceName() const {return sourcename;}
135
140 std::string getConfigRootDir() const {return configRootDir;}
141
148 bool keyExists(std::string key, std::string section) const;
149 bool keyExistsRegex(std::string key_pattern, std::string section) const;
150
156 bool sectionExists(std::string section) const;
157
162 const std::string toString() const;
163
164 friend std::ostream& operator<<(std::ostream& os, const Config& cfg);
165 friend std::istream& operator>>(std::istream& is, Config& cfg);
166
167 template <typename T> std::vector<T> getValue(const std::string& key, std::string& section,
169 {
170 std::vector<T> tmp;
171 getValue(key, section, tmp, opt);
172 return tmp;
173 }
174
185 template <typename T> void getValue(const std::string& key,
186 std::vector<T>& vecT,
188 {
189 getValue(key, "GENERAL", vecT, opt);
190 }
191
203 template <typename T> void getValue(std::string key, std::string section,
204 std::vector<T>& vecT, const IOUtils::ThrowOptions& opt=IOUtils::dothrow) const
205 {
206 vecT.clear();
207 IOUtils::toUpper(key);
208 IOUtils::toUpper(section);
209
210 try {
211 IOUtils::getValueForKey<T>(properties, section + "::" + key, vecT, opt);
212 } catch(const std::exception&){
213 throw UnknownValueException("[E] Error in "+sourcename+": no value for key "+section+"::"+key, AT);
214 }
215 }
216
231 const ConfigProxy get(const std::string& key, const std::string& section) const;
232
247 template <typename T> T get(const std::string& key, const std::string& section, const T& dflt) const;
248
265 std::string get(const std::string& key, const std::string& section, const std::string& dflt) const;
266 std::string get(const std::string& key, const std::string& section, const char dflt[]) const;
267 double get(const std::string& key, const std::string& section, const double& dflt) const; //surprisingly, in c++11 with gcc 9.3.0 this is needed...
268 bool get(const std::string& key, const std::string& section, const bool& dflt) const;
269
270
277 template <typename T> void getValue(const std::string& key, T& t, const IOUtils::ThrowOptions& opt=IOUtils::dothrow) const
278 {
279 getValue(key, "GENERAL", t, opt);
280 }
281
289 template <typename T> void getValue(std::string key, std::string section, T& t,
291 {
292 IOUtils::toUpper(key);
293 IOUtils::toUpper(section);
294
295 try {
296 IOUtils::getValueForKey<T>(properties, section + "::" + key, t, opt);
297 } catch(const std::exception&){
298 throw UnknownValueException("[E] Error in "+sourcename+": no value for key "+section+"::"+key, AT);
299 }
300 }
301
310 void getValue(std::string key, std::string section, Date& t, const double& time_zone,
312 {
313 t.setUndef(true);
314 IOUtils::toUpper(key);
315 IOUtils::toUpper(section);
316 std::string tmp;
317
318 try {
319 IOUtils::getValueForKey<std::string>(properties, section + "::" + key, tmp, opt);
320 } catch(const std::exception&){
321 throw UnknownValueException("[E] Error in "+sourcename+": no value for key "+section+"::"+key, AT);
322 }
323
324 bool parse_ok = false;
325 try {
326 parse_ok = IOUtils::convertString(t, tmp, time_zone);
327 } catch(const std::exception&){
328 parse_ok = false;
329 }
330 if (!parse_ok && opt==IOUtils::dothrow)
331 throw InvalidFormatException("Could not parse date '"+tmp+"' in "+sourcename+"for key "+section+"::"+key, AT);
332 }
333
343 template <typename T> void getValues(std::string keymatch, std::string section, std::vector<T>& vecT) const
344 {
345 vecT.clear();
346 IOUtils::toUpper(keymatch);
347 IOUtils::toUpper(section);
348 const std::vector< std::string > vecKeys( getKeys(keymatch, section) );
349
350 for (const std::string& key : vecKeys) {
351 const std::string full_key( section + "::" + key );
352 T tmp;
353 try {
354 IOUtils::getValueForKey<T>(properties, full_key, tmp, IOUtils::dothrow);
355 } catch(const std::exception&){
356 throw UnknownValueException("[E] Error in "+sourcename+" reading key "+full_key, AT);
357 }
358 vecT.push_back( tmp );
359 }
360 }
361
362 template <typename T> void getValues(std::string keymatch, std::string section, std::vector<T>& vecT, std::vector<std::string>& vecKeys) const
363 {
364 vecT.clear();
365 IOUtils::toUpper(keymatch);
366 IOUtils::toUpper(section);
367 vecKeys = getKeys(keymatch, section);
368
369 for (const std::string& key : vecKeys) {
370 const std::string full_key = section + "::" + key;
371 T tmp;
372 try {
373 IOUtils::getValueForKey<T>(properties, full_key, tmp, IOUtils::dothrow);
374 } catch(const std::exception&){
375 throw UnknownValueException("[E] Error in "+sourcename+" reading key "+full_key, AT);
376 }
377 vecT.push_back( tmp );
378 }
379 }
380
392 std::vector< std::pair<std::string, std::string> > getValues(std::string keymatch, std::string section, const bool& anywhere=false) const;
393
394 std::vector< std::pair<std::string, std::string> > getValuesRegex(const std::string& regex_str, std::string section) const;
395
407 std::vector<std::string> getKeys(std::string keymatch, std::string section, const bool& anywhere=false) const;
408 std::vector<std::string> getKeysRegex(const std::string& regex_str, std::string section) const;
413 std::set<std::string> getSections() const {return sections;}
414
421 void moveSection(std::string org, std::string dest, const bool& overwrite);
422
435 static unsigned int getCommandNr(const std::string& section, const std::string& cmd_pattern, const std::string& cmd_key);
436
452 std::vector< std::pair<std::string, std::string> > parseArgs(const std::string& section, const std::string& cmd_id, const unsigned int& cmd_nr, const std::string& arg_pattern) const;
453
462 std::vector< std::pair<std::string, std::string> > getArgumentsForAlgorithm(const std::string& parname, const std::string& algorithm,
463 const std::string& section = "Interpolations1d") const;
464 // overload for indexed algorith
465 std::vector< std::pair<std::string, std::string> > getArgumentsForAlgorithm(const std::string& parname, const std::string& algorithm, const size_t& algo_index,
466 const std::string& section = "Interpolations1d") const;
467
468
469
470 private:
471 std::map<std::string, std::string> properties;
472 std::set<std::string> sections;
473 std::string sourcename;
474 std::string configRootDir;
475}; //end class definition Config
476
477class ConfigProxy {
478 public:
479 const Config& proxycfg;
480 const std::string& key;
481 const std::string& section;
482
483 ConfigProxy(const Config& i_cfg, const std::string& i_key,
484 const std::string& i_section)
485 : proxycfg(i_cfg), key(i_key),section(i_section) { }
486
487 template<typename T> operator T() const {
488 T tmp;
489 proxycfg.getValue(key, section, tmp, IOUtils::dothrow);
490 return tmp;
491 }
492};
493
495 public:
496 ConfigParser(const std::string& filename, std::map<std::string, std::string> &i_properties, std::set<std::string> &i_sections);
497
498 static std::string extract_section(const std::string& key, const bool& provide_default=false);
499 private:
500 void parseFile(const std::string& filename);
501 void parseLine(const unsigned int& linenr, std::vector<std::string> &import_after, bool &accept_import_before, std::string &line, std::string &section);
502 static bool onlyOneEqual(const std::string& str);
503 static void processEnvVars(std::string& value);
504 static bool processExpr(std::string& value);
505 bool processVars(std::string& value, const std::string& section) const;
506 bool processSectionHeader(const std::string& line, std::string &section, const unsigned int& linenr);
507 std::string clean_import_path(const std::string& in_path) const;
508 bool processImports(const std::string& key, const std::string& value, std::vector<std::string> &import_after, const bool &accept_import_before);
509 void handleNonKeyValue(const std::string& line_backup, const std::string& section, const unsigned int& linenr, bool &accept_import_before);
510
511 std::map<std::string, std::string> properties;
512 std::set<std::string> imported;
513 std::set<std::string> sections;
514 std::set<std::string> deferred_vars;
515 std::set<std::string> deferred_exprs;
516 std::string sourcename;
517};
518
519} //end namespace mio
520
521#endif
#define AT
Definition: IOExceptions.h:28
Definition: Config.h:494
ConfigParser(const std::string &filename, std::map< std::string, std::string > &i_properties, std::set< std::string > &i_sections)
Definition: Config.cc:593
static std::string extract_section(const std::string &key, const bool &provide_default=false)
Definition: Config.cc:920
A class that reads a key/value file. These files (typically named *.ini) follow the INI file format s...
Definition: Config.h:77
std::string getSourceName() const
Returns the filename that the Config object was constructed with.
Definition: Config.h:134
void getValue(const std::string &key, T &t, const IOUtils::ThrowOptions &opt=IOUtils::dothrow) const
Template function to retrieve a value of class T for a certain key.
Definition: Config.h:277
void getValues(std::string keymatch, std::string section, std::vector< T > &vecT, std::vector< std::string > &vecKeys) const
Definition: Config.h:362
void getValues(std::string keymatch, std::string section, std::vector< T > &vecT) const
Template function to retrieve a vector of values of class T for a certain key pattern.
Definition: Config.h:343
friend std::ostream & operator<<(std::ostream &os, const Config &cfg)
Definition: Config.cc:454
void deleteKey(std::string key, std::string section)
Delete a specific key/value pair from the internal map object, key/section are case insensitive.
Definition: Config.cc:131
const ConfigProxy get(const std::string &key, const std::string &section) const
A function that allows to retrieve a value for a key as return parameter (vectors of values too).
Definition: Config.cc:56
const std::string toString() const
Print the content of the Config object (useful for debugging) The Config is bound by "<Config>" and "...
Definition: Config.cc:443
Config()
Empty constructor. The user MUST later one fill the internal key/value map object.
Definition: Config.cc:49
std::vector< std::string > getKeys(std::string keymatch, std::string section, const bool &anywhere=false) const
Function that searches for a given string within the keys of a given section (default: GENERAL) it re...
Definition: Config.cc:388
static unsigned int getCommandNr(const std::string &section, const std::string &cmd_pattern, const std::string &cmd_key)
Extract the command number from a given command string, given the command pattern.
Definition: Config.cc:533
std::set< std::string > getSections() const
Returns all the sections that are present in the config object.
Definition: Config.h:413
void getValue(const std::string &key, std::vector< T > &vecT, const IOUtils::ThrowOptions &opt=IOUtils::dothrow) const
Template function to retrieve a vector of values of class T for a certain key.
Definition: Config.h:185
std::vector< std::string > getKeysRegex(const std::string &regex_str, std::string section) const
Definition: Config.cc:376
void addFile(const std::string &filename_in)
Add the content of a file to the internal key/value map object.
Definition: Config.cc:117
void getValue(std::string key, std::string section, Date &t, const double &time_zone, const IOUtils::ThrowOptions &opt=IOUtils::dothrow) const
Function to retrieve a Date value for a certain key.
Definition: Config.h:310
std::vector< std::pair< std::string, std::string > > parseArgs(const std::string &section, const std::string &cmd_id, const unsigned int &cmd_nr, const std::string &arg_pattern) const
Extract the arguments for a given command and store them into a vector of key / value pairs.
Definition: Config.cc:551
friend std::istream & operator>>(std::istream &is, Config &cfg)
Definition: Config.cc:489
void addKey(std::string key, std::string section, const std::string &value)
Add a specific key/value pair to the internal key/value map object. key and section are case insensit...
Definition: Config.cc:124
void write(const std::string &filename) const
Write the Config object to a file.
Definition: Config.cc:402
bool keyExists(std::string key, std::string section) const
Return if a given key exists in a given section (matching is case insensitive)
Definition: Config.cc:168
std::vector< T > getValue(const std::string &key, std::string &section, const IOUtils::ThrowOptions &opt=IOUtils::dothrow) const
Definition: Config.h:167
void getValue(std::string key, std::string section, T &t, const IOUtils::ThrowOptions &opt=IOUtils::dothrow) const
Template function to retrieve a value of class T for a certain key.
Definition: Config.h:289
void getValue(std::string key, std::string section, std::vector< T > &vecT, const IOUtils::ThrowOptions &opt=IOUtils::dothrow) const
Template function to retrieve a vector of values of class T for a certain key.
Definition: Config.h:203
bool sectionExists(std::string section) const
Return if a given section exists in the Config object.
Definition: Config.cc:189
bool keyExistsRegex(std::string key_pattern, std::string section) const
Definition: Config.cc:178
std::string getConfigRootDir() const
Returns the directory where the root configuration file is (needed to resolv relative paths).
Definition: Config.h:140
void moveSection(std::string org, std::string dest, const bool &overwrite)
Move all keys of the org section to the dest section.
Definition: Config.cc:201
std::vector< std::pair< std::string, std::string > > getValuesRegex(const std::string &regex_str, std::string section) const
Definition: Config.cc:240
std::vector< std::pair< std::string, std::string > > getArgumentsForAlgorithm(const std::string &parname, const std::string &algorithm, const std::string &section="Interpolations1d") const
retrieve the resampling algorithm to be used for the 1D interpolation of meteo parameters....
Definition: Config.cc:567
void deleteKeys(std::string keymatch, std::string section, const bool &anywhere=false)
Delete keys matching a specific pattern from the internal map object, key/section are case insensitiv...
Definition: Config.cc:138
A class to handle timestamps. This class handles conversion between different time display formats (I...
Definition: Date.h:87
void setUndef(const bool &flag=true)
Definition: Date.cc:193
thrown when parsed data does not reflect an expected format (e.g. premature end of a line,...
Definition: IOExceptions.h:94
thrown when encountered an unexpected value (e.g. unknown name or key)
Definition: IOExceptions.h:142
bool convertString(Date &t, std::string str, const double &time_zone, std::ios_base &(*f)(std::ios_base &))
Convert a string to a date (template specialization of convertString)
Definition: IOUtils.cc:653
void toUpper(std::string &str)
Definition: IOUtils.cc:285
ThrowOptions
Definition: IOUtils.h:74
@ dothrow
Definition: IOUtils.h:74
Definition: Config.cc:31