00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef _PARAMETRIZABLE_OBJECT_HPP_
00021 #define _PARAMETRIZABLE_OBJECT_HPP_
00022
00032 #include <ReferenceCounting.hpp>
00033 #include <Parameter.hpp>
00034 #include <DoubleParameter.hpp>
00035 #include <IntegerParameter.hpp>
00036 #include <StringParameter.hpp>
00037 #include <EnumParameter.hpp>
00038
00039 #include <IdentifierSet.hpp>
00040 #include <string>
00041
00042 class ParametrizableObject
00043 {
00044 private:
00045 virtual std::ostream& put(std::ostream& os) const = 0;
00046
00047 typedef std::map<const char*,
00048 ReferenceCounting<Parameter>,
00049 StringEquality> ParameterList;
00050
00051 ParameterList __parameters;
00052
00053 public:
00054 void get(IdentifierSet& I)
00055 {
00056 for (ParameterList::iterator i = __parameters.begin();
00057 i != __parameters.end(); ++i)
00058 {
00059 (*(*i).second).get(I);
00060 I.insert((*i).first);
00061 }
00062 }
00063
00064 protected:
00065 void add(ReferenceCounting<Parameter> p)
00066 {
00067 __parameters[(*p).label()] = p;
00068 }
00069
00070 template <typename EnumType>
00071 void get(const char* label, EnumType& e) const
00072 {
00073 ReferenceCounting<Parameter> p = get(label);
00074 if((*p).type() == Parameter::Enum) {
00075 e = dynamic_cast<const EnumParameter<EnumType>&>(*p);
00076 return;
00077 }
00078 }
00079
00080 void get(const char* label, real_t& d) const
00081 {
00082 ReferenceCounting<Parameter> p = get(label);
00083 if((*p).type() == Parameter::Double) {
00084 d = dynamic_cast<const DoubleParameter&>(*p);
00085 return;
00086 }
00087 }
00088
00089 void get(const char* label, int& i) const
00090 {
00091 ReferenceCounting<Parameter> p = get(label);
00092 if((*p).type() == Parameter::Integer) {
00093 i = dynamic_cast<const IntegerParameter&>(*p);
00094 return;
00095 }
00096 }
00097
00098 void get(const char* label, std::string& s) const
00099 {
00100 ReferenceCounting<Parameter> p = get(label);
00101 if((*p).type() == Parameter::String) {
00102 s = dynamic_cast<const StringParameter&>(*p);
00103 return;
00104 }
00105 }
00106
00107 public:
00108
00109 void reset()
00110 {
00111 for (ParameterList::iterator i = __parameters.begin();
00112 i != __parameters.end(); ++i) {
00113 (*(*i).second).reset();
00114 }
00115 }
00116
00117 const ReferenceCounting<Parameter> get(const char* parameterName) const
00118 {
00119 ParameterList::const_iterator i = __parameters.find(parameterName);
00120 if (i != __parameters.end()) {
00121 return (*i).second;
00122 } else {
00123 throw ErrorHandler(__FILE__,__LINE__,
00124 stringify(parameterName)+" not found",
00125 ErrorHandler::normal);
00126 return 0;
00127 }
00128 }
00129
00136 ParametrizableObject()
00137 {
00138 ;
00139 }
00140
00141 virtual ~ParametrizableObject()
00142 {
00143 ;
00144 }
00145
00147 friend std::ostream& operator << (std::ostream& os,
00148 const ParametrizableObject& P);
00149 };
00150
00151 #endif // _PARAMETRIZABLE_OBJECT_HPP_
00152