API пользовательских функций


В данный момент все пользовательские функции реализуются посредством наследования от абстрактного класса udf_fn (User Defined FuNction) из пространства имен template_parser_ns.

Для передачи данных у класса предусмотрен перегруженный метод param. Метод принимает на вход один, два или три параметра типа std::string, либо один параметр типа std::vector<std::string>.

Класс должен информировать вызывающий процесс о количестве необходимых принимаемых переменных. Для этого служит метод accept_params(). Метод должен возвращать одно из четырех значений: ONE_PARAM (один параметр), TWO_PARAMS (два параметра), THREE_PARAMS (три параметра) или ANY_PARAMS (вектор с неограниченным количеством параметров).

Интерфейс класса приведен ниже:
namespace template_parser_ns
{
//
// Параметры, передаваемые функции
//
typedef std::vector<std::string> udf_fn_param;

//
// Функция, определяемая пользоваталем
//
class udf_fn
{
public:
        // Количество принимаемых параметров
        enum e_accept_params {ONE_PARAM, TWO_PARAMS, THREE_PARAMS, ANY_PARAMS};


        // Передача параметров
        // Произвольное число параметров
        virtual void param(udf_fn_param * pParam);

        // Один параметр
        virtual void param(const std::string &sParam);

        // Два параметра
        virtual void param(const std::string &sParam1, const std::string &sParam2);

        // Три параметра
        virtual void param(const std::string &sParam1, const std::string &sParam2, const std::string &sParam3);


        // Количество принимаемых параметров
        virtual e_accept_params accept_params() = 0;

        // Вычисление
        virtual void handler() = 0;

        // Результат вычислений
        virtual std::string & result() = 0;

        // Деструктор
        virtual ~udf_fn() { ;; }

};

} // namespace template_parser_ns



Для подключения новой пользовательской функции необходимо внести созданный класс в фабрику объектов. Есть два метода использования фабрики объектов: создание новой и использование текущей из объекта шаблонизатора. Для создания новой фабрики объектов используется класс udf_fn_factory из пространства имен template_parser_ns:

        // Создаем фабрику объектов
        template_parser_ns::udf_fn_factory * pFactory = new udf_fn_factory();

        // Создаем объект пользовательской функци
        template_parser_ns::udf_fn * pFunction = new user_function();
        // Создаем функцию в фабрике объектов
        pFactory -> install_udf_fn("FOOBAR", pFunction);

        // Создаем объект шаблонизатора
        template_text * pTemplate = new template_text(pFactory);



В случае использования текущей фабрики объектов код будет примерно следующим:

        // Создаем фабрику объектов
        template_parser_ns::udf_fn_factory * pFactory = pTemplate -> get_fn_factory();

        // Создаем объект пользовательской функци
        template_parser_ns::udf_fn * pFunction = new user_function();
        // Создаем функцию в фабрике объектов
        pFactory -> install_udf_fn("FOOBAR", pFunction);

        // Создаем объект шаблонизатора
        template_text * pTemplate = new template_text(pFactory);




Copyright © 2003 - 2005 CTPP Dev. Team | http://reki.ru/products/ctpp