Provide utility API to generate code easily 92/164592/4
authorJunghoon Park <jh9216.park@samsung.com>
Wed, 20 Dec 2017 01:36:02 +0000 (10:36 +0900)
committerHwanKyu Jhun <h.jhun@samsung.com>
Wed, 20 Dec 2017 07:10:05 +0000 (07:10 +0000)
Change-Id: I830acd782dce83eb1375cdb78c8f73b60b570de9
Signed-off-by: Junghoon Park <jh9216.park@samsung.com>
idlc/cs_gen/cs_gen_base.cc
idlc/cs_gen/cs_proxy_gen.cc
idlc/cs_gen/cs_stub_gen.cc
idlc/generator.h

index 724f1e4..ca703f2 100644 (file)
@@ -42,25 +42,41 @@ void CsGeneratorBase::GenStructures(std::ofstream& stream) {
 
 void CsGeneratorBase::GenStructure(std::ofstream& stream, const Structure& st) {
   std::vector<std::string> v;
+  const char property[] = "        public $$ $$ { get; set; }\n";
+  const char ctor[] = "        public $$()\n" \
+                      "        {\n" \
+                      "$$" \
+                      "        }\n";
+
   stream << TAB <<"sealed class " << st.GetID() << std::endl;
-  stream << TAB <<"{" << std::endl;
+  GenBrace(stream, 4, [&]() {
     for (auto& i : st.GetElements().GetElms()) {
-      stream << TAB << TAB <<"public "
-             << ConvertTypeToString(i->GetType()) << " "
-             << i->GetID() << " { get; set; }" << std::endl;
+      GenTemplate(property, stream,
+        [&]()->std::string {
+          return ConvertTypeToString(i->GetType());
+        },
+        [&]()->std::string {
+          return i->GetID();
+        }
+      );
       if (i->GetType().ToString() == "bundle") {
         v.push_back(i->GetID() + " = " + "new Bundle()");
       }
     }
 
-    stream << TAB << TAB << "public " + st.GetID() << "()" << std::endl;
-    stream << TAB << TAB << "{" << std::endl;
-    for (auto& i : v) {
-      stream << TAB << TAB << TAB << i << std::endl;
-    }
-    stream << TAB << TAB << "}" << std::endl;
-
-  stream << TAB << "}" << std::endl;
+    GenTemplate(ctor, stream,
+      [&]()->std::string {
+        return st.GetID();
+      },
+      [&]()->std::string {
+        std::string str;
+        for (auto& i : v) {
+          str += "            " + i + ";\n";
+        }
+        return str;
+      }
+    );
+  });
 }
 
 std::string CsGeneratorBase::ConvertTypeToString(const BaseType& type) {
index 449528b..f2d47a0 100644 (file)
@@ -37,9 +37,9 @@ void CsProxyGen::OnFiniGen(std::ofstream& stream) {
 
 void CsProxyGen::GenNamespace(std::ofstream& stream) {
   stream << "namespace RPCPort" << std::endl;
-  stream << "{" << std::endl;
-  GenStructures(stream);
-  stream << "}  // RPCPort" << std::endl;
+  GenBrace(stream, 0, [&]() {
+    GenStructures(stream);
+  });
 }
 
 void CsProxyGen::GenInterop(std::ofstream& stream) {
index afe70ab..016983e 100644 (file)
@@ -42,9 +42,9 @@ void CsStubGen::GenInterop(std::ofstream& stream) {
 
 void CsStubGen::GenNamespace(std::ofstream& stream) {
   stream << "namespace RPCPort" << std::endl;
-  stream << "{" << std::endl;
-  GenStructures(stream);
-  stream << "}  // RPCPort" << std::endl;
+  GenBrace(stream, 0, [&]() {
+    GenStructures(stream);
+  });
 }
 
 }  // namespace tidl
index 2564106..54b3167 100644 (file)
@@ -37,6 +37,34 @@ class Generator {
   void GenCodeBlock(std::string filename,
                     void (*cb)(Generator& gen, int pos) = nullptr);
 
+  template<typename T, typename ...ARGS>
+  void GenTemplate(std::string templ, std::ofstream& stream, T cb, ARGS... args) {
+    size_t f = templ.find("$$");
+    templ.replace(f, std::string("$$").length(), cb());
+    GenTemplate(std::move(templ), stream, args...);
+  }
+
+  template<typename T>
+  void GenTemplate(std::string templ, std::ofstream& stream, T cb) {
+    size_t f = templ.find("$$");
+    templ.replace(f, std::string("$$").length(), cb());
+    stream << templ;
+  }
+
+  template<typename T>
+  void GenBrace(std::ofstream& stream, int indent, T cb,
+                bool start_indent = true) {
+    if (start_indent) {
+      for(int i = 0; i < indent; i++)
+        stream << " ";
+    }
+    stream << "{" << std::endl;
+    cb();
+    for(int i = 0; i < indent; i++)
+        stream << " ";
+    stream << "}" << std::endl;
+  }
+
   virtual void OnInitGen(std::ofstream& stream) = 0;
   virtual void OnFiniGen(std::ofstream& stream) = 0;