// @(#)root/mathcore:$Id$
// Author: L. Moneta Nov 2010

/**********************************************************************
 *                                                                    *
 * Copyright (c) 2010  LCG ROOT Math Team, CERN/PH-SFT                *
 *                                                                    *
 *                                                                    *
 **********************************************************************/

#ifndef ROOT_Math_GenAlgoOptions
#define ROOT_Math_GenAlgoOptions


#ifndef ROOT_Math_IOptions
#include "Math/IOptions.h"
#endif

#include <map>
#include <iomanip>

namespace ROOT {
      namespace Math {

//_______________________________________________________________________________
/**
    class implementing generic options for a numerical algorithm
    Just store the options in a map of string-value pairs

    @ingroup NumAlgo
*/
class GenAlgoOptions : public IOptions {

public:

   GenAlgoOptions() /* : fExtraOptions(0) */  {}

   virtual ~GenAlgoOptions() {}// { if (fExtraOptions) delete fExtraOptions; }

   // use default copy constructor and assignment operator

   /** generic  methods for  retrivieng options */


   // methods implementing the  IOptions interface

   virtual IOptions * Clone() const {
      return new GenAlgoOptions(*this);
   }

   // t.b.d need probably to implement in a .cxx file for CINT


   virtual bool GetRealValue(const char * name, double & val) const {
      const double * pval = FindValue(name, fRealOpts);
      if (!pval) return false;
      val = *pval;
      return true;
   }

   virtual bool GetIntValue(const char * name, int & val) const {
      const int * pval = FindValue(name, fIntOpts);
      if (!pval) return false;
      val = *pval;
      return true;
   }

   virtual bool GetNamedValue(const char * name, std::string & val) const {
      const std::string * pval = FindValue(name, fNamOpts);
      if (!pval) return false;
      val = *pval;
      return true;
   }

   /// method wich need to be re-implemented by the derived classes
   virtual void SetRealValue(const char * name, double val)  {
      InsertValue(name, fRealOpts, val);
   }

   virtual void SetIntValue(const char * name , int val) {
      InsertValue(name, fIntOpts, val);
   }

   virtual void SetNamedValue(const char * name, const char * val) {
      InsertValue(name, fNamOpts, std::string(val));
   }


   /// print options
   virtual void Print(std::ostream & os = std::cout ) const {
      Print(fNamOpts,os);
      Print(fIntOpts,os);
      Print(fRealOpts,os);
   }


   // static methods to retrieve the default options

   // find the option given a name
   // return 0 if the option is not found
   static IOptions * FindDefault(const char * algoname);

   // retrieve options given the name
   // if option is not found create a new GenAlgoOption for the given name
   static IOptions & Default(const char * algoname);

   /// print all the default options
   static void PrintAllDefault(std::ostream & os = std::cout);


protected:



private:

   template<class M>
   static const typename M::mapped_type * FindValue(const std::string &  name, const M & opts) {
      typename M::const_iterator pos;
      pos = opts.find(name);
      if (pos == opts.end()) {
         return 0;
      }
      return  &((*pos).second);
   }

   template<class M>
   static void InsertValue(const std::string &name, M & opts, const typename M::mapped_type & value) {
      typename M::iterator pos;
      pos = opts.find(name);
      if (pos != opts.end()) {
         pos->second = value;
      }
      else {
         opts.insert(typename M::value_type(name, value) );
      }
   }

   template<class M>
   static void Print( const M & opts, std::ostream & os) {
      //const std::ios_base::fmtflags prevFmt = os.flags();
      for (typename M::const_iterator pos = opts.begin(); pos != opts.end(); ++pos)
         os << std::setw(25) << pos->first << " : " << std::setw(15) << pos->second << std::endl;
   }


   std::map<std::string, double>      fRealOpts;   // map of the real options
   std::map<std::string, int>         fIntOpts;    // map of the integer options
   std::map<std::string, std::string> fNamOpts;    // map of the named options

};



   } // end namespace Math

} // end namespace ROOT

#endif
 GenAlgoOptions.h:1
 GenAlgoOptions.h:2
 GenAlgoOptions.h:3
 GenAlgoOptions.h:4
 GenAlgoOptions.h:5
 GenAlgoOptions.h:6
 GenAlgoOptions.h:7
 GenAlgoOptions.h:8
 GenAlgoOptions.h:9
 GenAlgoOptions.h:10
 GenAlgoOptions.h:11
 GenAlgoOptions.h:12
 GenAlgoOptions.h:13
 GenAlgoOptions.h:14
 GenAlgoOptions.h:15
 GenAlgoOptions.h:16
 GenAlgoOptions.h:17
 GenAlgoOptions.h:18
 GenAlgoOptions.h:19
 GenAlgoOptions.h:20
 GenAlgoOptions.h:21
 GenAlgoOptions.h:22
 GenAlgoOptions.h:23
 GenAlgoOptions.h:24
 GenAlgoOptions.h:25
 GenAlgoOptions.h:26
 GenAlgoOptions.h:27
 GenAlgoOptions.h:28
 GenAlgoOptions.h:29
 GenAlgoOptions.h:30
 GenAlgoOptions.h:31
 GenAlgoOptions.h:32
 GenAlgoOptions.h:33
 GenAlgoOptions.h:34
 GenAlgoOptions.h:35
 GenAlgoOptions.h:36
 GenAlgoOptions.h:37
 GenAlgoOptions.h:38
 GenAlgoOptions.h:39
 GenAlgoOptions.h:40
 GenAlgoOptions.h:41
 GenAlgoOptions.h:42
 GenAlgoOptions.h:43
 GenAlgoOptions.h:44
 GenAlgoOptions.h:45
 GenAlgoOptions.h:46
 GenAlgoOptions.h:47
 GenAlgoOptions.h:48
 GenAlgoOptions.h:49
 GenAlgoOptions.h:50
 GenAlgoOptions.h:51
 GenAlgoOptions.h:52
 GenAlgoOptions.h:53
 GenAlgoOptions.h:54
 GenAlgoOptions.h:55
 GenAlgoOptions.h:56
 GenAlgoOptions.h:57
 GenAlgoOptions.h:58
 GenAlgoOptions.h:59
 GenAlgoOptions.h:60
 GenAlgoOptions.h:61
 GenAlgoOptions.h:62
 GenAlgoOptions.h:63
 GenAlgoOptions.h:64
 GenAlgoOptions.h:65
 GenAlgoOptions.h:66
 GenAlgoOptions.h:67
 GenAlgoOptions.h:68
 GenAlgoOptions.h:69
 GenAlgoOptions.h:70
 GenAlgoOptions.h:71
 GenAlgoOptions.h:72
 GenAlgoOptions.h:73
 GenAlgoOptions.h:74
 GenAlgoOptions.h:75
 GenAlgoOptions.h:76
 GenAlgoOptions.h:77
 GenAlgoOptions.h:78
 GenAlgoOptions.h:79
 GenAlgoOptions.h:80
 GenAlgoOptions.h:81
 GenAlgoOptions.h:82
 GenAlgoOptions.h:83
 GenAlgoOptions.h:84
 GenAlgoOptions.h:85
 GenAlgoOptions.h:86
 GenAlgoOptions.h:87
 GenAlgoOptions.h:88
 GenAlgoOptions.h:89
 GenAlgoOptions.h:90
 GenAlgoOptions.h:91
 GenAlgoOptions.h:92
 GenAlgoOptions.h:93
 GenAlgoOptions.h:94
 GenAlgoOptions.h:95
 GenAlgoOptions.h:96
 GenAlgoOptions.h:97
 GenAlgoOptions.h:98
 GenAlgoOptions.h:99
 GenAlgoOptions.h:100
 GenAlgoOptions.h:101
 GenAlgoOptions.h:102
 GenAlgoOptions.h:103
 GenAlgoOptions.h:104
 GenAlgoOptions.h:105
 GenAlgoOptions.h:106
 GenAlgoOptions.h:107
 GenAlgoOptions.h:108
 GenAlgoOptions.h:109
 GenAlgoOptions.h:110
 GenAlgoOptions.h:111
 GenAlgoOptions.h:112
 GenAlgoOptions.h:113
 GenAlgoOptions.h:114
 GenAlgoOptions.h:115
 GenAlgoOptions.h:116
 GenAlgoOptions.h:117
 GenAlgoOptions.h:118
 GenAlgoOptions.h:119
 GenAlgoOptions.h:120
 GenAlgoOptions.h:121
 GenAlgoOptions.h:122
 GenAlgoOptions.h:123
 GenAlgoOptions.h:124
 GenAlgoOptions.h:125
 GenAlgoOptions.h:126
 GenAlgoOptions.h:127
 GenAlgoOptions.h:128
 GenAlgoOptions.h:129
 GenAlgoOptions.h:130
 GenAlgoOptions.h:131
 GenAlgoOptions.h:132
 GenAlgoOptions.h:133
 GenAlgoOptions.h:134
 GenAlgoOptions.h:135
 GenAlgoOptions.h:136
 GenAlgoOptions.h:137
 GenAlgoOptions.h:138
 GenAlgoOptions.h:139
 GenAlgoOptions.h:140
 GenAlgoOptions.h:141
 GenAlgoOptions.h:142
 GenAlgoOptions.h:143
 GenAlgoOptions.h:144
 GenAlgoOptions.h:145
 GenAlgoOptions.h:146
 GenAlgoOptions.h:147
 GenAlgoOptions.h:148
 GenAlgoOptions.h:149
 GenAlgoOptions.h:150
 GenAlgoOptions.h:151
 GenAlgoOptions.h:152
 GenAlgoOptions.h:153
 GenAlgoOptions.h:154
 GenAlgoOptions.h:155
 GenAlgoOptions.h:156
 GenAlgoOptions.h:157
 GenAlgoOptions.h:158
 GenAlgoOptions.h:159