--- trunk/OOPSE/libmdtools/Functor.hpp 2004/01/13 22:12:32 939 +++ trunk/OOPSE/libmdtools/Functor.hpp 2004/02/04 22:26:00 1023 @@ -1,31 +1,78 @@ -#ifndef _FUNCTOR_H +#ifndef _FUNCTOR_H_ #define _FUNCTOR_H_ +#include + +using namespace std; + +class ObjFunctor0{ + public: + + virtual ~ObjFunctor0() {} + virtual double operator()(vector&)=0; + +}; + +class PtrFunctor0 : public ObjFunctor0{ + + public: + + PtrFunctor0(double (*thePtrFunc)(vector&)){ + ptrFunc = thePtrFunc; + } + + virtual double operator()(vector& arg){ + return (*ptrFunc)(arg); + }; + + protected: + double (*ptrFunc)(vector&); +}; + + +//ClassMemObjFunctor class wraps a pointer pointing to a member function of a class +// +template +class ClassMemObjFunctor0 : public ObjFunctor0{ + public: + ClassMemObjFunctor0(TClass* thePtrClass, double (TClass::*thePtrFunc)(vector&)){ + ptrClass = thePtrClass; + ptrFunc = thePtrFunc; + } + + double operator()(vector& arg){ + return (*ptrClass.*ptrFunc)(arg); + } + protected: + + double (TClass::*ptrFunc)(vector&); + TClass* ptrClass; +}; + /** * Abstract class of object function which have an overloaded method * to calculate the gradient */ -class ObjFunctor{ +class ObjFunctor1{ public: + virtual ~ObjFunctor1() {} virtual double operator()(vector&, vector&)=0; }; - - //PtrFunctor class wraps a pointer which points to an objct function. // PtrFunctor can be invoked by // functor(vector&, vector&) -class PtrFunctor : ObjFunctor{ +class PtrFunctor1 : public ObjFunctor1{ public: - PtrFunctor(double (*thePtrFunc)(vector&, vector&)){ + PtrFunctor1(double (*thePtrFunc)(vector&, vector&)){ ptrFunc = thePtrFunc; } - + virtual double operator()(vector& arg, vector& grad){ return (*ptrFunc)(arg, grad); }; @@ -37,15 +84,15 @@ class ClassMemObjFunctor : public ObjFunctor{ //ClassMemObjFunctor class wraps a pointer pointing to a member function of a class // template -class ClassMemObjFunctor : public ObjFunctor{ +class ClassMemObjFunctor1 : public ObjFunctor1{ public: - ClassMemObjFunctor(TClass* thePtrClass, double (TClass::*thePtrFunc)(vector&, vector&)){ + ClassMemObjFunctor1(TClass* thePtrClass, double (TClass::*thePtrFunc)(vector&, vector&)){ ptrClass = thePtrClass; ptrFunc = thePtrFunc; } - double operator()(vector&, vector&){ - return (*ptrClass.*ptrFunc))(arg, grad); + double operator()(vector&arg, vector&grad){ + return (*ptrClass.*ptrFunc)(arg, grad); } protected: