9#ifndef CConfigFileBase_H
10#define CConfigFileBase_H
23 template <
typename ENUMTYPE>
struct TEnumType;
24 class CConfigFilePrefixer;
36 virtual void writeString(
const std::string §ion,
const std::string &name,
const std::string &str) = 0;
39 void writeString(
const std::string §ion,
const std::string &name,
const std::string &str,
const int name_padding_width,
const int value_padding_width,
const std::string &comment);
45 const std::string §ion,
46 const std::string &name,
47 const std::string &defaultStr,
48 bool failIfNotFound =
false)
const = 0;
70 void write(
const std::string §ion,
const std::string &name,
double value,
const int name_padding_width=-1,
const int value_padding_width=-1,
const std::string &comment = std::string() );
71 void write(
const std::string §ion,
const std::string &name,
float value ,
const int name_padding_width=-1,
const int value_padding_width=-1,
const std::string &comment = std::string() );
72 void write(
const std::string §ion,
const std::string &name,
int value ,
const int name_padding_width=-1,
const int value_padding_width=-1,
const std::string &comment = std::string() );
73 void write(
const std::string §ion,
const std::string &name,
uint32_t value ,
const int name_padding_width=-1,
const int value_padding_width=-1,
const std::string &comment = std::string() );
74 void write(
const std::string §ion,
const std::string &name, uint64_t value,
const int name_padding_width=-1,
const int value_padding_width=-1,
const std::string &comment = std::string() );
75 void write(
const std::string §ion,
const std::string &name,
const std::string &value ,
const int name_padding_width=-1,
const int value_padding_width=-1,
const std::string &comment = std::string() );
76 void write(
const std::string §ion,
const std::string &name,
const std::vector<int> &value ,
const int name_padding_width=-1,
const int value_padding_width=-1,
const std::string &comment = std::string() );
77 void write(
const std::string §ion,
const std::string &name,
const std::vector<unsigned int> &value,
const int name_padding_width=-1,
const int value_padding_width=-1,
const std::string &comment = std::string() );
78 void write(
const std::string §ion,
const std::string &name,
const std::vector<float> &value ,
const int name_padding_width=-1,
const int value_padding_width=-1,
const std::string &comment = std::string() );
79 void write(
const std::string §ion,
const std::string &name,
const std::vector<double> &value,
const int name_padding_width=-1,
const int value_padding_width=-1,
const std::string &comment = std::string() );
80 void write(
const std::string §ion,
const std::string &name,
const std::vector<bool> &value ,
const int name_padding_width=-1,
const int value_padding_width=-1,
const std::string &comment = std::string() );
86 double read_double(
const std::string §ion,
const std::string &name,
double defaultValue,
bool failIfNotFound =
false)
const;
91 float read_float(
const std::string §ion,
const std::string &name,
float defaultValue,
bool failIfNotFound =
false)
const;
96 bool read_bool(
const std::string §ion,
const std::string &name,
bool defaultValue,
bool failIfNotFound =
false)
const;
101 int read_int(
const std::string §ion,
const std::string &name,
int defaultValue,
bool failIfNotFound =
false)
const;
106 uint64_t
read_uint64_t(
const std::string §ion,
const std::string &name, uint64_t defaultValue,
bool failIfNotFound =
false )
const;
111 std::string
read_string(
const std::string §ion,
const std::string &name,
const std::string &defaultValue,
bool failIfNotFound =
false)
const;
116 std::string
read_string_first_word(
const std::string §ion,
const std::string &name,
const std::string &defaultValue,
bool failIfNotFound =
false)
const;
121 template <
class VECTOR_TYPE>
123 const std::string & section,
124 const std::string & name,
125 const VECTOR_TYPE & defaultValue,
126 VECTOR_TYPE & outValues,
127 bool failIfNotFound =
false)
const
129 std::string aux ( readString(section, name,
"",failIfNotFound ) );
131 std::vector<std::string> tokens;
134 if (tokens.size()==0)
136 outValues = defaultValue;
141 const size_t N = tokens.size();
142 outValues.resize( N );
143 for (
size_t i=0;i<N;i++)
145 std::stringstream ss(tokens[i]);
156 template <
class MATRIX_TYPE>
158 const std::string §ion,
159 const std::string &name,
160 MATRIX_TYPE &outMatrix,
161 const MATRIX_TYPE &defaultMatrix = MATRIX_TYPE(),
162 bool failIfNotFound =
false )
const
164 std::string aux = readString(section, name,
"",failIfNotFound );
166 outMatrix = defaultMatrix;
170 if (!outMatrix.fromMatlabStringFormat(aux))
193 template <
typename ENUMTYPE>
194 ENUMTYPE
read_enum(
const std::string §ion,
const std::string &name,
const ENUMTYPE &defaultValue,
bool failIfNotFound =
false)
const
197 const std::string sVal = read_string_first_word(section,name,
"",failIfNotFound);
198 if (sVal.empty())
return defaultValue;
200 if (::isdigit(sVal[0]))
202 return static_cast<ENUMTYPE
>(::atoi(&sVal[0]));
208 }
catch (std::exception &)
210 THROW_EXCEPTION(
format(
"Invalid value '%s' for enum type while reading key='%s'.",sVal.c_str(),name.c_str()))
222#define MRPT_LOAD_CONFIG_VAR(variableName,variableType,configFileObject,sectionNameStr) \
223 { variableName = configFileObject.read_##variableType(sectionNameStr,#variableName,variableName); }
227#define MRPT_LOAD_CONFIG_VAR_DEGREES(variableName,configFileObject,sectionNameStr) \
228 { variableName = DEG2RAD( configFileObject.read_float(sectionNameStr,#variableName, RAD2DEG(variableName)) ); }
230#define MRPT_LOAD_CONFIG_VAR_CAST(variableName,variableType,variableTypeCast,configFileObject,sectionNameStr) \
231 { variableName = static_cast<variableTypeCast>(configFileObject.read_##variableType(sectionNameStr,#variableName,variableName)); }
234#define MRPT_LOAD_HERE_CONFIG_VAR(variableName,variableType,targetVariable,configFileObject,sectionNameStr) \
235 targetVariable = configFileObject.read_##variableType(sectionNameStr,#variableName,targetVariable,false);
237#define MRPT_LOAD_HERE_CONFIG_VAR_NO_DEFAULT(variableName,variableType,targetVariable,configFileObject,sectionNameStr) \
239 targetVariable = configFileObject.read_##variableType(sectionNameStr,#variableName,targetVariable,true); \
240 } catch (std::exception &) \
242 THROW_EXCEPTION( format( "Value for '%s' not found in config file", static_cast<const char*>(#variableName ) )); \
246#define MRPT_LOAD_CONFIG_VAR_NO_DEFAULT(variableName,variableType,configFileObject,sectionNameStr) \
248 variableName = configFileObject.read_##variableType(sectionNameStr,#variableName,variableName,true); \
249 } catch (std::exception &) \
251 THROW_EXCEPTION( format( "Value for '%s' not found in config file", static_cast<const char*>(#variableName ) )); \
254#define MRPT_LOAD_CONFIG_VAR_CAST_NO_DEFAULT(variableName,variableType,variableTypeCast,configFileObject,sectionNameStr) \
256 variableName = static_cast<variableTypeCast>(configFileObject.read_##variableType(sectionNameStr,#variableName,variableName,true)); \
257 } catch (std::exception &) \
259 THROW_EXCEPTION( format( "Value for '%s' not found in config file", static_cast<const char*>(#variableName ) )); \
263#define MRPT_LOAD_HERE_CONFIG_VAR_CAST(variableName,variableType,variableTypeCast,targetVariable,configFileObject,sectionNameStr) \
264 targetVariable = static_cast<variableTypeCast>(configFileObject.read_##variableType(sectionNameStr,#variableName,targetVariable));
266#define MRPT_LOAD_HERE_CONFIG_VAR_CAST_NO_DEFAULT(variableName,variableType,variableTypeCast,targetVariable,configFileObject,sectionNameStr) \
268 targetVariable = static_cast<variableTypeCast>(configFileObject.read_##variableType(sectionNameStr,#variableName,targetVariable,true)); \
269 } catch (std::exception &) \
271 THROW_EXCEPTION( format( "Value for '%s' not found in config file", static_cast<const char*>(#variableName ) )); \
275#define MRPT_SAVE_CONFIG_VAR(variableName,configFileObject,sectionNameStr) \
276 { configFileObject.write(sectionNameStr,#variableName,variableName); }
278#define MRPT_SAVE_CONFIG_VAR_DEGREES(variableName,configFileObject,sectionNameStr) \
279 { configFileObject.write(sectionNameStr,#variableName, RAD2DEG(variableName)); }
This class allows loading and storing values and vectors of different types from a configuration text...
void writeString(const std::string §ion, const std::string &name, const std::string &str, const int name_padding_width, const int value_padding_width, const std::string &comment)
Write a generic string with optional padding and a comment field ("// ...") at the end of the line.
bool sectionExists(const std::string §ion_name) const
Checks if a given section exists (name is case insensitive)
void write(const std::string §ion, const std::string &name, const std::vector< float > &value, const int name_padding_width=-1, const int value_padding_width=-1, const std::string &comment=std::string())
virtual void writeString(const std::string §ion, const std::string &name, const std::string &str)=0
A virtual method to write a generic string.
bool read_bool(const std::string §ion, const std::string &name, bool defaultValue, bool failIfNotFound=false) const
Reads a configuration parameter of type "bool", codified as "1"/"0" or "true"/"false" or "yes"/"no" f...
void write(const std::string §ion, const std::string &name, uint64_t value, const int name_padding_width=-1, const int value_padding_width=-1, const std::string &comment=std::string())
void read_vector(const std::string §ion, const std::string &name, const VECTOR_TYPE &defaultValue, VECTOR_TYPE &outValues, bool failIfNotFound=false) const
Reads a configuration parameter of type vector, stored in the file as a string: "[v1 v2 v3 ....
void write(const std::string §ion, const std::string &name, const std::string &value, const int name_padding_width=-1, const int value_padding_width=-1, const std::string &comment=std::string())
virtual void getAllKeys(const std::string §ion, vector_string &keys) const =0
Returs a list with all the keys into a section.
ENUMTYPE read_enum(const std::string §ion, const std::string &name, const ENUMTYPE &defaultValue, bool failIfNotFound=false) const
Reads an "enum" value, where the value in the config file can be either a numerical value or the symb...
void read_matrix(const std::string §ion, const std::string &name, MATRIX_TYPE &outMatrix, const MATRIX_TYPE &defaultMatrix=MATRIX_TYPE(), bool failIfNotFound=false) const
Reads a configuration parameter as a matrix written in a matlab-like format - for example: "[2 3 4 ; ...
virtual ~CConfigFileBase()
Virtual destructor...
void write(const std::string §ion, const std::string &name, const std::vector< unsigned int > &value, const int name_padding_width=-1, const int value_padding_width=-1, const std::string &comment=std::string())
std::string read_string(const std::string §ion, const std::string &name, const std::string &defaultValue, bool failIfNotFound=false) const
Reads a configuration parameter of type "string".
void write(const std::string §ion, const std::string &name, const std::vector< bool > &value, const int name_padding_width=-1, const int value_padding_width=-1, const std::string &comment=std::string())
void write(const std::string §ion, const std::string &name, const std::vector< double > &value, const int name_padding_width=-1, const int value_padding_width=-1, const std::string &comment=std::string())
float read_float(const std::string §ion, const std::string &name, float defaultValue, bool failIfNotFound=false) const
Reads a configuration parameter of type "float".
void write(const std::string §ion, const std::string &name, double value, const int name_padding_width=-1, const int value_padding_width=-1, const std::string &comment=std::string())
uint64_t read_uint64_t(const std::string §ion, const std::string &name, uint64_t defaultValue, bool failIfNotFound=false) const
Reads a configuration parameter of type "uint64_t": As in all other methods, the numeric value can be...
void write(const std::string §ion, const std::string &name, float value, const int name_padding_width=-1, const int value_padding_width=-1, const std::string &comment=std::string())
void write(const std::string §ion, const std::string &name, uint32_t value, const int name_padding_width=-1, const int value_padding_width=-1, const std::string &comment=std::string())
void write(const std::string §ion, const std::string &name, int value, const int name_padding_width=-1, const int value_padding_width=-1, const std::string &comment=std::string())
double read_double(const std::string §ion, const std::string &name, double defaultValue, bool failIfNotFound=false) const
Reads a configuration parameter of type "double".
virtual std::string readString(const std::string §ion, const std::string &name, const std::string &defaultStr, bool failIfNotFound=false) const =0
A virtual method to read a generic string.
std::string read_string_first_word(const std::string §ion, const std::string &name, const std::string &defaultValue, bool failIfNotFound=false) const
Reads a configuration parameter of type "string", and keeps only the first word (this can be used to ...
void write(const std::string §ion, const std::string &name, const std::vector< int > &value, const int name_padding_width=-1, const int value_padding_width=-1, const std::string &comment=std::string())
int read_int(const std::string §ion, const std::string &name, int defaultValue, bool failIfNotFound=false) const
Reads a configuration parameter of type "int".
virtual void getAllSections(vector_string §ions) const =0
Returns a list with all the section names.
A wrapper for other CConfigFileBase-based objects that prefixes a given token to every key and/or sec...
std::vector< std::string > vector_string
A type for passing a vector of strings.
void BASE_IMPEXP tokenize(const std::string &inString, const std::string &inDelimiters, std::deque< std::string > &outTokens, bool skipBlankTokens=true) MRPT_NO_THROWS
Tokenizes a string according to a set of delimiting characters.
#define THROW_EXCEPTION_CUSTOM_MSG1(msg, param1)
#define THROW_EXCEPTION(msg)
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
std::string BASE_IMPEXP format(const char *fmt,...) MRPT_printf_format_check(1
A std::string version of C sprintf.
static ENUMTYPE name2value(const std::string &name)
Gives the numerical name for a given enum text name.