From cb31d50a1edddf1e7604c5d7997c8ccb6f819095 Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (h)" <j.wuttke@fz-juelich.de>
Date: Wed, 20 Apr 2016 08:56:06 +0200
Subject: [PATCH] IMinimizer: keep catalogue out of interface

---
 Fit/FitKernel/MinimizerFactory.cpp | 49 ++++++++++++++++++++++--------
 Fit/FitKernel/MinimizerFactory.h   | 29 ++++--------------
 2 files changed, 42 insertions(+), 36 deletions(-)

diff --git a/Fit/FitKernel/MinimizerFactory.cpp b/Fit/FitKernel/MinimizerFactory.cpp
index 487450e4cca..7d1d479f432 100644
--- a/Fit/FitKernel/MinimizerFactory.cpp
+++ b/Fit/FitKernel/MinimizerFactory.cpp
@@ -23,12 +23,29 @@
 #include "ROOTGeneticMinimizer.h"
 #include <iomanip>
 
-MinimizerFactory::Catalogue MinimizerFactory::m_catalogue =
-        MinimizerFactory::Catalogue();
+// ************************************************************************** //
+// auxiliary class MinimizerCatalogue
+// ************************************************************************** //
+
+//! @class map of minimizer names holding list of defined algorithms for every minimizer
+class MinimizerCatalogue {
+public:
+    typedef std::map<std::string, std::vector<std::string > > catalogue_t;
+    typedef catalogue_t::const_iterator const_iterator;
+    MinimizerCatalogue();
+    const_iterator begin() const { return m_data.begin(); }
+    const_iterator end() const { return m_data.end(); }
+    bool isValid(const std::string& minimizer, const std::string& algorithm) const;
+    friend std::ostream& operator<<(std::ostream& ostr, const MinimizerCatalogue& m)
+        { m.print(ostr); return ostr; }
+private:
+    void print(std::ostream& ostr) const;
+    catalogue_t m_data;
+};
 
 // constructing map of minimizer names holding list of defined algorithms
 // for every minimizer
-MinimizerFactory::Catalogue::Catalogue()
+MinimizerCatalogue::MinimizerCatalogue()
 {
     // our minimizers
     //m_data["Test"]        = {""};
@@ -43,9 +60,9 @@ MinimizerFactory::Catalogue::Catalogue()
 }
 
 
-void MinimizerFactory::Catalogue::print(std::ostream& ostr) const
+void MinimizerCatalogue::print(std::ostream& ostr) const
 {
-    for(MinimizerFactory::Catalogue::const_iterator it=m_data.begin(); it!=m_data.end(); ++it) {
+    for(MinimizerCatalogue::const_iterator it=m_data.begin(); it!=m_data.end(); ++it) {
         ostr << std::setw(20) << std::left<< it->first << "  : ";
         for(size_t i=0; i<it->second.size(); ++i ) {
             ostr << it->second[i] << " ";
@@ -56,10 +73,10 @@ void MinimizerFactory::Catalogue::print(std::ostream& ostr) const
 }
 
 
-bool MinimizerFactory::Catalogue::isValid(const std::string& minimizer, const std::string& algorithm) const
+bool MinimizerCatalogue::isValid(const std::string& minimizer, const std::string& algorithm) const
 {
     // check minimizers names
-    MinimizerFactory::Catalogue::const_iterator it = m_data.find(minimizer);
+    MinimizerCatalogue::const_iterator it = m_data.find(minimizer);
     if(it != m_data.end() ) {
         // check minimizer's algorithm type
         for(size_t i=0; i<it->second.size(); ++i ) if(it->second[i] == algorithm ) return true;
@@ -67,19 +84,25 @@ bool MinimizerFactory::Catalogue::isValid(const std::string& minimizer, const st
     return false;
 }
 
+// ************************************************************************** //
+// class MinimizerFactory
+// ************************************************************************** //
+
+static MinimizerCatalogue catalogue;
+
 void MinimizerFactory::printCatalogue()
 {
-    std::cout << m_catalogue;
+    std::cout << catalogue;
 }
 
 
 IMinimizer *MinimizerFactory::createMinimizer(const std::string& minimizer, const std::string& algorithm, const std::string& options)
 {
-    if( !m_catalogue.isValid(minimizer, algorithm) ) {
+    if( !catalogue.isValid(minimizer, algorithm) ) {
         std::ostringstream ostr;
         ostr << "MinimizerFactory::MinimizerFactory() -> Error! Wrong minimizer name '" << minimizer << "' or algorithm '" << algorithm << "'" << std::endl;
         ostr << "Possible names are:" << std::endl;
-        ostr << m_catalogue;
+        ostr << catalogue;
         throw LogicErrorException(ostr.str());
     }
 
@@ -126,9 +149,9 @@ IMinimizer *MinimizerFactory::createMinimizer(const std::string& minimizer, cons
 //! This method serves as a kind of 'shallow' clone for minimizer.
 //! The reason why the minimizer doesn't have own clone method is because of complicate structure of
 //! ROOT minimizer internals.
-IMinimizer *MinimizerFactory::createMinimizer(const IMinimizer *minimizer)
+IMinimizer *MinimizerFactory::createMinimizer(const IMinimizer *other)
 {
-    IMinimizer *result = createMinimizer(minimizer->getMinimizerName(), minimizer->getAlgorithmName());
-    result->setOptions(*minimizer->getOptions());
+    IMinimizer *result = createMinimizer(other->getMinimizerName(), other->getAlgorithmName());
+    result->setOptions(*other->getOptions());
     return result;
 }
diff --git a/Fit/FitKernel/MinimizerFactory.h b/Fit/FitKernel/MinimizerFactory.h
index 5b2eb15d191..4b05c20f6d2 100644
--- a/Fit/FitKernel/MinimizerFactory.h
+++ b/Fit/FitKernel/MinimizerFactory.h
@@ -29,30 +29,13 @@
 class BA_CORE_API_ MinimizerFactory
 {
  public:
-    static IMinimizer *createMinimizer(const std::string& minimizer, const std::string& algorithm = std::string(), const std::string& options=std::string() );
+    static IMinimizer *createMinimizer(
+        const std::string& minimizer,
+        const std::string& algorithm="",
+        const std::string& options="" );
     static void printCatalogue();
-
-    //! Create minimizer using existing one. Only minimizer type and minimizer settings are propagated.
-    static IMinimizer *createMinimizer(const IMinimizer *minimizer);
-
- private:
-
-    //! @class map of minimizer names holding list of defined algorithms for every minimizer
-    class Catalogue {
-    public:
-        typedef std::map<std::string, std::vector<std::string > > catalogue_t;
-        typedef catalogue_t::const_iterator const_iterator;
-        Catalogue();
-        const_iterator begin() const { return m_data.begin(); }
-        const_iterator end() const { return m_data.end(); }
-        bool isValid(const std::string& minimizer, const std::string& algorithm) const;
-        friend std::ostream& operator<<(std::ostream& ostr, const Catalogue& m) { m.print(ostr); return ostr; }
-    private:
-        void print(std::ostream& ostr) const;
-        catalogue_t m_data;
-    };
-
-    static Catalogue m_catalogue;
+    //! Returns copy of minimizer type and settings. No full clone, would be too heavy!
+    static IMinimizer *createMinimizer(const IMinimizer *other);
 };
 
 #endif // MINIMIZERFACTORY_H
-- 
GitLab