Гена

Генератор C++ кода

Гена — удобный набор абстракций для генерации C++-кода. Хочешь писать на плюсах плюсами? Генерируй Геной!

Например:

// Создадим пару файлов: test.h и test.cpp
Gena::FilePair files("test");

// Объявим в них пространство имён Bio
Gena::Namespace bio("Bio");
files.namespaces << &bio;

// В заголовок добавим forward declaration класса Bio::Person,
// а в исходнике проинклюдим из person.h
bio.forwardDeclarations << new Gena::ForwardDeclaration("Person");
files.cppIncludes << new Gena::Include("person.h");

// Создадим класс Bio::Crocodile
Gena::Class crocodile("Crocodile");
bio.classes << &crocodile;

// Пусть у крокодила будет вес, по умолчанию равный 1000 кг
crocodile.fields << new Gena::Field(Gena::Private, "int", "weight", "1000");

// Добавим публичный метод eat(Person* person)
// При поедании человека крокодил прибавляет в весе
crocodile.methods << new Gena::Method(
    Gena::Public, "void", "eat", {"Person* person"},
    "weight += person->height;"
);

Теперь при вызове files.generateDeclaration() получится это:

#ifndef TEST_H
#define TEST_H

namespace Bio
{
  class Person;

  class Crocodile
  {
    int weight = 1000;
  
  public:
    void eat(Person* person);
  };
}

#endif // TEST_H

А при вызове files.generateImplementation() — это:

#include "test.h"

#include "person.h"

void Bio::Crocodile::eat(Person* person)
{
  weight += person->height;
}

Не любой код можно сгенерировать Геной, но для многих стандартных ситуаций, когда нужно преобразовать некоторую схему в класс с определёнными полями и методами, этого хватит. Пожелания по улучшению Гены принимаются.


Смотреть исходники

Для работы Гены нужно всего лишь подключить один файлик:

#include <gena.h>

Сам Гена требует C++11 и Qt5 Core.