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 @@
-
+
+
+
+
+
+
+
+
@@ -492,9 +504,15 @@
+
+
-
-
+
+
+
+
@@ -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 @@
+
+
+
+
+
+
+
+