pip_cmg now use forward-declaration for stream operators
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user