{"char", "char"}, {"int", "int"}, {"short", "short"},
{"long", "long"}, {"string", "std::string"}, {"bool", "bool"},
{"list", "std::list"}, {"float","float"}, {"double", "double"},
- {"bundle", "bundle*"}, {"void", "void"}
+ {"bundle", "Bundle"}, {"void", "void"}, {"array", "std::vector"}
};
parcel_type_map_ = {
}
void CppGeneratorBase::GenStructuresForHeader(std::ofstream& stream) {
+ const char* cls = R"__cls_bundle(class Bundle final {
+ public:
+ Bundle() {
+ raw_ = bundle_create();
+ }
+
+ Bundle(bundle* b) {
+ raw_ = b;
+ }
+
+ ~Bundle() {
+ if (raw_)
+ bundle_free(raw_);
+ }
+
+ Bundle(Bundle&& b) : raw_(b.raw_) {
+ b.raw_ = nullptr;
+ }
+
+ Bundle& operator = (Bundle&& b) {
+ raw_ = b.raw_;
+ b.raw_ = nullptr;
+ return *this;
+ }
+
+ Bundle(const Bundle& b) : raw_(bundle_dup(b.GetHandle())) {}
+
+ Bundle& operator = (const Bundle& b) {
+ raw_ = bundle_dup(b.GetHandle());
+ return *this;
+ }
+
+ bundle* GetHandle() const {
+ return raw_;
+ }
+
+ private:
+ bundle* raw_;
+};
+
+)__cls_bundle";
+
+ stream << cls;
for (auto& i : GetDocument().GetBlocks()) {
if (i->GetType() != Block::TYPE_STRUCTURE)
continue;
std::vector<std::string> p;
std::vector<std::string> v;
std::vector<std::string> lv;
- const char ctor[] = " $$();\n" \
- " $$($$);\n";
- const char dtor[] = " ~$$();\n";
- const char setget[] = "$$";
+ const char ctor[] = " $$();\n" \
+ " $$($$);\n";
const char variable[] = "$$\n";
- stream << " class " << st.GetID() << " final ";
+ stream << "class " << st.GetID() << " final ";
for (auto& i : st.GetElements().GetElms()) {
if (i->GetType().GetMetaType() != nullptr) {
}
}
- GenBrace(stream, TAB_SIZE, [&]() {
- stream << Tab(1) << "public:" << NLine(1);
+ GenBrace(stream, 0, [&]() {
+ stream << " public:" << NLine(1);
GenTemplate(ctor, stream,
[&]()->std::string {
return st.GetID();
}
);
- GenTemplate(dtor, stream,
- [&]()->std::string {
- return st.GetID();
- }
- );
-
stream << NLine(1);
+ for (auto& i : st.GetElements().GetElms()) {
+ GenSetter(stream, *i);
+ GenGetter(stream, *i);
+ stream << NLine(1);
+ }
- GenTemplate(setget, stream,
- [&]()->std::string {
- std::string str;
- for (auto& i : st.GetElements().GetElms()) {
- if (i->GetType().IsUserDefinedType()) {
- str += Tab(2) + "void Set" + i->GetID() + "("
- + ConvertTypeToString(i->GetType()) + " " + i->GetID() + ")";
- str += "{ " + i->GetID() + "_ = " + i->GetID() + "; " + "}";
- str += NLine(1);
- str += Tab(2) + ConvertTypeToString(i->GetType()) + "& Get" + i->GetID()
- + "() const " + "{ return *" + i->GetID() + "_ }";
- } else if (i->GetType().GetMetaType() != nullptr) {
- str += Tab(2) + "void Set" + i->GetID() + "("
- + ConvertTypeToString(i->GetType()) + " " + i->GetID() + ")";
- str += "{ " + i->GetID() + "_ = " + i->GetID() + "; " + "}";
- str += NLine(1);
- str += Tab(2) + ConvertTypeToString(i->GetType()) + "& Get" + i->GetID()
- + "() const " + "{ return " + i->GetID() + "_ }";
- }
- else {
- str += Tab(2) + "void Set" + i->GetID() + "("
- + ConvertTypeToString(i->GetType()) + " " + i->GetID() + ")";
- str += "{ " + i->GetID() + "_ = " + i->GetID() + "; " + "}";
- str += NLine(1);
- str += Tab(2) + ConvertTypeToString(i->GetType()) + " Get" + i->GetID()
- + "() const " + "{ return " + i->GetID() + "_ }";
- }
-
- str += NLine(1);
- }
- return str;
- }
- );
-
- stream << NLine(1);
- stream << Tab(1) << "private:";
+ stream << " private:";
GenTemplate(variable, stream,
[&]()->std::string {
std::string str;
for (auto& i : v) {
- str += "\n" + Tab(2) + i + "_;";
+ str += "\n" + Tab(1) + i + "_;";
}
for (auto& i : lv) {
- str += "\n" + Tab(2) + i + "_;";
+ str += "\n" + Tab(1) + i + "_;";
}
return str;
}
);
- }, false);
+ }, false, false);
+ stream << ";" << NLine(1);
+}
+
+void CppGeneratorBase::GenSetter(std::ofstream& stream, const Element& ele) {
+ const char setter[] =
+ "void Set$$($$ $$) {\n" \
+ " $$_ = $$;\n" \
+ "}\n";
+
+ GenTemplate(AddIndent(TAB_SIZE, setter, true), stream,
+ [&]()->std::string {
+ return ele.GetID();
+ },
+ [&]()->std::string {
+ return ConvertTypeToString(ele.GetType());
+ },
+ [&]()->std::string {
+ return ele.GetID();
+ },
+ [&]()->std::string {
+ return ele.GetID();
+ },
+ [&]()->std::string {
+ if(ele.GetType().IsUserDefinedType() ||
+ ele.GetType().GetMetaType() != nullptr ||
+ ele.GetType().ToString() == "string" ||
+ ele.GetType().ToString() == "bundle") {
+ return "std::move(" + ele.GetID() + ")";
+ }
+
+ return ele.GetID();
+ }
+ );
+ stream << NLine(1);
+}
+
+void CppGeneratorBase::GenGetter(std::ofstream& stream, const Element& ele) {
+ const char getter[] =
+ "$$ Get$$() const {\n" \
+ " return $$_;\n" \
+ "}\n";
+
+ GenTemplate(AddIndent(TAB_SIZE, getter, true), stream,
+ [&]()->std::string {
+ if(ele.GetType().IsUserDefinedType() ||
+ ele.GetType().GetMetaType() != nullptr ||
+ ele.GetType().ToString() == "string" ||
+ ele.GetType().ToString() == "bundle") {
+ return "const " + ConvertTypeToString(ele.GetType()) + "&";
+ }
+
+ return ConvertTypeToString(ele.GetType());
+ },
+ [&]()->std::string {
+ return ele.GetID();
+ },
+ [&]()->std::string {
+ return ele.GetID();
+ }
+ );
}
void CppGeneratorBase::GenStructuresForBody(std::ofstream& stream) {
void CppGeneratorBase::GenStructureForBody(std::ofstream& stream, const Structure& st) {
std::vector<std::pair<std::string, std::string>> v;
- const char ctor[] = " $$::$$() {}\n" \
- " $$::$$($$)\n" \
+ const char ctor[] = "$$::$$() {}\n\n" \
+ "$$::$$($$)\n" \
" : $$ {}";
- const char dtor[] = " $$::~$$() $$";
for (auto& i : st.GetElements().GetElms()) {
if (i->GetType().GetMetaType() == nullptr) {
[&]()->std::string {
std::string str;
for (auto& i : v) {
- if (i.first == "std::string")
- str += i.second + "_(std::move(" + i.second + "))";
- else
- str += i.second + "_(" + i.second + ")";
+ str += i.second + "_(std::move(" + i.second + "))";
if (i != v.back())
str += ", ";
return str;
}
);
-
- stream << NLine(1);
- GenTemplate(dtor, stream,
- [&]()->std::string {
- return st.GetID();
- },
- [&]()->std::string {
- return st.GetID();
- },
- [&]()->std::string {
- std::string str;
- str += "{" + NLine(1);
- for (auto& i : v) {
- if (i.first == "bundle*") {
- str += Tab(2) + "if (" + i.second + "_) {" + NLine(1);
- str += Tab(3) + "bundle_free(" + i.second + "_);" + NLine(1);
- str += Tab(2) + "}" + NLine(1);
- }
- }
- str += Tab(1) + "}" + NLine(1);
- return str;
- }
- );
+ stream << NLine(2);
}
void CppGeneratorBase::GenSerializer(std::ofstream& stream) {
continue;
Structure& st = static_cast<Structure&>(*i);
GenSerializer(stream, st);
- stream << std::endl;
+ stream << NLine(1);
}
}
-void CppGeneratorBase::GenSerializer(std::ofstream& stream, const Structure& st) {
+void CppGeneratorBase::GenPrototype(std::ofstream& stream) {
+ for (auto& i : GetDocument().GetBlocks()) {
+ if (i->GetType() != Block::TYPE_STRUCTURE)
+ continue;
+ Structure& st = static_cast<Structure&>(*i);
+ GenSerializer(stream, st, true);
+ GenDeSerializer(stream, st, true);
+ }
+ GenListSerializer(stream, true);
+ stream << NLine(1);
+}
+
+void CppGeneratorBase::GenSerializer(std::ofstream& stream, const Structure& st,
+ bool proto) {
const char parcel_str[] = "rpc_port_parcel_h";
- stream << Tab(1) << parcel_str << " operater << ("
- << parcel_str << " h, const " << st.GetID() << "& param) ";
- GenBrace(stream, TAB_SIZE, [&]() {
+ stream << parcel_str << " operator << ("
+ << parcel_str << " h, const " << st.GetID() << "& param)";
+ if (proto) {
+ stream << ";" << NLine(1);
+ return;
+ }
+
+ stream << " ";
+ GenBrace(stream, 0, [&]() {
for (auto& i : st.GetElements().GetElms()) {
- if (i->GetType().ToString() == "list") {
- stream << Tab(2) << "rpc_port_parcel_write_array_count(h, param."
- << i->GetID() << "_.size());" << NLine(1);
- stream << Tab(2) << "for (auto& i : param." << i->GetID() << "_) ";
- GenBrace(stream, TAB_SIZE * 2, [&] {
- stream << Tab(3) << "h << *i;" << NLine(1);
- }, false);
- } else if (i->GetType().ToString() == "string") {
- stream << Tab(2) << "rpc_port_parcel_write_"
+ if (i->GetType().ToString() == "string") {
+ stream << Tab(1) << "rpc_port_parcel_write_"
<< parcel_type_map_[i->GetType().ToString()]
- << "(h, &" << i->GetID() << "_.c_str());"
+ << "(h, param.Get" << i->GetID() << "().c_str());"
<< NLine(1);
} else if (i->GetType().ToString() == "bundle") {
- stream << Tab(2) << "if (param." << i->GetID() << "_) ";
- GenBrace(stream, TAB_SIZE * 2, [&] {
- stream << Tab(3) << "rpc_port_parcel_write_bundle(h, param."
- << i->GetType().ToString() << "_);" << NLine(1);
- }, false);
- stream << Tab(2) << "else ";
- GenBrace(stream, TAB_SIZE * 2, [&] {
- stream << Tab(3) << "bundle* b = bundle_create();" << NLine(1)
- << Tab(3) << "rpc_port_parcel_write_bundle(h, b);" << NLine(1)
- << Tab(3) << "bundle_free(b);" << NLine(1);
- }, false);
+ stream << Tab(1) << "rpc_port_parcel_write_bundle(h, param.Get"
+ << i->GetID() << "().GetHandle());" << NLine(1);
+ } else if (i->GetType().GetMetaType() ||
+ i->GetType().IsUserDefinedType()) {
+ stream << Tab(1) << "h << param.Get" << i->GetID() << "();"
+ << NLine(1);
} else {
- stream << Tab(2) << "rpc_port_parcel_write_"
+ stream << Tab(1) << "rpc_port_parcel_write_"
<< parcel_type_map_[i->GetType().ToString()]
- << "(h, param." << i->GetID() << "_);"
+ << "(h, param.Get" << i->GetID() << "());"
<< NLine(1);
}
+ stream << NLine(1);
}
+ stream << Tab(1) << "return h;" << NLine(1);
}, false);
}
-
void CppGeneratorBase::GenDeSerializer(std::ofstream& stream) {
for (auto& i : GetDocument().GetBlocks()) {
if (i->GetType() != Block::TYPE_STRUCTURE)
}
}
-void CppGeneratorBase::GenDeSerializer(std::ofstream& stream, const Structure& st) {
+void CppGeneratorBase::GenDeSerializer(std::ofstream& stream,
+ const Structure& st, bool proto) {
const char parcel_str[] = "rpc_port_parcel_h";
- stream << Tab(1) << parcel_str << " operater >> ("
- << parcel_str << " h, " << st.GetID() << "& param) ";
-
- GenBrace(stream, TAB_SIZE, [&]() {
- for (auto& i : st.GetElements().GetElms()) {
- if (i->GetType().ToString() == "string") {
- stream << Tab(2) << "char* " << i->GetID() << " = nullptr;";
- stream << NLine(1);
- } else if (i->GetType().ToString() == "list") {
- stream << Tab(2) << "int l = 0;";
- stream << NLine(1);
- }
- }
-
- stream << NLine(1);
+ stream << parcel_str << " operator >> ("
+ << parcel_str << " h, " << st.GetID() << "& param)";
+ if (proto) {
+ stream << ";" << NLine(1);
+ return;
+ }
+ stream << " ";
+ GenBrace(stream, 0, [&]() {
for (auto& i : st.GetElements().GetElms()) {
if (i->GetType().ToString() == "string") {
- stream << Tab(2) << "rpc_port_parcel_read_"
+ stream << Tab(1) << "char* " << i->GetID() << " = nullptr;" << NLine(1);
+ stream << Tab(1) << "rpc_port_parcel_read_"
+ << parcel_type_map_[i->GetType().ToString()]
+ << "(h, &" << i->GetID() << ");"
+ << NLine(1);
+ stream << Tab(1) << "param.Set" << i->GetID() << "(" << i->GetID() << ");"
+ << NLine(1);
+ stream << Tab(1) << "free(" << i->GetID() << ");"
+ << NLine(1);
+ } else if (i->GetType().ToString() == "bundle") {
+ stream << Tab(1) << "bundle* " << i->GetID() << " = nullptr;" << NLine(1);
+ stream << Tab(1) << "rpc_port_parcel_read_"
<< parcel_type_map_[i->GetType().ToString()]
<< "(h, &" << i->GetID() << ");"
<< NLine(1);
- stream << Tab(2) << "param." << i->GetID() << "_ = " << i->GetID() << ";"
+ stream << Tab(1) << "param.Set" << i->GetID() << "(Bundle(" << i->GetID() << "));"
+ << NLine(1);
+ } else if (i->GetType().GetMetaType() != nullptr ||
+ i->GetType().IsUserDefinedType()) {
+ stream << Tab(1) << ConvertTypeToString(i->GetType())
+ << " " << i->GetID() << ";" << NLine(1);
+ stream << Tab(1) << "h >> " << i->GetID() << ";"
<< NLine(1);
- stream << Tab(2) << "free(" << i->GetID() << ");"
+ stream << Tab(1) << "param.Set" << i->GetID() << "(std::move(" << i->GetID() << "));"
<< NLine(1);
- } else if (i->GetType().ToString() == "list") {
- stream << Tab(2) << "for (int i = 0; i < l; i++) ";
- GenBrace(stream, TAB_SIZE * 2, [&] {
- stream << Tab(3) << i->GetType().GetMetaType()->ToString() << "* value = new "
- << i->GetType().GetMetaType()->ToString() << "();"
- << NLine(1);
- stream << NLine(1);
- stream << Tab(3) << "h >> *value;"
- << NLine(1);
- stream << Tab(3) << "param." << i->GetID() << "_.emplace_back(value);"
- << NLine(1);
- }, false);
} else {
- stream << Tab(2) << "rpc_port_parcel_read_"
+ stream << Tab(1) << ConvertTypeToString(i->GetType())
+ << " " << i->GetID() << ";" << NLine(1);
+ stream << Tab(1) << "rpc_port_parcel_read_"
<< parcel_type_map_[i->GetType().ToString()]
- << "(h, ¶m." << i->GetID() << "_);"
+ << "(h, &" << i->GetID() << ");"
+ << NLine(1);
+ stream << Tab(1) << "param.Set" << i->GetID() << "(" << i->GetID() << ");"
<< NLine(1);
}
+ stream << NLine(1);
}
+ stream << Tab(1) << "return h;" << NLine(1);
}, false);
}
std::string CppGeneratorBase::ConvertTypeToString(const BaseType& type) {
if (type.IsUserDefinedType())
- return "std::unique_ptr<" + type.ToString() + ">";
+ return type.ToString();
if (type.GetMetaType() != nullptr)
return type_map_[type.ToString()] + "<" +
return t;
}
+void CppGeneratorBase::AddSerializerList(const BaseType& type) {
+ if (type.GetMetaType() != nullptr) {
+ serializer_list_[ConvertTypeToString(type)] = &type;
+ AddSerializerList(*type.GetMetaType());
+ }
+}
+
+void CppGeneratorBase::GenListSerializer(std::ofstream& stream,
+ const BaseType& type, bool proto) {
+ stream << "rpc_port_parcel_h operator << (rpc_port_parcel_h h, const "
+ << ConvertTypeToString(type) << "& c)";
+
+ if (proto) {
+ stream << ";" << NLine(1);
+ stream << "rpc_port_parcel_h operator >> (rpc_port_parcel_h h, "
+ << ConvertTypeToString(type) << "& c);" << NLine(1);
+ return;
+ }
+
+ stream << " ";
+ GenBrace(stream, 0, [&]() {
+ stream << Tab(1)
+ << "rpc_port_parcel_write_array_count(h, c.size());"
+ << NLine(1);
+ stream << Tab(1) << "for (auto& i : c) ";
+ GenBrace(stream, TAB_SIZE, [&]() {
+ auto& mt = *type.GetMetaType();
+ if (!mt.IsUserDefinedType() && mt.GetMetaType() == nullptr) {
+ stream << Tab(2) << "rpc_port_parcel_write_"
+ << parcel_type_map_[mt.ToString()]
+ << "(h, i);" << NLine(1);
+ } else {
+ stream << Tab(2) << "h << i;" << NLine(1);
+ }
+ }, false);
+ stream << Tab(1) << "return h;" << NLine(1);
+ }, false);
+ stream << NLine(1);
+
+ stream << "rpc_port_parcel_h operator >> (rpc_port_parcel_h h, "
+ << ConvertTypeToString(type) << "& c) ";
+ GenBrace(stream, 0, [&]() {
+ stream << Tab(1) << "int l = 0;" << NLine(1);
+ stream << Tab(1)
+ << "rpc_port_parcel_read_array_count(h, &l);" << NLine(1);
+ stream << Tab(1) << "for (int i = 0; i < l; i++) ";
+ GenBrace(stream, TAB_SIZE, [&]() {
+ auto& mt = *type.GetMetaType();
+ if (!mt.IsUserDefinedType() && mt.GetMetaType() == nullptr) {
+ stream << Tab(2) << ConvertTypeToString(mt) << " v;" << NLine(1);
+ stream << Tab(2) << "rpc_port_parcel_read_"
+ << parcel_type_map_[mt.ToString()]
+ << "(h, &v);" << NLine(1);
+ } else {
+ stream << Tab(2) << ConvertTypeToString(mt) << " v;" << NLine(1);
+ stream << Tab(2) << "h >> v;" << NLine(1);
+ }
+ stream << Tab(2) << "c.push_back(std::move(v));" << NLine(1);
+ }, false);
+ stream << Tab(1) << "return h;" << NLine(1);
+ }, false);
+ stream << NLine(1);
+}
+
+void CppGeneratorBase::GenListSerializer(std::ofstream& stream, bool proto) {
+ serializer_list_.clear();
+ for (auto& i : GetDocument().GetBlocks()) {
+ if (i->GetType() == Block::TYPE_STRUCTURE) {
+ const Structure& st = static_cast<const Structure&>(*i);
+ for (auto& j : st.GetElements().GetElms()) {
+ auto& t = j->GetType();
+ AddSerializerList(t);
+ }
+ } else if (i->GetType() == Block::TYPE_INTERFACE) {
+ const Interface& iface = static_cast<const Interface&>(*i);
+ for (auto& j : iface.GetDeclarations().GetDecls()) {
+ auto& t = j->GetType();
+ AddSerializerList(t);
+ for (auto& k : j->GetParameters().GetParams()) {
+ auto& t1 = k->GetParameterType().GetBaseType();
+ AddSerializerList(t1);
+ }
+ }
+ }
+ }
+
+ for (auto& p : serializer_list_) {
+ const BaseType* t = p.second;
+ GenListSerializer(stream, *t, proto);
+ }
+}
+
} // namespace tidl