From cbe4d8b8d31e428691948e9d12e2d56baec97402 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com>
Date: Thu, 11 Feb 2021 11:53:32 +0100
Subject: [PATCH] Simplify function descriptor access from FunctionSymbolId

---
 src/language/modules/UtilsModule.cpp       |  4 +---
 src/language/utils/CMakeLists.txt          |  1 +
 src/language/utils/FunctionSymbolId.cpp    |  8 ++++++++
 src/language/utils/FunctionSymbolId.hpp    |  4 ++++
 src/language/utils/PugsFunctionAdapter.hpp | 10 +++++-----
 5 files changed, 19 insertions(+), 8 deletions(-)
 create mode 100644 src/language/utils/FunctionSymbolId.cpp

diff --git a/src/language/modules/UtilsModule.cpp b/src/language/modules/UtilsModule.cpp
index 8b2271158..b74ddc54e 100644
--- a/src/language/modules/UtilsModule.cpp
+++ b/src/language/modules/UtilsModule.cpp
@@ -52,9 +52,7 @@ UtilsModule::UtilsModule()
                             std::make_shared<BuiltinFunctionEmbedder<std::string(const FunctionSymbolId&)>>(
 
                               [](const FunctionSymbolId& function_symbol_id) -> std::string {
-                                auto& function_table = function_symbol_id.symbolTable().functionTable();
-
-                                const auto& function_descriptor = function_table[function_symbol_id.id()];
+                                const auto& function_descriptor = function_symbol_id.descriptor();
 
                                 std::ostringstream os;
                                 os << function_descriptor.name() << ": domain mapping\n";
diff --git a/src/language/utils/CMakeLists.txt b/src/language/utils/CMakeLists.txt
index 22c0ae52f..32a75c66f 100644
--- a/src/language/utils/CMakeLists.txt
+++ b/src/language/utils/CMakeLists.txt
@@ -22,6 +22,7 @@ add_library(PugsLanguageUtils
   BinaryOperatorRegisterForZ.cpp
   DataVariant.cpp
   EmbeddedData.cpp
+  FunctionSymbolId.cpp
   IncDecOperatorRegisterForN.cpp
   IncDecOperatorRegisterForR.cpp
   IncDecOperatorRegisterForZ.cpp
diff --git a/src/language/utils/FunctionSymbolId.cpp b/src/language/utils/FunctionSymbolId.cpp
new file mode 100644
index 000000000..d45c35c2d
--- /dev/null
+++ b/src/language/utils/FunctionSymbolId.cpp
@@ -0,0 +1,8 @@
+#include <language/utils/FunctionSymbolId.hpp>
+#include <language/utils/SymbolTable.hpp>
+
+const FunctionDescriptor&
+FunctionSymbolId::descriptor() const
+{
+  return m_symbol_table->functionTable()[m_function_id];
+}
diff --git a/src/language/utils/FunctionSymbolId.hpp b/src/language/utils/FunctionSymbolId.hpp
index f96b783fa..21496cb0e 100644
--- a/src/language/utils/FunctionSymbolId.hpp
+++ b/src/language/utils/FunctionSymbolId.hpp
@@ -8,7 +8,9 @@
 #include <iostream>
 #include <memory>
 
+class FunctionDescriptor;
 class SymbolTable;
+
 class FunctionSymbolId
 {
  private:
@@ -29,6 +31,8 @@ class FunctionSymbolId
     return *m_symbol_table;
   }
 
+  [[nodiscard]] const FunctionDescriptor& descriptor() const;
+
   friend std::ostream&
   operator<<(std::ostream& os, const FunctionSymbolId& function_symbol_id)
   {
diff --git a/src/language/utils/PugsFunctionAdapter.hpp b/src/language/utils/PugsFunctionAdapter.hpp
index 7fef84f2d..b6d3a259d 100644
--- a/src/language/utils/PugsFunctionAdapter.hpp
+++ b/src/language/utils/PugsFunctionAdapter.hpp
@@ -119,10 +119,10 @@ class PugsFunctionAdapter<OutputType(InputType...)>
   [[nodiscard]] PUGS_INLINE static auto&
   getFunctionExpression(const FunctionSymbolId& function_symbol_id)
   {
-    auto& function = function_symbol_id.symbolTable().functionTable()[function_symbol_id.id()];
-    _checkFunction(function);
+    auto& function_descriptor = function_symbol_id.descriptor();
+    _checkFunction(function_descriptor);
 
-    return *function.definitionNode().children[1];
+    return *function_descriptor.definitionNode().children[1];
   }
 
   [[nodiscard]] PUGS_INLINE static auto
@@ -209,7 +209,7 @@ class PugsFunctionAdapter<OutputType(InputType...)>
           };
         } else {
           // If this point is reached must be a 0 vector
-          return [](DataVariant &&) -> OutputType { return OutputType{ZeroType{}}; };
+          return [](DataVariant&&) -> OutputType { return OutputType{ZeroType{}}; };
         }
       }
       case ASTNodeDataType::double_t: {
@@ -288,7 +288,7 @@ class PugsFunctionAdapter<OutputType(InputType...)>
           };
         } else {
           // If this point is reached must be a 0 matrix
-          return [](DataVariant &&) -> OutputType { return OutputType{ZeroType{}}; };
+          return [](DataVariant&&) -> OutputType { return OutputType{ZeroType{}}; };
         }
       }
       case ASTNodeDataType::double_t: {
-- 
GitLab