From 10cbe7e8d838982c00f66b73d6ea2cd278e83332 Mon Sep 17 00:00:00 2001
From: Giovanni Bussi <giovanni.bussi@gmail.com>
Date: Mon, 27 Aug 2018 09:23:05 +0200
Subject: [PATCH] Changed opMap construction

opMap is now constructed in a single statement. This avoids
problems possibly arising with multiple threads accessing for the first time
to this method simultaneously.

opMap is then made const for clarity.
---
 src/lepton/Parser.cpp | 61 +++++++++++++++++++++----------------------
 1 file changed, 30 insertions(+), 31 deletions(-)

diff --git a/src/lepton/Parser.cpp b/src/lepton/Parser.cpp
index 664e3ceda..3096c361b 100644
--- a/src/lepton/Parser.cpp
+++ b/src/lepton/Parser.cpp
@@ -336,37 +336,36 @@ Operation* Parser::getOperatorOperation(const std::string& name) {
 
 Operation* Parser::getFunctionOperation(const std::string& name, const map<string, CustomFunction*>& customFunctions) {
 
-    static map<string, Operation::Id> opMap;
-    if (opMap.size() == 0) {
-        opMap["sqrt"] = Operation::SQRT;
-        opMap["exp"] = Operation::EXP;
-        opMap["log"] = Operation::LOG;
-        opMap["sin"] = Operation::SIN;
-        opMap["cos"] = Operation::COS;
-        opMap["sec"] = Operation::SEC;
-        opMap["csc"] = Operation::CSC;
-        opMap["tan"] = Operation::TAN;
-        opMap["cot"] = Operation::COT;
-        opMap["asin"] = Operation::ASIN;
-        opMap["acos"] = Operation::ACOS;
-        opMap["atan"] = Operation::ATAN;
-        opMap["sinh"] = Operation::SINH;
-        opMap["cosh"] = Operation::COSH;
-        opMap["tanh"] = Operation::TANH;
-        opMap["erf"] = Operation::ERF;
-        opMap["erfc"] = Operation::ERFC;
-        opMap["step"] = Operation::STEP;
-        opMap["delta"] = Operation::DELTA;
-        opMap["square"] = Operation::SQUARE;
-        opMap["cube"] = Operation::CUBE;
-        opMap["recip"] = Operation::RECIPROCAL;
-        opMap["min"] = Operation::MIN;
-        opMap["max"] = Operation::MAX;
-        opMap["abs"] = Operation::ABS;
-        opMap["floor"] = Operation::FLOOR;
-        opMap["ceil"] = Operation::CEIL;
-        opMap["select"] = Operation::SELECT;
-    }
+    const static map<string, Operation::Id> opMap ={
+        { "sqrt" , Operation::SQRT },
+        { "exp" , Operation::EXP },
+        { "log" , Operation::LOG },
+        { "sin" , Operation::SIN },
+        { "cos" , Operation::COS },
+        { "sec" , Operation::SEC },
+        { "csc" , Operation::CSC },
+        { "tan" , Operation::TAN },
+        { "cot" , Operation::COT },
+        { "asin" , Operation::ASIN },
+        { "acos" , Operation::ACOS },
+        { "atan" , Operation::ATAN },
+        { "sinh" , Operation::SINH },
+        { "cosh" , Operation::COSH },
+        { "tanh" , Operation::TANH },
+        { "erf" , Operation::ERF },
+        { "erfc" , Operation::ERFC },
+        { "step" , Operation::STEP },
+        { "delta" , Operation::DELTA },
+        { "square" , Operation::SQUARE },
+        { "cube", Operation::CUBE },
+        { "recip" , Operation::RECIPROCAL },
+        { "min" , Operation::MIN },
+        { "max" , Operation::MAX },
+        { "abs" , Operation::ABS },
+        { "floor" , Operation::FLOOR },
+        { "ceil" , Operation::CEIL },
+        { "select" , Operation::SELECT },
+    };
     string trimmed = name.substr(0, name.size()-1);
 
     // First check custom functions.
-- 
GitLab