#ifndef INISECTION_CLASS_HEADER
#define INISECTION_CLASS_HEADER


#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <map>


#define StdMapStringToString		std::map<std::string, std::string>
#define StdVectorString				std::vector<std::string>


//! Classe de gestion d'une section d'un fichier type .INI
/*!
	Classe gérant la structure d'une section au sein d'un fichier type .INI
	Une section contient des valeurs associées à des clefs.
*/
class CINI_Section
{
public: // méthodes publiques
	//! constructeur
	CINI_Section(void) { /* rien à faire */ }

	//! destructeur
	virtual ~CINI_Section(void) { /* rien à faire */ }

	//! ajout/modification d'une clef et d'une valeur
	void SetKey(const std::string& strKey, const std::string& strValue);

	//! recherche d'une clef et récupération de la valeur associée
	bool LookupKey(const std::string& strKey, std::string& strValue);

	//! retourne le nombre de clefs
	int GetKeysCount(void) const { return (int)m_arKeys.size(); }

	//! récupère une clef
	const std::string& GetKeyAt(const int nIndex) const;

	//! récupère l'index d'une clef
	int GetKeyIndex(const std::string& strKey);

	//! écrit une clef et sa valeur dans un fichier
	void WriteKey(const std::string& strKey, std::ofstream& ficOut);

	//! écrit une clef et sa valeur dans un fichier
	void WriteKeyAt(const int nIndex, std::ofstream& ficOut);

	//! écrit les clefs et leur valeur dans un fichier
	void WriteKeys(std::ofstream& ficOut);

	//! supprime une clef et la valeur qui lui est associée
	void RemoveKey(const std::string& strKey);

	//! supprime une clef et la valeur qui lui est associée
	void RemoveKeyAt(const int nIndex);
	
	//! supprime toutes les clefs et la valeur qui leur est associée
	void RemoveAll(void);


protected: // données protégées
	//! les associations clef/valeur
	StdMapStringToString		m_mapKeysValues;

	//! la liste des clefs pour conserver l'ordre
	StdVectorString				m_arKeys;
};

#endif // INISECTION_CLASS_HEADER
