diff --git a/CodeGenerator/codegenerator.cpp b/CodeGenerator/codegenerator.cpp index 22a76de..d48e2f3 100644 --- a/CodeGenerator/codegenerator.cpp +++ b/CodeGenerator/codegenerator.cpp @@ -1993,6 +1993,7 @@ void PRCCodeGenerator::loadClasses(const QDomDocument& document) myClass.classType = className; myClass.isFlat = classElement.attribute("flat") == "true"; myClass.valueType = myClass.isFlat ? className : QString("std::shared_ptr<%1>").arg(myClass.classType); + myClass.parentType = classElement.attribute("parent"); QDomNodeList loadItems = classElement.childNodes(); for (int j = 0; j < loadItems.length(); ++j) @@ -2038,6 +2039,30 @@ QString PRCCodeGenerator::generateHeader() const stream << Qt::endl << Qt::endl; + stream << "class PDF_PRC_Object" << Qt::endl; + stream << "{" << Qt::endl; + stream << "public:" << Qt::endl; + stream << " constexpr PDF_PRC_Object() = default;" << Qt::endl; + stream << " virtual ~PDF_PRC_Object() = default;" << Qt::endl << Qt::endl; + + for (const auto& item : m_classes) + { + const Class& myClass = item.second; + + if (myClass.isValue || myClass.isFlat) + { + continue; + } + + stream << QString(" virtual %1* as%1() { return nullptr; }").arg(myClass.classType) << Qt::endl; + stream << QString(" virtual const %1* as%1() const { return nullptr; }").arg(myClass.classType) << Qt::endl; + } + + stream << Qt::endl; + stream << "};" << Qt::endl; + + stream << Qt::endl << Qt::endl; + for (const auto& item : m_classes) { const Class& myClass = item.second; @@ -2047,12 +2072,33 @@ QString PRCCodeGenerator::generateHeader() const continue; } - stream << "class " << myClass.classType << Qt::endl; + if (myClass.isFlat) + { + stream << "class " << myClass.classType << Qt::endl; + } + else + { + QString parentClass = myClass.parentType; + if (parentClass.isEmpty()) + { + parentClass = "PDF_PRC_Object"; + } + + stream << "class " << myClass.classType << QString(" : public %1").arg(parentClass) << Qt::endl; + } + stream << "{" << Qt::endl; stream << "public:" << Qt::endl; stream << QString(" explicit %1() = default;").arg(myClass.classType) << Qt::endl; stream << QString(" ~%1() = default;").arg(myClass.classType) << Qt::endl << Qt::endl; + if (!myClass.isFlat) + { + stream << QString(" virtual %1* as%1() override { return this; }").arg(myClass.classType) << Qt::endl; + stream << QString(" virtual const %1* as%1() const override { return this; }").arg(myClass.classType) << Qt::endl; + stream << Qt::endl; + } + // Generate getters/setters for (const LoadItem& loadItem : myClass.items) { @@ -2153,7 +2199,7 @@ QString PRCCodeGenerator::getClassFieldNameForValueItem(const LoadItem& item) co QString PRCCodeGenerator::getGetterFunctionNameForLoadItem(const LoadItem& item) const { - return getCamelCase(QString("is_") + item.name); + return getCamelCase(QString("get_") + item.name); } QString PRCCodeGenerator::getSetterFunctionNameForLoadItem(const LoadItem& item) const diff --git a/CodeGenerator/codegenerator.h b/CodeGenerator/codegenerator.h index 0467b6b..c17f139 100644 --- a/CodeGenerator/codegenerator.h +++ b/CodeGenerator/codegenerator.h @@ -530,6 +530,7 @@ private: { QString classType; QString valueType; + QString parentType; /// Use class by value, not by shared pointer? bool isFlat = false; diff --git a/prc/prc_format.xml b/prc/prc_format.xml index f98a15d..52db878 100644 --- a/prc/prc_format.xml +++ b/prc/prc_format.xml @@ -294,7 +294,11 @@ - + + + + + @@ -321,7 +325,7 @@ - + @@ -364,6 +368,14 @@ + + + + + + + + @@ -492,9 +504,15 @@ + + + + + + - - + + @@ -593,7 +611,7 @@ - + @@ -706,7 +724,7 @@ - + @@ -776,7 +794,10 @@ - + + + + @@ -800,18 +821,18 @@ - + - + - + @@ -826,15 +847,15 @@ - + - + - + @@ -850,7 +871,7 @@ - + @@ -1187,26 +1208,26 @@ - + - + - + - + - + @@ -1216,9 +1237,9 @@ - + - + @@ -1226,9 +1247,9 @@ - + - + @@ -1252,7 +1273,7 @@ - + @@ -1418,7 +1439,15 @@ - + + + + + + + + + @@ -1432,14 +1461,14 @@ - + - + @@ -1447,12 +1476,12 @@ - + - + @@ -1461,7 +1490,7 @@ - + @@ -1470,7 +1499,7 @@ - + @@ -1483,7 +1512,7 @@ - + @@ -1496,7 +1525,7 @@ - + @@ -1509,7 +1538,7 @@ - + @@ -1528,13 +1557,13 @@ - + - + @@ -1542,14 +1571,14 @@ - - + + - + @@ -1681,6 +1710,12 @@ + + + + + + @@ -1706,8 +1741,8 @@ - - + + @@ -1813,10 +1848,10 @@ - + - + @@ -1845,7 +1880,7 @@ - + @@ -1883,7 +1918,7 @@ - + @@ -1980,7 +2015,7 @@ - + @@ -2313,14 +2348,17 @@ + + + - + - + @@ -2328,13 +2366,13 @@ - + - - + + - + @@ -2343,7 +2381,7 @@ - + @@ -2354,16 +2392,19 @@ - + + + + - + - - + + @@ -2371,6 +2412,14 @@ + + + + + + + +