From 2063079560db45b2e2a8960df15f26589964fb62 Mon Sep 17 00:00:00 2001
From: Andrea Dell'Acqua <andrea.dellacqua@cern.ch>
Date: Thu, 16 Sep 2021 10:48:56 +0200
Subject: [PATCH] Switch GMX to use Partow's expression evaluator instead of
 CLHEP

---
 .../ExpressionEvaluator/IEvaluator.h          | 15 ++++++++++++++
 .../GeoModelXml/GeoModelXml/Gmx2Geo.h         |  4 ++--
 .../GeoModelXml/GeoModelXml/GmxUtil.h         | 20 +++++++------------
 .../GeoModelXml/GeoModelXml/PositionIndex.h   |  4 ++--
 .../GeoModelXML/GeoModelXml/src/Gmx2Geo.cxx   |  2 +-
 .../GeoModelXML/GeoModelXml/src/GmxUtil.cxx   |  2 +-
 .../GeoModelXml/src/PositionIndex.cxx         |  2 +-
 7 files changed, 29 insertions(+), 20 deletions(-)

diff --git a/GeoModelTools/ExpressionEvaluator/ExpressionEvaluator/IEvaluator.h b/GeoModelTools/ExpressionEvaluator/ExpressionEvaluator/IEvaluator.h
index 10c139250..898188f56 100755
--- a/GeoModelTools/ExpressionEvaluator/ExpressionEvaluator/IEvaluator.h
+++ b/GeoModelTools/ExpressionEvaluator/ExpressionEvaluator/IEvaluator.h
@@ -21,6 +21,21 @@ class IEvaluator {
    */
   ~IEvaluator() {;} 
 
+  enum {
+    OK,                         /**< Everything OK */
+    WARNING_EXISTING_VARIABLE,  /**< Redefinition of existing variable */
+    WARNING_EXISTING_FUNCTION,  /**< Redefinition of existing function */
+    WARNING_BLANK_STRING,       /**< Empty input string */
+    ERROR_NOT_A_NAME,           /**< Not allowed sysmbol in the name of variable or function */
+    ERROR_SYNTAX_ERROR,         /**< Systax error */
+    ERROR_UNPAIRED_PARENTHESIS, /**< Unpaired parenthesis */
+    ERROR_UNEXPECTED_SYMBOL,    /**< Unexpected sysbol */
+    ERROR_UNKNOWN_VARIABLE,     /**< Non-existing variable */
+    ERROR_UNKNOWN_FUNCTION,     /**< Non-existing function */
+    ERROR_EMPTY_PARAMETER,      /**< Function call has empty parameter */
+    ERROR_CALCULATION_ERROR     /**< Error during calculation */
+  };
+
   virtual double evaluate(const char * expression) = 0;
 
   virtual int status() const {return 0;}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/Gmx2Geo.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/Gmx2Geo.h
index 5cb7628ec..088b1e134 100644
--- a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/Gmx2Geo.h
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/Gmx2Geo.h
@@ -51,7 +51,7 @@ XERCES_CPP_NAMESPACE_BEGIN
 class DOMNode;
 XERCES_CPP_NAMESPACE_END
 
-class Evaluator;
+class IEvaluator;
 
 class Gmx2Geo {
 public:
@@ -61,7 +61,7 @@ private:
     Gmx2Geo(const Gmx2Geo &right);
     Gmx2Geo & operator=(const Gmx2Geo &right);
 
-    int doDefines(xercesc::DOMDocument *doc, Evaluator &eval);
+    int doDefines(xercesc::DOMDocument *doc, IEvaluator &eval);
     int doPositionIndex(xercesc::DOMDocument *doc, GmxUtil &gmxUtil);
     int doReadoutGeometry(xercesc::DOMDocument *doc, GmxUtil &gmxUtil);
     void addParam(xercesc::DOMNode *node, std::map<std::string, std::string> &params);
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/GmxUtil.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/GmxUtil.h
index 04df4d454..6231baad4 100644
--- a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/GmxUtil.h
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/GmxUtil.h
@@ -9,11 +9,9 @@
 //    to element handlers instead of a (changing??) list.
 //
 #include <string>
-#ifndef STANDALONE_GMX
-#include "CLHEP/Evaluator/Evaluator.h"
-#else
-#include "ExpressionEvaluator/Evaluator.h"
-#endif
+
+#include "ExpressionEvaluator/ExprtkEvaluator.h"
+
 #include "GeoModelXml/MaterialManager.h"
 #include "GeoModelXml/ProcessorRegistry.h"
 #include "GeoModelXml/Element2GeoItemRegistry.h"
@@ -38,9 +36,7 @@
 #include "GeoModelXml/MakeTransformationref.h"
 #include "GeoModelXml/MakeTranslation.h"
 #include "GeoModelXml/MakeRotation.h"
-#ifndef STANDALONE_GMX
-#include "GeoModelXml/MakeScaling.h"
-#endif
+// #include "GeoModelXml/MakeScaling.h"
 
 #include "GeoModelXml/shape/MakeSimplePolygonBrep.h"
 #include "GeoModelXml/shape/MakeEllipticalTube.h"
@@ -73,11 +69,9 @@ public:
     GmxInterface *gmxInterface();
     double evaluate(char const *expression);
     std::string debracket(std::string expression);
-#ifndef STANDALONE_GMX
-    HepTool::Evaluator eval;
-#else
-    Evaluator eval;
-#endif
+
+    ExprtkEvaluator eval;
+
     PositionIndex positionIndex;
     MaterialManager* matManager=0;
     ProcessorRegistry processorRegistry;
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/PositionIndex.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/PositionIndex.h
index 59a730ac5..bf544162c 100644
--- a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/PositionIndex.h
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/PositionIndex.h
@@ -20,7 +20,7 @@
 #include <map>
 #include <string>
 
-class Evaluator;
+class IEvaluator;
 
 class PositionIndex {
 public:
@@ -39,7 +39,7 @@ public:
     std::string formula(std::string name);
     void setFormula(std::string name, std::string formula);
 
-    void indices(std::map<std::string, int> &index, Evaluator &eval);
+    void indices(std::map<std::string, int> &index, IEvaluator &eval);
 
 private:
     int m_level;
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/Gmx2Geo.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/Gmx2Geo.cxx
index a6f28adb5..e85cd245d 100644
--- a/GeoModelTools/GeoModelXML/GeoModelXml/src/Gmx2Geo.cxx
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/Gmx2Geo.cxx
@@ -104,7 +104,7 @@ Gmx2Geo::Gmx2Geo(const string xmlFile, GeoPhysVol *addHere, GmxInterface &gmxInt
     XMLPlatformUtils::Terminate();
 }
 
-int Gmx2Geo::doDefines(DOMDocument *doc, Evaluator &eval) {
+int Gmx2Geo::doDefines(DOMDocument *doc, IEvaluator &eval) {
 //
 //    Add all defines to the CLHEP::Evaluator
 //
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/GmxUtil.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/GmxUtil.cxx
index 599efd360..fd4f13816 100644
--- a/GeoModelTools/GeoModelXML/GeoModelXml/src/GmxUtil.cxx
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/GmxUtil.cxx
@@ -117,7 +117,7 @@ double GmxUtil::evaluate(char const *expression) {
 #ifndef STANDALONE_GMX
     if (eval.status() != HepTool::Evaluator::OK) {
 #else
-    if (eval.status() != Evaluator::OK) {
+    if (eval.status() != IEvaluator::OK) {
 #endif
 #ifndef STANDALONE_GMX
         msglog << MSG::FATAL << "GeoModelXml Error processing Evaluator expression. Error name <" <<
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/PositionIndex.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/PositionIndex.cxx
index 7a2b3ad65..33e1f899b 100644
--- a/GeoModelTools/GeoModelXML/GeoModelXml/src/PositionIndex.cxx
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/PositionIndex.cxx
@@ -68,7 +68,7 @@ void PositionIndex::setFormula(std::string name, std::string formula) {
     m_formula[name] = formula;
 }
 
-void PositionIndex::indices(map<string, int> &index, Evaluator &eval) {
+void PositionIndex::indices(map<string, int> &index, IEvaluator &eval) {
     index.clear(); // In case caller uses it many times
 //
 //    Set Copy Number of each Level (CNL_i) up to current level
-- 
GitLab