Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

23 Commits
 
 
 
 
 
 

Repository files navigation

PPLIB - библиотека эмуляции ППП подхода в С++ без изменения компилятора и компоновщика. Библиотека состоит из набора макросов и шаблонных структур данных, реализующие табличный доступ к обработчикам специализаций.

Основные макросы библиотеки:

  • CREATE_GENERALIZATION – создание обобщения, в структуру неявно добавляется поле mark, отвечающее за идентификацию типа во время выполнения программы
  • CREATE_SPECIALIZATION – создание специализации на основе предварительно созданного обобщения и объявление инициализатора поля mark
  • DEFINE_GENERALIZATION_METHOD – определение инициализатора поля mark для созданной специализации
  • DECLARE_MM — объявление мультиметода
  • DEFINE_MM — определение мультиметода, создание массива обработчиков
  • CREATE_MM_SPEC — объявление обработчика специализации
  • REG_MM_SPEC — определение обработчика специализации, его запись в массив, выделенный макросом DEFINE_MM. Макрос REG_MM_SPEC должен быть использован в блоке между макросами BEGIN_REG_MM и END_REG_MM. Уточнение — в этом блоке может быть более одного макроса REG_MM_SPEC.

Пример использования библиотеки:

// Создание обобщения
CREATE_GENERALIZATION(Figure);
DEFINE_GENERALIZATION_METHOD(Figure);

// Основы специализаций
struct Triangle { … }; 
struct Rectangle { … }; 

// Создание специализации с именем типа FigTriangle
CREATE_SPECIALIZATION(FigTriangle, Figure, Triangle);
CREATE_REG_MARK_METHOD(FigTriangle);
REGISTER_SPECIALIZATION(Figure, FigTriangle, "Registration of: FigTriangle");

// Создание специализации с именем типа FigRectangle
CREATE_SPECIALIZATION(FigRectangle, Figure, Rectangle);
CREATE_REG_MARK_METHOD(FigRectangle);
REGISTER_SPECIALIZATION(Figure, FigRectangle, "Registration of: FigRectangle");

// Объявление мультиметода, принимающего 2 объекта с типом обобщения Figure
DECLARE_MM(MultimethodFunc, 10, Figure, ofstream&)
// Определение вышеописанного мультиметода и выделение памяти под массив обработчиков
DEFINE_MM(MultimethodFunc, 10);

// Описание функции обработки взаимодействия специализаций FigRectangle и FigTriangle
void RectTrianOut(FigRectangle&, FigTriangle&) { … }

// Создание обработчика специализации
CREATE_MM_SPEC(MmRectTrianSpecOut, Figure, FigRectangle, FigTriangle, GetRegMarkFigRectangle, GetRegMarkFigTriangle, RectTrianOut);

// Запись обработчиков специализации
BEGIN_REG_MM(MultimethodFunc);
// Запись содданного выше  MmRectTrianSpecOut
REG_MM_SPEC(MmRectTrianSpecOut, GetRegMarkFigRectangle, GetRegMarkFigTriangle);
// Запись других обработчиков (для примера)
REG_MM_SPEC(MmRectRectSpecOut, GetRegMarkFigRectangle, GetRegMarkFigRectangle);
REG_MM_SPEC(MmTrianTrianSpecOut, GetRegMarkFigTriangle, GetRegMarkFigTriangle);
REG_MM_SPEC(MmTrianRectSpecOut, GetRegMarkFigTriangle, GetRegMarkFigRectangle);
END_REG_MM("Registration of: Different combination of Triangle and Rectangle in  Multimethod");

С помощью данной библиотеки реализованы примеры расширения функциональности предварительно написанного кода (включены в репозиторий проекта)

About

Header only library for approbation of procedural-parametric code style in C++

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages