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