#ifndef CONFIG_CLASSES_H
#define CONFIG_CLASSES_H
#include <string>
#include <map>
#ifndef Revision
#define Revision "config.h $Revision: 1.3 $"
#endif
/**
 * Хранение конфигурации. Допустимо использование нескольких файлов конфигурациию.
 * Для загрузки конфигурации используется интерфейс драйверов. Допустимо создание и использование одновременно нескольких хранилищ конфигурации с разными (или одинаковыми) драйверами.
 * Обеспечивается многопоточная безопасность.
 *@author Denis A. Birukov aka Messenger of death
 *@date 18.08.2005
 */
class Config_Features
{
    public:
        /**
         *                      Запрос способности хранилища сохранять данные.
         * @return true - если  поддерживает
         * @author Denis A. Birukov aka Messenger of death
         * @date 23.08.2005
         */
        virtual bool _support_save() { return false;}
        /**
          *                      Запрос способности хранилища загружать данные.
          * @return true - если  поддерживает
          * @author Denis A. Birukov aka Messenger of death
          * @date 23.08.2005
         */
        virtual bool _support_load() { return false;}
        virtual ~Config_Features() {}
};
/**
 * Класс для выполнения действий над множествами значений
 */
class config_functor
{
    public:
        virtual void operator() ( std::pair<std::string, std::string> value ) = 0;
	virtual ~config_functor(){};
};
class Config_Interface
{
    public:
        /**
         *                      Запрос возможностей хранилища
         * @return константная ссылка на объект возможностей.
         * @author Denis A. Birukov aka Messenger of death
         * @date 23.08.2005
         */
        virtual const Config_Features& _get_features() = 0;

        /**
         *                      Запрос имени драйвера
         * @return имя драйвера
         * @author Denis A. Birukov aka Messenger of death
         * @date 23.08.2005
         */
        virtual std::string _get_driver_name() = 0;

        /**
         *                      Получение значения. В случае, если указанного значения несуществует, то оно будет создано со значением def
         * @param name Имя значения, которое требуется получить
         * @param def Значение по умолчанию
         * @return Запрашиваемое значение
         * @author Denis A. Birukov aka Messenger of death
         * @date 23.08.2005
         */
        virtual std::string _get_value ( std::string name, std::string def ) = 0;

        /**
         *                      Установка значения
         * @param name Имя значения, которое требуется установить
         * @param val Значение .
         * @param replace флаг перезаписи значения, если оно уже существует. По умолчанию значение перетирается.
         * @return true - если удалось установить значение
         * @author Denis A. Birukov aka Messenger of death
         * @date 23.08.2005
         */
        virtual bool _set_value ( std::string name, std::string val, bool replace = true ) = 0;

        /**
         *                      Удаление значения.
         * @param name Имя значения, которое требуется удалить.
         * @param is_delete_subvalues Удалять ли все подмножества значения. Если true будут удалены все подмножества (т.е. при Some->Something  будет удалено Some->Something, Some->Something->*)
         * @return кол-во удаленных записей
         * @author Denis A. Birukov aka Messenger of death
         * @date 16.03.2009
         */
        virtual int _del_value ( std::string name, bool is_delete_subvalues = false ) = 0;

        /**
         * Применяет указанный функтор для всех элементов
         * @param functor функтор который требуется применить
         * @author Denis A. Birukov aka Messenger of death
         * @date 16.03.2009
         */
        virtual void for_each ( config_functor *functor ) = 0;

        /**
         *                      Сохранение
         * @param params указатель на массив строк-параметров
         * @param params_num количество параметров
         * @return true - если сохранение было осуществлено, false иначе.
         * @author Denis A. Birukov aka Messenger of death
         * @date 23.08.2005
         */
        virtual bool _save ( std::string *params, int params_num ) { return false;}

        /**
          *                      Загрузка
          * @param params указатель на массив строк-параметров
          * @param params_num количество параметров
          * @return true - если загрузка была осуществлена, false иначе.
          * @author Denis A. Birukov aka Messenger of death
          * @date 23.08.2005
         */
        virtual bool _load ( std::string *params, int params_num ) { return false;}

        Config_Interface() {}
        virtual ~Config_Interface() {}
};


#endif
