From 0fcb4e5c4b669fb8e0b56696bc7eb336efd2dec3 Mon Sep 17 00:00:00 2001 From: peri4 Date: Wed, 5 May 2021 19:15:14 +0300 Subject: [PATCH] pip_cmg now use forward-declaration for stream operators --- utils/code_model_generator/main.cpp | 34 ++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/utils/code_model_generator/main.cpp b/utils/code_model_generator/main.cpp index 8742ef26..e73cb1f9 100755 --- a/utils/code_model_generator/main.cpp +++ b/utils/code_model_generator/main.cpp @@ -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 \n"; if (streams || texts) f << "#include \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 \n#include "; if (streams) { f << "\n\n// Stream operators\n"; piForeachC (PICodeParser::Entity * e, parser.entities) {