#ifndef ROOT_TMVA_Configurable
#define ROOT_TMVA_Configurable
#ifndef ROOT_TObject
#include "TObject.h"
#endif
#ifndef ROOT_TList
#include "TList.h"
#endif
#ifndef ROOT_TMVA_Option
#include "TMVA/Option.h"
#endif
namespace TMVA {
class Configurable : public TObject {
public:
Configurable( const TString& theOption = "" );
virtual ~Configurable();
virtual void ParseOptions();
void PrintOptions() const;
virtual const char* GetName() const { return GetConfigName(); }
const char* GetConfigName() const { return fConfigName; }
const char* GetConfigDescription() const { return fConfigDescription; }
void SetConfigName ( const char* n ) { fConfigName = TString(n); }
void SetConfigDescription( const char* d ) { fConfigDescription = TString(d); }
template<class T>
OptionBase* DeclareOptionRef( T& ref, const TString& name, const TString& desc = "" );
template<class T>
OptionBase* DeclareOptionRef( T*& ref, Int_t size, const TString& name, const TString& desc = "" );
template<class T>
void AddPreDefVal(const T&);
void CheckForUnusedOptions() const;
const TString& GetOptions() const { return fOptions; }
void SetOptions(const TString& s) { fOptions = s; }
void WriteOptionsToStream ( std::ostream& o, const TString& prefix ) const;
void ReadOptionsFromStream( istream& istr );
void AddOptionsXMLTo( void* parent ) const;
void ReadOptionsFromXML( void* node );
protected:
Bool_t LooseOptionCheckingEnabled() const { return fLooseOptionCheckingEnabled; }
void EnableLooseOptions( Bool_t b = kTRUE ) { fLooseOptionCheckingEnabled = b; }
void WriteOptionsReferenceToFile();
void ResetSetFlag();
const TString& GetReferenceFile() const { return fReferenceFile; }
private:
void SplitOptions(const TString& theOpt, TList& loo) const;
TString fOptions;
Bool_t fLooseOptionCheckingEnabled;
OptionBase* fLastDeclaredOption;
TList fListOfOptions;
TString fConfigName;
TString fConfigDescription;
TString fReferenceFile;
protected:
MsgLogger& Log() const { return *fLogger; }
public:
void SetMsgType( EMsgType t ) { fLogger->SetMinType(t); }
private:
mutable MsgLogger* fLogger;
template <class T>
void AssignOpt( const TString& name, T& valAssign ) const;
public:
ClassDef(Configurable,0)
};
}
template <class T>
TMVA::OptionBase* TMVA::Configurable::DeclareOptionRef( T& ref, const TString& name, const TString& desc)
{
OptionBase* o = new Option<T>(ref, name, desc);
fListOfOptions.Add(o);
fLastDeclaredOption = o;
return o;
}
template <class T>
TMVA::OptionBase* TMVA::Configurable::DeclareOptionRef( T*& ref, Int_t size, const TString& name, const TString& desc)
{
OptionBase* o = new Option<T*>(ref, size, name, desc);
fListOfOptions.Add(o);
fLastDeclaredOption = o;
return o;
}
template<class T>
void TMVA::Configurable::AddPreDefVal(const T& val)
{
Option<T>* oc = dynamic_cast<Option<T>*>(fLastDeclaredOption);
if(oc!=0) oc->AddPreDefVal(val);
}
template <class T>
void TMVA::Configurable::AssignOpt(const TString& name, T& valAssign) const
{
TObject* opt = fListOfOptions.FindObject(name);
if (opt!=0) valAssign = ((Option<T>*)opt)->Value();
else
Log() << kFATAL << "Option \"" << name
<< "\" not declared, please check the syntax of your option string" << Endl;
}
#endif