pip_cmg now use forward-declaration for stream operators

This commit is contained in:
2021-05-05 19:15:14 +03:00
parent 3c3a8ea177
commit 0fcb4e5c4b

View File

@@ -274,7 +274,18 @@ void writeClassStreamMembersIn(PIFile & f, const PICodeParser::Entity * e, int &
}
bool needClassStream(const PICodeParser::Entity * e) {
piForeachC (PICodeParser::Member & m, e->members) {
if (m.is_type_ptr || m.isBitfield() || !m.dims.isEmpty() || (m.visibility != PICodeParser::Public))
continue;
return true;
}
return false;
}
void makeClassStream(PIFile & f, const PICodeParser::Entity * e) {
if (!needClassStream(e)) return;
f << "\nPIByteArray & operator <<(PIByteArray & s, const " << e->name << " & v) {\n";
f << "\tPIChunkStream cs;\n";
int cnt = 0;
@@ -294,18 +305,21 @@ void makeClassStream(PIFile & f, const PICodeParser::Entity * e) {
void makeClassStreamHeader(PIFile & f, const PICodeParser::Entity * e) {
PIStringList ml;
piForeachC (PICodeParser::Member & m, e->members) {
if (m.is_type_ptr) continue;
ml << m.name;
}
if (ml.isEmpty()) return;
if (!needClassStream(e)) return;
f << "\n";
PIStringList sl = e->name.split("::");
for (int i = 0; i < sl.size_s() - 1; ++i)
f << "namespace " << sl[i] << " {";
f << e->type << " " << sl.back() << ";";
if (sl.size_s() > 1) f << PIString('}').repeat(sl.size_s() - 1);
f << "\nPIByteArray & operator <<(PIByteArray & s, const " << e->name << " & v);";
f << "\nPIByteArray & operator >>(PIByteArray & s, " << e->name << " & v);\n";
}
void makeGetterType(PIFile & f, const PICodeParser::Entity * e) {
if (!needClassStream(e)) return;
f << "\nconst char * getterType" << toCName(e->name) << "(const char * name) {\n";
f << "\tif (!name) return \"\";\n";
piForeachC (PICodeParser::Member & m, e->members) {
@@ -318,6 +332,7 @@ void makeGetterType(PIFile & f, const PICodeParser::Entity * e) {
void makeGetterValue(PIFile & f, const PICodeParser::Entity * e) {
if (!needClassStream(e)) return;
f << "\nPIByteArray getterValue" << toCName(e->name) << "(const void * p, const char * name) {\n";
f << "\tPIByteArray ret;\n";
f << "\tif (!p || !name) return ret;\n";
@@ -365,8 +380,8 @@ void writeModel(PICodeParser & parser, PICLI & cli, const PIString out, bool met
f << "#include <string.h>\n";
if (streams || texts)
f << "#include <pichunkstream.h>\n";
f << "#include \"" << out << ".h\"\n";
if (inc_cpp) f << inc_string;
f << "#include \"" << out << ".h\"";
f << inc_string << "\n";
f << "\nusing namespace PICodeInfo;\n\n";
if (meta || enums || getters) {
@@ -431,8 +446,7 @@ void writeModel(PICodeParser & parser, PICLI & cli, const PIString out, bool met
f << "// \"" << _a << "\"\n";
f << "\n";
f << "#ifndef " << defname << "\n#define " << defname << "\n\n";
f << "#include \"pivariant.h\"\n#include \"picodeinfo.h\"";
if (inc_h) f << inc_string;
f << "#include <pivariant.h>\n#include <picodeinfo.h>";
if (streams) {
f << "\n\n// Stream operators\n";
piForeachC (PICodeParser::Entity * e, parser.entities) {