00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef ROOT_Math_WrappedFunction
00026 #define ROOT_Math_WrappedFunction
00027
00028 #ifndef ROOT_Math_IFunction
00029 #include "IFunction.h"
00030 #endif
00031
00032
00033 namespace ROOT {
00034 namespace Math {
00035
00036
00037
00038
00039 struct NullTypeFunc1D {};
00040
00041 typedef double(*FreeFunctionPtr)(double);
00042
00043 typedef double(*FreeMultiFunctionPtr)(const double*);
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057 template< typename Func = FreeFunctionPtr >
00058 class WrappedFunction : public IGenFunction {
00059
00060
00061 public:
00062
00063
00064
00065
00066 WrappedFunction( Func f ) :
00067 fFunc( f )
00068 { }
00069
00070
00071
00072
00073 WrappedFunction * Clone() const {
00074 return new WrappedFunction(fFunc);
00075 }
00076
00077
00078
00079 private:
00080
00081 virtual double DoEval (double x) const {
00082 return fFunc( x );
00083 }
00084
00085
00086 Func fFunc;
00087
00088
00089 };
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107 template<typename FuncObj, typename MemFuncPtr >
00108 class WrappedMemFunction : public IGenFunction {
00109
00110
00111 public:
00112
00113
00114
00115
00116 WrappedMemFunction( FuncObj & obj, MemFuncPtr memFn ) :
00117 fObj(&obj),
00118 fMemFunc( memFn )
00119 { }
00120
00121
00122
00123
00124 WrappedMemFunction * Clone() const {
00125 return new WrappedMemFunction(*fObj,fMemFunc);
00126 }
00127
00128
00129 private:
00130
00131 virtual double DoEval (double x) const {
00132 return ((*fObj).*fMemFunc)( x );
00133 }
00134
00135
00136 FuncObj * fObj;
00137 MemFuncPtr fMemFunc;
00138
00139
00140 };
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155 template< typename Func = FreeMultiFunctionPtr >
00156 class WrappedMultiFunction : public IMultiGenFunction {
00157
00158
00159 public:
00160
00161
00162
00163
00164 WrappedMultiFunction( Func f , unsigned int dim = 1) :
00165 fFunc( f ),
00166 fDim( dim)
00167 { }
00168
00169
00170
00171
00172 WrappedMultiFunction * Clone() const {
00173 return new WrappedMultiFunction(fFunc,fDim);
00174 }
00175
00176 unsigned int NDim() const { return fDim; }
00177
00178
00179
00180 private:
00181
00182 virtual double DoEval (const double * x) const {
00183 return fFunc( x );
00184 }
00185
00186
00187 Func fFunc;
00188 unsigned int fDim;
00189
00190
00191 };
00192
00193
00194 template<typename FuncObj, typename MemFuncPtr >
00195 class WrappedMemMultiFunction : public IMultiGenFunction {
00196
00197
00198 public:
00199
00200
00201
00202
00203 WrappedMemMultiFunction( FuncObj & obj, MemFuncPtr memFn, unsigned int dim = 1 ) :
00204 fObj(&obj),
00205 fMemFunc( memFn ),
00206 fDim(dim)
00207 { }
00208
00209
00210
00211
00212 WrappedMemMultiFunction * Clone() const {
00213 return new WrappedMemMultiFunction(*fObj,fMemFunc,fDim);
00214 }
00215
00216
00217 unsigned int NDim() const { return fDim; }
00218
00219 private:
00220
00221 virtual double DoEval (const double * x) const {
00222 return ((*fObj).*fMemFunc)( x );
00223 }
00224
00225
00226 FuncObj * fObj;
00227 MemFuncPtr fMemFunc;
00228 unsigned int fDim;
00229
00230
00231 };
00232
00233
00234 }
00235 }
00236
00237
00238
00239 #endif // ROOT_Math_WrappedFunction