From 30fd651e22157a19e94cc5674b836857b7fa45ce Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Fri, 21 Feb 2020 12:33:36 +0100
Subject: [PATCH] Add the BuiltinModule base class in preparation to multiple
 modules

Now MathModule inherits from BuiltinModule and not directly from IModule

BuiltinModule defines filling mechanisms for concrete built-in modules
---
 src/language/BuiltinModule.cpp    | 17 +++++++++++++++++
 src/language/BuiltinModule.hpp    | 28 ++++++++++++++++++++++++++++
 src/language/CMakeLists.txt       |  1 +
 src/language/MathModule.cpp       | 14 --------------
 src/language/MathModule.hpp       | 15 ++-------------
 src/language/ModuleRepository.cpp |  2 --
 6 files changed, 48 insertions(+), 29 deletions(-)
 create mode 100644 src/language/BuiltinModule.cpp
 create mode 100644 src/language/BuiltinModule.hpp

diff --git a/src/language/BuiltinModule.cpp b/src/language/BuiltinModule.cpp
new file mode 100644
index 000000000..2d2b1b556
--- /dev/null
+++ b/src/language/BuiltinModule.cpp
@@ -0,0 +1,17 @@
+#include <BuiltinModule.hpp>
+
+#include <CFunctionEmbedder.hpp>
+
+#include <iostream>
+
+void
+BuiltinModule::_addFunction(const std::string& name, std::shared_ptr<ICFunctionEmbedder> c_function_embedder)
+{
+  auto [i_function, success] = m_name_cfunction_map.insert(std::make_pair(name, c_function_embedder));
+  // LCOV_EXCL_START
+  if (not success) {
+    std::cerr << "function " << name << " cannot be add!\n";
+    std::exit(1);
+  }
+  // LCOV_EXCL_STOP
+}
diff --git a/src/language/BuiltinModule.hpp b/src/language/BuiltinModule.hpp
new file mode 100644
index 000000000..2a076f511
--- /dev/null
+++ b/src/language/BuiltinModule.hpp
@@ -0,0 +1,28 @@
+#ifndef BUILTIN_MODULE_HPP
+#define BUILTIN_MODULE_HPP
+
+#include <PugsMacros.hpp>
+
+#include <IModule.hpp>
+
+class ICFunctionEmbedder;
+class BuiltinModule : public IModule
+{
+ protected:
+  NameCFunctionMap m_name_cfunction_map;
+
+  void _addFunction(const std::string& name, std::shared_ptr<ICFunctionEmbedder> c_function_embedder);
+
+ public:
+  const NameCFunctionMap&
+  getNameCFunctionsMap() const final
+  {
+    return m_name_cfunction_map;
+  }
+
+  BuiltinModule() = default;
+
+  ~BuiltinModule() = default;
+};
+
+#endif   // BUILTIN_MODULE_HPP
diff --git a/src/language/CMakeLists.txt b/src/language/CMakeLists.txt
index 8086dfbca..e901374f5 100644
--- a/src/language/CMakeLists.txt
+++ b/src/language/CMakeLists.txt
@@ -31,6 +31,7 @@ add_library(
   ASTPrinter.cpp
   ASTSymbolTableBuilder.cpp
   ASTSymbolInitializationChecker.cpp
+  BuiltinModule.cpp
   MathModule.cpp
   ModuleRepository.cpp
   PugsParser.cpp)
diff --git a/src/language/MathModule.cpp b/src/language/MathModule.cpp
index 934b55be8..440ad9290 100644
--- a/src/language/MathModule.cpp
+++ b/src/language/MathModule.cpp
@@ -2,20 +2,6 @@
 
 #include <CFunctionEmbedder.hpp>
 
-#include <iostream>
-
-void
-MathModule::_addFunction(const std::string& name, std::shared_ptr<ICFunctionEmbedder> c_function_embedder)
-{
-  auto [i_function, success] = m_name_cfunction_map.insert(std::make_pair(name, c_function_embedder));
-  // LCOV_EXCL_START
-  if (not success) {
-    std::cerr << "function " << name << " cannot be add!\n";
-    std::exit(1);
-  }
-  // LCOV_EXCL_STOP
-}
-
 MathModule::MathModule()
 {
   this->_addFunction("sqrt", std::make_shared<CFunctionEmbedder<double, double>>(
diff --git a/src/language/MathModule.hpp b/src/language/MathModule.hpp
index c3ca3ed0a..8a897c812 100644
--- a/src/language/MathModule.hpp
+++ b/src/language/MathModule.hpp
@@ -1,15 +1,10 @@
 #ifndef MATH_MODULE_HPP
 #define MATH_MODULE_HPP
 
-#include <IModule.hpp>
+#include <BuiltinModule.hpp>
 
-class MathModule : public IModule
+class MathModule : public BuiltinModule
 {
- private:
-  NameCFunctionMap m_name_cfunction_map;
-
-  void _addFunction(const std::string& name, std::shared_ptr<ICFunctionEmbedder> c_function_embedder);
-
  public:
   std::string_view
   name() const final
@@ -17,12 +12,6 @@ class MathModule : public IModule
     return "math";
   }
 
-  const NameCFunctionMap&
-  getNameCFunctionsMap() const final
-  {
-    return m_name_cfunction_map;
-  }
-
   MathModule();
 
   ~MathModule() = default;
diff --git a/src/language/ModuleRepository.cpp b/src/language/ModuleRepository.cpp
index 4eb46c0ae..1b3fee7d3 100644
--- a/src/language/ModuleRepository.cpp
+++ b/src/language/ModuleRepository.cpp
@@ -48,8 +48,6 @@ ModuleRepository::populateSymbolTable(const ASTNode& module_name_node, SymbolTab
 
       c_function_embedder_table.add(c_function);
     }
-
-    std::cout << "populating ...";
   } else {
     throw parse_error(std::string{"could not find module "} + module_name, std::vector{module_name_node.begin()});
   }
-- 
GitLab