#ifndef INIFILE_CLASS_HEADER
#define INIFILE_CLASS_HEADER


#include "INI_Section.h"


#define StdMapStringToSectionPtr		std::map<std::string, CINI_Section*>


//! Classe de gestion d'un fichier type .INI
/*!
	Classe gérant la structure d'un fichier type .INI contenant des sections
	et des valeurs associées à des clefs.
*/
class CINI_File
{
public: // méthodes publiques
	//! constructeur
	CINI_File(void) { /* rien à faire */ }

	//! destructeur
	virtual ~CINI_File(void) { RemoveAll(); }

	//! chargement d'un fichier INI
	bool Load(const std::string& strFilename);

	//! sauvegarde sous forme d'un fichier INI
	bool Save(const std::string& strFilename);

	//! recherche et création d'une section
	CINI_Section* CreateSection(const std::string& strSection);

	//! recherche d'une section
	bool LookupSection(const std::string& strSection, CINI_Section*& pSection);

	//! retourne le nombre de sections
	int GetSectionsCount(void) const { return (int)m_arSections.size(); };

	//! retourne le pointeur vers la section demandée
	CINI_Section* GetSectionAt(const int nIndex);

	//! retourne l'index de la section demandée
	int GetSectionIndex(const std::string& strSection);

	//! supprime la section complète
	bool RemoveSection(const std::string& strSection);

	//! supprime la section complète
	void RemoveSectionAt(const int nIndex);

	//! supprime toutes les sections
	void RemoveAll(void);


protected:
	//! une petite méthode pour supprimer les blancs au début et à la fin d'une chaine
	void Trim(std::string& str);


protected: // données protégées
	//! la map associant chaque section (qui se doit d'être unique) à l'objet CINI_Section (sous forme de pointeur)
	StdMapStringToSectionPtr	m_mapSections;

	//! la liste des sections pour conserver l'ordre
	StdVectorString				m_arSections;
};

#endif // INIFILE_CLASS_HEADER
