ITAConfigUtils.h 24.4 KB
Newer Older
Jonas Stienen's avatar
Jonas Stienen committed
1
/*
2 3 4 5
 * ----------------------------------------------------------------
 *
 *		ITA core libs
 *		(c) Copyright Institute of Technical Acoustics (ITA)
6
 *		RWTH Aachen University, Germany, 2015-2019
7 8 9 10 11 12 13 14 15 16 17
 *
 * ----------------------------------------------------------------
 *				    ____  __________  _______
 *				   //  / //__   ___/ //  _   |
 *				  //  /    //  /    //  /_|  |
 *				 //  /    //  /    //  ___   |
 *				//__/    //__/    //__/   |__|
 *
 * ----------------------------------------------------------------
 *
 */
Jonas Stienen's avatar
Jonas Stienen committed
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118

#ifndef INCLUDE_WATCHER_ITA_CONFIG_UTILS
#define INCLUDE_WATCHER_ITA_CONFIG_UTILS

#include <ITABaseDefinitions.h>

#include <string>
#include <vector>

/* +-----------------------------------------------------------------------------------------+
 * |                                                                                         |
 * |  Strukturelle Funktionen fr INI-Dateien (Existenz von Sektionen, Schlssel)            |
 * |                                                                                         |
 * +-----------------------------------------------------------------------------------------+ */

//! Prfen ob eine INI-Datei existiert
ITA_BASE_API bool INIFileExists(const std::string& sINIFilename);

//! Prfen ob eine INI-Datei die angegebene Sektion enthlt (Case-Insensitive!)
ITA_BASE_API bool INIFileSectionExists(const std::string& sINIFilename, const std::string& sSection);

//! Liste der Namen aller Sektionen einer INI-Datei zurckgeben
ITA_BASE_API std::vector<std::string> INIFileGetSections(const std::string& sINIFilename);

//! Prfen ob in einer Sektion einer INI-Datei der angegebene Schlssel existiert (Case-Insensitive!)
ITA_BASE_API bool INIFileKeyExists(const std::string& sINIFilename,
					  const std::string& sSection,
					  const std::string& sKey);

//! Liste der Schlsselnamen einer Sektion in einer INI-Datei zurckgeben
ITA_BASE_API std::vector<std::string> INIFileGetKeys(const std::string& sINIFilename,
										const std::string& sSection);


//! Zu benutzende INI-Datei auswhlen
/**
 * \note Falls die angegebene Datei nicht existiert wird eine ITAException ausgelst.
 */
ITA_BASE_API void INIFileUseFile(const std::string& sINIFilename);

//! Zu benutzende Sektion auswhlen
/**
 * \note Falls die angegebene Sektion nicht existiert wird eine ITAException ausgelst.
 */
ITA_BASE_API void INIFileUseSection(const std::string& sSection);

//! Sektion zur Benutzung auswhlen, falls diese existiert
/**
 * \return true  falls die Sektion existiert und ausgewhlt wurde,
 *         false falls die Sektion nicht existiert
 */
ITA_BASE_API bool INIFileUseSectionIfExists(const std::string& sSection);

//! Benutzung der INI-Datei und Sektion zurcksetzen
/**
 * \note Stellt sicher dass keine Seiteneffekte bei Fehlern auftreten und sollte benutzt werden!
 */
ITA_BASE_API void INIFileUseNothing();

/* +-----------------------------------------------------------------------------------------+
 * |                                                                                         |
 * |  Assertion-Funktionen: Lsen Ausnahmen aus, falls Bedingungen nicht erfllt sind.       |
 * |                                                                                         |
 * +-----------------------------------------------------------------------------------------+ */

//! Sicherstellen das die angegebene INI-Datei existiert
ITA_BASE_API void INIFileRequireINIFile(const std::string& sINIFilename);

//! Sicherstellen das in der gegebenen INI-Datei die gegebene Sektion existiert
ITA_BASE_API void INIFileRequireSection(const std::string& sINIFilename,
						   const std::string& sSection);

//! Sicherstellen das in der gegebenen INI-Datei der angegebene Schlssel in der gegebenen Sektion existiert
/**
 * \note Der Schlsselwert darf leer sein.
 */
ITA_BASE_API void INIFileRequireKey(const std::string& sINIFilename,
					   const std::string& sSection,
					   const std::string& sKey);

//! Sicherstellen das in der gegebenen INI-Datei der angegebene Schlssel in der gegebenen Sektion existiert und einen expliziten Wert hat
/**
 * \note Der Schlsselwert darf leer sein.
 */
ITA_BASE_API void INIFileRequireNonemptyKey(const std::string& sINIFilename,
							   const std::string& sSection,
							   const std::string& sKey);


/* +----------------------------------------------------------------------------------------------+
 * |                                                                                              |
 * |  Implizite Lese-Funktionen                                                                   |
 * |                                                                                              |
 * |  Diese Funktionen geben Standardwerte zurck falls:                                          |
 * |                                                                                              |
 * |  - die Sektion nicht existiert.                                                              |
 * |  - der Schlssel nicht existiert.                                                            |
 * |                                                                                              |
 * |  Diese Funktionen lsen Ausnahmen aus falls:                                                 |
 * |                                                                                              |
 * |  - die INI-Datei nicht existiert                                                             |
Dipl.-Ing. Jonas Stienen's avatar
Merging  
Dipl.-Ing. Jonas Stienen committed
119
 * |  - der Wert nicht als gewnschter Datentyp interpretierbar ist.                              |
Jonas Stienen's avatar
Jonas Stienen committed
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
 * |                                                                                              |
 * +----------------------------------------------------------------------------------------------+ */

//! int-Wert aus INI-Datei lesen
/**
 * \note Tritt ein Fehler auf, so wird der Standardwert zurckgegeben.
 *       Fehler knnen z.B. auftreten falls:
 *
 *       - Die angebene INI-Datei nicht existiert
 *       - Die angebene Sektion und/oder der angegebene Schlssel nicht existiert
 *       - Der vorgefundene Wert nicht als int-Wert interpretiert werden kann.
 */
ITA_BASE_API int INIFileReadInt(const std::string& sINIFilename,
				   const std::string& sSection,
				   const std::string& sKey,
				   int iDefaultValue=-1);

//! unsigned int-Wert aus INI-Datei lesen
/**
 * \note Tritt ein Fehler auf, so wird der Standardwert zurckgegeben.
 *       Mgliche Fehlerflle sind bei getReadIntFromINIFile angegeben.
 */
ITA_BASE_API unsigned int INIFileReadUInt(const std::string& sINIFilename,
							 const std::string& sSection,
							 const std::string& sKey,
					         unsigned int uiDefaultValue=0);

//! long-Wert aus INI-Datei lesen
/**
 * \note Tritt ein Fehler auf, so wird der Standardwert zurckgegeben.
 *       Mgliche Fehlerflle sind bei getReadIntFromINIFile angegeben.
 */
ITA_BASE_API long INIFileReadLong(const std::string& sINIFilename,
					 const std::string& sSection,
					 const std::string& sKey,
					 long lDefaultValue=-1);

//! float-Wert aus INI-Datei lesen
/**
 * \note Tritt ein Fehler auf, so wird der Standardwert zurckgegeben.
 *       Mgliche Fehlerflle sind bei getReadIntFromINIFile angegeben.
 */
ITA_BASE_API float INIFileReadFloat(const std::string& sINIFilename,
					   const std::string& sSection,
					   const std::string& sKey,
					   float fDefaultValue=0.0F);

//! double-Wert aus INI-Datei lesen
/**
 * \note Tritt ein Fehler auf, so wird der Standardwert zurckgegeben.
 *       Mgliche Fehlerflle sind bei getReadIntFromINIFile angegeben.
 */
ITA_BASE_API double INIFileReadDouble(const std::string& sINIFilename,
						 const std::string& sSection,
						 const std::string& sKey,
						 double dDefaultValue=0.0);

//! Booleschen Wert aus INI-Datei lesen
// Erkennt Zeichenketten Yes/No, Ja/Nein, True/False
/**
 * Diese Funktion vergleicht die vorgefundene Zeichenkette mit
 * "Ja"/"Nein", "Yes"/"No", "True"/"False" und "1"/"0". Der jeweils
 * erste Zeichenkette der oben aufgefhrten Paare ergibt den Rckgabewert
 * true.
 *
 * \note Tritt ein Fehler auf, so wird der Standardwert zurckgegeben.
 *       Mgliche Fehlerflle sind bei getReadIntFromINIFile angegeben.
 */
ITA_BASE_API bool INIFileReadBool(const std::string& sINIFilename,
					 const std::string& sSection,
					 const std::string& sKey,
					 bool bDefaultValue=false);

//! Zeichenkette aus INI-Datei lesen
/**
 * \note Tritt ein Fehler auf, so wird der Standardwert zurckgegeben.
 *       Mgliche Fehlerflle sind bei getReadIntFromINIFile angegeben.
 */
ITA_BASE_API std::string INIFileReadString(const std::string& sINIFilename,
							  const std::string& sSection,
							  const std::string& sKey,
							  std::string sDefaultValue="");

Fabian Schlieper's avatar
Fabian Schlieper committed
203 204 205 206 207 208
//! Mit Kommas getrennte Liste von Strings aus INI-Datei lesen
ITA_BASE_API std::vector<std::string> INIFileReadStringList(const std::string& sINIFilename,
											   const std::string& sSection,
											   const std::string& sKey,
									           char cSeparator=',');

Jonas Stienen's avatar
Jonas Stienen committed
209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248
//! Mit Kommas getrennte Liste von int-Werten aus INI-Datei lesen und in template Enum-Typ konvertieren
template <typename TEnum>
std::vector<TEnum> INIFileReadEnumList(const std::string& sINIFilename,
                                       const std::string& sSection,
                                       const std::string& sKey,
                                       char cSeparator=',')
{
    std::vector<std::string> vin = INIFileReadStringList(sINIFilename, sSection, sKey, cSeparator);
    std::vector<TEnum> vout;
    for( auto const& element : vin )
    {
        vout.push_back(static_cast<TEnum>(atoi(element.c_str())));
    }
    return vout;
};

//! Mit Kommas getrennte Liste von int-Werten aus INI-Datei lesen
ITA_BASE_API std::vector<int> INIFileReadIntList(const std::string& sINIFilename,
									const std::string& sSection,
									const std::string& sKey,
									char cSeparator=',');

//! Mit Kommas getrennte Liste von unsigned int-Werten aus INI-Datei lesen
ITA_BASE_API std::vector<unsigned int> INIFileReadUIntList(const std::string& sINIFilename,
											  const std::string& sSection,
											  const std::string& sKey,
									          char cSeparator=',');

//! Mit Kommas getrennte Liste von float-Werten aus INI-Datei lesen
ITA_BASE_API std::vector<float> INIFileReadFloatList(const std::string& sINIFilename,
										const std::string& sSection,
										const std::string& sKey,
									    char cSeparator=',');

//! Mit Kommas getrennte Liste von double-Werten aus INI-Datei lesen
ITA_BASE_API std::vector<double> INIFileReadDoubleList(const std::string& sINIFilename,
									      const std::string& sSection,
										  const std::string& sKey,
									      char cSeparator=',');

Fabian Schlieper's avatar
Fabian Schlieper committed
249

Jonas Stienen's avatar
Jonas Stienen committed
250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530

/* +-----------------------------------------------------------------------------------------+
 * |                                                                                         |
 * |  Explizite Lese-Funktionen.                                                             |
 * |                                                                                         |
 * |  Diese Funktionen haben niemals Standardwerte und lsen Ausnahmen aus sobald:           |
 * |                                                                                         |
 * |  - die INI-Datei nicht existiert                                                        |
 * |  - die Sektion nicht existiert.                                                         |
 * |  - der Schlssel nicht existiert.                                                       |
 * |  - der Schlsselwert leer ist.                                                          |
 * |  - der Wert nicht als gewnschter Datentyp interpretierbar ist.                         |              |
 * |                                                                                         |
 * +-----------------------------------------------------------------------------------------+ */

//! int-Wert aus INI-Datei lesen (explizit)
ITA_BASE_API int INIFileReadIntExplicit(const std::string& sINIFilename,
				           const std::string& sSection,
				           const std::string& sKey);

//! unsigned int-Wert aus INI-Datei lesen (explizit)
ITA_BASE_API unsigned int INIFileReadUIntExplicit(const std::string& sINIFilename,
							         const std::string& sSection,
							         const std::string& sKey);

//! long-Wert aus INI-Datei lesen (explizit)
ITA_BASE_API long INIFileReadLongExplicit(const std::string& sINIFilename,
					         const std::string& sSection,
					         const std::string& sKey);

//! float-Wert aus INI-Datei lesen (explizit)
ITA_BASE_API float INIFileReadFloatExplicit(const std::string& sINIFilename,
					           const std::string& sSection,
					           const std::string& sKey);

//! double-Wert aus INI-Datei lesen (explizit)
ITA_BASE_API double INIFileReadDoubleExplicit(const std::string& sINIFilename,
						         const std::string& sSection,
						         const std::string& sKey);

//! Booleschen Wert aus INI-Datei lesen (explizit)
ITA_BASE_API bool INIFileReadBoolExplicit(const std::string& sINIFilename,
					         const std::string& sSection,
					         const std::string& sKey);

//! Zeichenkette aus INI-Datei lesen (explizit)
ITA_BASE_API std::string INIFileReadStringExplicit(const std::string& sINIFilename,
							          const std::string& sSection,
							          const std::string& sKey);

//! Mit Kommas getrennte Liste von int-Werten aus INI-Datei lesen (explizit)
ITA_BASE_API std::vector<int> INIFileReadIntListExplicit(const std::string& sINIFilename,
									        const std::string& sSection,
									        const std::string& sKey,
									        char cSeparator=',');

//! Mit Kommas getrennte Liste von unsigned int-Werten aus INI-Datei lesen (explizit)
ITA_BASE_API std::vector<unsigned int> INIFileReadUIntListExplicit(const std::string& sINIFilename,
											          const std::string& sSection,
											          const std::string& sKey,
									                  char cSeparator=',');

//! Mit Kommas getrennte Liste von float-Werten aus INI-Datei lesen (explizit)
ITA_BASE_API std::vector<float> INIFileReadFloatListExplicit(const std::string& sINIFilename,
										        const std::string& sSection,
										        const std::string& sKey,
									            char cSeparator=',');

//! Mit Kommas getrennte Liste von double-Werten aus INI-Datei lesen (explizit)
ITA_BASE_API std::vector<double> INIFileReadDoubleListExplicit(const std::string& sINIFilename,
									              const std::string& sSection,
										          const std::string& sKey,
									              char cSeparator=',');

//! Mit Kommas getrennte Liste von Strings aus INI-Datei lesen
ITA_BASE_API std::vector<std::string> INIFileReadStringListExplicit(const std::string& sINIFilename,
											           const std::string& sSection,
											           const std::string& sKey,
									                   char cSeparator=',');

/* +-----------------------------------------------------------------------------------------+
 * |                                                                                         |
 * |  Schreibfunktionen                                                                      |
 * |                                                                                         |
 * |  - Existiert eine INI-Datei nicht, so wird sie angelegt.                                |
 * |  - Existiert eine Sektion nicht, so wird sie angelegt.                                  |
 * |  - Existiert ein Schlssel bereits, so wird sein Wert berschrieben                     |
 * |                                                                                         |
 * +-----------------------------------------------------------------------------------------+ */

//! int-Wert in eine INI-Datei schreiben
/**
 * \return true falls erfolgreich, false sonst
 */
ITA_BASE_API bool INIFileWriteInt(const std::string& sINIFilename, const std::string& sSection, const std::string& sKey, int iValue);

//! unsigned int-Wert in eine INI-Datei schreiben
/**
 * \return true falls erfolgreich, false sonst
 */
ITA_BASE_API bool INIFileWriteUInt(const std::string& sINIFilename, const std::string& sSection, const std::string& sKey, unsigned int uiValue);

//! long-Wert in eine INI-Datei schreiben
/**
 * \return true falls erfolgreich, false sonst
 */
ITA_BASE_API bool INIFileWriteLong(const std::string& sINIFilename, const std::string& sSection, const std::string& sKey, long lValue);

//! float-Wert in eine INI-Datei schreiben
/**
 * \param iDecimalPlaces Anzahl der Nachkommastellen [optional]
 * \return true falls erfolgreich, false sonst
 */
ITA_BASE_API bool INIFileWriteFloat(const std::string& sINIFilename, const std::string& sSection, const std::string& sKey, float fValue, int iDecimalPlaces = -1);

//! double-Wert in eine INI-Datei schreiben
/**
 * \param iDecimalPlaces Anzahl der Nachkommastellen [optional]
 * \return true falls erfolgreich, false sonst
 */
ITA_BASE_API bool INIFileWriteDouble(const std::string& sINIFilename, const std::string& sSection, const std::string& sKey, double dValue, int iDecimalPlaces = -1);

//! bool-Wert in eine INI-Datei schreiben
/**
 * \note Fr true wird 1 geschrieben und fr false 0
 * \return true falls erfolgreich, false sonst
 */
ITA_BASE_API bool INIFileWriteBool(const std::string& sINIFilename, const std::string& sSection, const std::string& sKey, bool bValue);

//! Zeichenkette in eine INI-Datei schreiben
/**
 * \return true falls erfolgreich, false sonst
 */
ITA_BASE_API bool INIFileWriteString(const std::string& sINIFilename, const std::string& sSection, const std::string& sKey, const std::string& sValue);


//! Liste von Enum-Werten (konvertiert nach int) in eine INI-Datei schreiben
/**
* \return true falls erfolgreich, false sonst
*/
template <typename TEnum>
bool INIFileWriteEnumList(const std::string& sINIFilename,
                          const std::string& sSection,
                          const std::string& sKey,
                          const std::vector<TEnum>& veValues,
                          std::string sSeparator = ", ")
{
    return INIFileWriteString(sINIFilename, sSection, sKey, EnumVecToString(veValues, sSeparator));
};


//! Liste von int-Werten in eine INI-Datei schreiben
/**
 * \return true falls erfolgreich, false sonst
 */
ITA_BASE_API bool INIFileWriteIntList(const std::string& sINIFilename, const std::string& sSection, const std::string& sKey,
						 const std::vector<int>& viValues,
						 std::string sSeparator=", ");

//! Liste von unsigned int-Werten in eine INI-Datei schreiben
/**
 * \return true falls erfolgreich, false sonst
 */
ITA_BASE_API bool INIFileWriteUIntList(const std::string& sINIFilename,
						  const std::string& sSection,
						  const std::string& sKey,
						  const std::vector<unsigned int>& vuiValues,
						  std::string sSeparator=", ");

//! Liste von float-Werten in eine INI-Datei schreiben
/**
 * \return true falls erfolgreich, false sonst
 */
ITA_BASE_API bool INIFileWriteFloatList(const std::string& sINIFilename,
						   const std::string& sSection,
						   const std::string& sKey,
						   const std::vector<float>& vfValues,
						   std::string sSeparator=", ");

//! Liste von double-Werten in eine INI-Datei schreiben
/**
 * \return true falls erfolgreich, false sonst
 */
ITA_BASE_API bool INIFileWriteDoubleList(const std::string& sINIFilename,
						    const std::string& sSection,
						    const std::string& sKey,
						    const std::vector<double>& vdValues,
						    std::string sSeparator=", ");

//! Liste von Strings in eine INI-Datei schreiben
/**
 * \return true falls erfolgreich, false sonst
 */
ITA_BASE_API bool INIFileWriteStringList(const std::string& sINIFilename,
						    const std::string& sSection,
						    const std::string& sKey,
							const std::vector<std::string>& vsValues,
						    std::string sSeparator=", ");

/* +-----------------------------------------------------------------------------------------+
 * |                                                                                         |
 * |  Alias-Funktionen fr vorausgewhlte INI-Dateien und Sektionen                          |
 * |                                                                                         |
 * +-----------------------------------------------------------------------------------------+ */


ITA_BASE_API bool INIFileSectionExists(const std::string& sSection);
ITA_BASE_API std::vector<std::string> INIFileGetSections();
ITA_BASE_API bool INIFileKeyExists(const std::string& sKey);
ITA_BASE_API std::vector<std::string> INIFileGetKeys(const std::string& sSection);

ITA_BASE_API void INIFileRequireSection(const std::string& sSection);
ITA_BASE_API void INIFileRequireKey(const std::string& sKey);
ITA_BASE_API void INIFileRequireNonemptyKey(const std::string& sKey);

ITA_BASE_API int INIFileReadInt(const std::string& sKey,
				   int iDefaultValue=-1);
ITA_BASE_API unsigned int INIFileReadUInt(const std::string& sKey,
					         unsigned int uiDefaultValue=0);
ITA_BASE_API long INIFileReadLong(const std::string& sKey,
					 long lDefaultValue=-1);
ITA_BASE_API float INIFileReadFloat(const std::string& sKey,
					   float fDefaultValue=0.0F);
ITA_BASE_API double INIFileReadDouble(const std::string& sKey,
						 double dDefaultValue=0.0);
ITA_BASE_API bool INIFileReadBool(const std::string& sKey,
					 bool bDefaultValue=false);
ITA_BASE_API std::string INIFileReadString(const std::string& sKey,
							  std::string sDefaultValue="");
ITA_BASE_API std::vector<int> INIFileReadIntList(const std::string& sKey,
									char cSeparator=',');
ITA_BASE_API std::vector<unsigned int> INIFileReadUIntList(const std::string& sKey,
									          char cSeparator=',');
ITA_BASE_API std::vector<float> INIFileReadFloatList(const std::string& sKey,
									    char cSeparator=',');
ITA_BASE_API std::vector<double> INIFileReadDoubleList(const std::string& sKey,
									      char cSeparator=',');
ITA_BASE_API std::vector<std::string> INIFileReadStringList(const std::string& sKey,
									           char cSeparator=',');

ITA_BASE_API int INIFileReadIntExplicit(const std::string& sKey);
ITA_BASE_API unsigned int INIFileReadUIntExplicit(const std::string& sKey);
ITA_BASE_API long INIFileReadLongExplicit(const std::string& sKey);
ITA_BASE_API float INIFileReadFloatExplicit(const std::string& sKey);
ITA_BASE_API double INIFileReadDoubleExplicit(const std::string& sKey);
ITA_BASE_API bool INIFileReadBoolExplicit(const std::string& sKey);
ITA_BASE_API std::string INIFileReadStringExplicit(const std::string& sKey);
ITA_BASE_API std::vector<int> INIFileReadIntListExplicit(const std::string& sKey,
									        char cSeparator=',');
ITA_BASE_API std::vector<unsigned int> INIFileReadUIntListExplicit(const std::string& sKey,
									                  char cSeparator=',');
ITA_BASE_API std::vector<float> INIFileReadFloatListExplicit(const std::string& sKey,
									            char cSeparator=',');
ITA_BASE_API std::vector<double> INIFileReadDoubleListExplicit(const std::string& sKey,
												  char cSeparator=',');
ITA_BASE_API std::vector<std::string> INIFileReadStringListExplicit(const std::string& sKey,
									                   char cSeparator=',');
ITA_BASE_API bool INIFileWriteInt(const std::string& sKey, int iValue);
ITA_BASE_API bool INIFileWriteUInt(const std::string& sKey, unsigned int uiValue);
ITA_BASE_API bool INIFileWriteLong(const std::string& sKey, long lValue);
ITA_BASE_API bool INIFileWriteFloat(const std::string& sKey, float fValue, int iDecimalPlaces = -1);
ITA_BASE_API bool INIFileWriteDouble(const std::string& sKey, double dValue, int iDecimalPlaces = -1);
ITA_BASE_API bool INIFileWriteBool(const std::string& sKey, bool bValue);
ITA_BASE_API bool INIFileWriteString(const std::string& sKey, const std::string& sValue);
ITA_BASE_API bool INIFileWriteIntList(const std::string& sKey,
						 const std::vector<int>& viValues,
						 std::string sSeparator=", ");
ITA_BASE_API bool INIFileWriteUIntList(const std::string& sKey,
						  const std::vector<unsigned int>& vuiValues,
						  std::string sSeparator=", ");
ITA_BASE_API bool INIFileWriteFloatList(const std::string& sKey,
						   const std::vector<float>& vfValues,
						   std::string sSeparator=", ");
ITA_BASE_API bool INIFileWriteDoubleList(const std::string& sKey,
						    const std::vector<double>& vdValues,
						    std::string sSeparator=", ");
ITA_BASE_API bool INIFileWriteStringList(const std::string& sKey,
							const std::vector<std::string>& vsValues,
						    std::string sSeparator=", ");

#endif // INCLUDE_WATCHER_ITA_CONFIG_UTILS