#ifndef ROOT_Math_IOptions
#define ROOT_Math_IOptions
#ifndef ROOT_Math_Error
#include "Math/Error.h"
#endif
#include <iostream>
namespace ROOT {
namespace Math {
class IOptions {
public:
IOptions() {}
virtual ~IOptions() {}
virtual IOptions * Clone() const = 0;
void SetValue(const char * name, double val) { SetRealValue(name,val);}
void SetValue(const char * name, int val) { SetIntValue(name,val);}
void SetValue(const char * name, const char * val) { SetNamedValue(name,val);}
double RValue(const char * name) const {
double val = 0;
bool ret = GetRealValue(name,val);
if (!ret ) MATH_ERROR_MSGVAL("IOptions::RValue"," return 0 - real option not found",name);
return val;
}
int IValue(const char * name) const {
int val = 0;
bool ret = GetIntValue(name,val);
if (!ret ) MATH_ERROR_MSGVAL("IOptions::IValue"," return 0 - integer option not found",name);
return val;
}
std::string NamedValue(const char * name) const {
std::string val;
bool ret = GetNamedValue(name,val);
if (!ret ) MATH_ERROR_MSGVAL("IOptions::NamedValue"," return empty string - named option not found",name);
return val;
}
template <typename T>
bool GetValue(const char * name, T & t) const {
bool ret = DoGetValue(name, t);
return ret;
}
virtual bool GetRealValue(const char *, double &) const { return false; }
virtual bool GetIntValue(const char *, int &) const { return false; }
virtual bool GetNamedValue(const char *, std::string &) const { return false; }
virtual void SetRealValue(const char * , double ) {MATH_ERROR_MSG("IOptions::SetRealValue","Invalid setter method called"); }
virtual void SetIntValue(const char * , int ) {MATH_ERROR_MSG("IOptions::SetIntValue","Invalid setter method called"); }
virtual void SetNamedValue(const char * , const char * ) {MATH_ERROR_MSG("IOptions::SetNamedValue","Invalid setter method called"); }
virtual void Print(std::ostream & = std::cout ) const {MATH_INFO_MSG("IOptions::Print","it is not implemented");}
private:
bool DoGetValue(const char *name, double &val) const { return GetRealValue(name,val); }
bool DoGetValue(const char *name, int &val) const { return GetIntValue(name,val); }
bool DoGetValue(const char *name, std::string &val) const { return GetNamedValue(name,val); }
};
}
}
#endif