Change the method to template method to support closure expression 80/164780/1
authorJunghoon Park <jh9216.park@samsung.com>
Thu, 21 Dec 2017 04:27:36 +0000 (13:27 +0900)
committerJunghoon Park <jh9216.park@samsung.com>
Thu, 21 Dec 2017 04:27:36 +0000 (13:27 +0900)
Change-Id: Iefda736028dcee42065e0955ff17e8724afbfef0
Signed-off-by: Junghoon Park <jh9216.park@samsung.com>
idlc/cs_gen/cs_proxy_gen.cc
idlc/cs_gen/cs_stub_gen.cc
idlc/generator.cc
idlc/generator.h
unit_tests/generator_unittest.cc

index f2d47a0..4a72377 100644 (file)
@@ -43,8 +43,8 @@ void CsProxyGen::GenNamespace(std::ofstream& stream) {
 }
 
 void CsProxyGen::GenInterop(std::ofstream& stream) {
-  GenCodeBlock("cs_interop.cb", [](Generator& gen, int pos) {
-    gen.GenCodeBlock("cs_proxy_interop.cb");
+  GenCodeBlock("cs_interop.cb", [&](int pos) {
+    GenCodeBlock("cs_proxy_interop.cb");
   });
 }
 
index 016983e..b2569a1 100644 (file)
@@ -35,8 +35,8 @@ void CsStubGen::OnInitGen(std::ofstream& stream) {
 void CsStubGen::OnFiniGen(std::ofstream& stream) {}
 
 void CsStubGen::GenInterop(std::ofstream& stream) {
-  GenCodeBlock("cs_interop.cb", [](Generator& gen, int pos) {
-    gen.GenCodeBlock("cs_stub_interop.cb");
+  GenCodeBlock("cs_interop.cb", [&](int pos) {
+    GenCodeBlock("cs_stub_interop.cb");
   });
 }
 
index 7060941..cdcf937 100644 (file)
@@ -23,8 +23,7 @@
 
 namespace tidl {
 
-Generator::Generator(std::shared_ptr<Document> doc) : doc_(doc) {
-}
+Generator::Generator(std::shared_ptr<Document> doc) : doc_(doc) {}
 
 void Generator::Run(const std::string& file_name) {
   FileName = file_name;
@@ -35,31 +34,4 @@ void Generator::Run(const std::string& file_name) {
   out_file_.close();
 }
 
-void Generator::GenCodeBlock(std::string filename,
-                             void (*cb)(Generator& gen, int pos)) {
-  std::ifstream cb_file;
-  std::string line;
-  int cnt = 1;
-
-  cb_file.open("/usr/share/tidl/code_block/" + filename);
-  if (!cb_file.is_open()) {
-    cb_file.open("../idlc/code_block/" + filename);
-  }
-
-  if (!cb_file.is_open())
-    return;
-
-  while (std::getline(cb_file, line)) {
-    if (line.find("#event") == 0) {
-      if (cb != nullptr)
-        cb(*this, cnt);
-      cnt++;
-    } else {
-      out_file_ << line << std::endl;
-    }
-  }
-
-  cb_file.close();
-}
-
 }  // namespace tidl
index 54b3167..0788d3a 100644 (file)
@@ -30,12 +30,37 @@ namespace tidl {
 
 class Generator {
  public:
+  using EmptyCallbackType = void (*)(int);
+
   explicit Generator(std::shared_ptr<Document> doc);
   virtual ~Generator() = default;
 
   void Run(const std::string& file_name);
-  void GenCodeBlock(std::string filename,
-                    void (*cb)(Generator& gen, int pos) = nullptr);
+
+  template<typename T = EmptyCallbackType>
+  void GenCodeBlock(std::string filename, T cb = CallEmptyCallback) {
+    std::ifstream cb_file;
+    std::string line;
+    int cnt = 1;
+
+    cb_file.open("/usr/share/tidl/code_block/" + filename);
+    if (!cb_file.is_open()) {
+      cb_file.open("../idlc/code_block/" + filename);
+    }
+
+    if (!cb_file.is_open())
+      return;
+
+    while (std::getline(cb_file, line)) {
+      if (line.find("#event") == 0) {
+        cb(cnt);
+        cnt++;
+      } else {
+        out_file_ << line << std::endl;
+      }
+    }
+    cb_file.close();
+  }
 
   template<typename T, typename ...ARGS>
   void GenTemplate(std::string templ, std::ofstream& stream, T cb, ARGS... args) {
@@ -77,6 +102,9 @@ class Generator {
   std::string FileName;
 
  private:
+  static void CallEmptyCallback(int pos) {}
+
+ private:
   std::shared_ptr<Document> doc_;
   std::ofstream out_file_;
 };
index 18163f4..62f6833 100644 (file)
@@ -53,8 +53,8 @@ class CodeBlockGenerator : public tidl::Generator {
 
   void OnInitGen(std::ofstream& stream) override {
     GenCodeBlock("cs_interop.cb",
-        [](Generator& gen, int pos) {
-          (static_cast<CodeBlockGenerator&>(gen)).touch = true;
+        [&](int pos) {
+          touch = true;
           ASSERT_TRUE(pos == 1);
         });
   }