EvolvingObjects
|
00001 #ifndef eoFuncPtrStat_h 00002 #define eoFuncPtrStat_h 00003 00004 #include <eoFunctorStore.h> 00005 #include <utils/eoStat.h> 00006 00007 00008 00015 template <class EOT, class T> 00016 class eoFuncPtrStat : public eoStat<EOT, T> 00017 { 00018 public : 00019 typedef T (*func_t)(const eoPop<EOT>&); 00020 00021 00022 eoFuncPtrStat(func_t f, std::string _description = "func_ptr") 00023 : eoStat<EOT, T>(T(), _description), func(f) 00024 {} 00025 00026 using eoStat<EOT, T>::value; 00027 00028 void operator()(const eoPop<EOT>& pop) { 00029 value() = func(pop); 00030 } 00031 00032 private: 00033 func_t func; 00034 }; 00035 00039 template <class EOT, class T> 00040 eoFuncPtrStat<EOT, T>& makeFuncPtrStat( T (*func)(const eoPop<EOT>&), eoFunctorStore& store, std::string description = "func") { 00041 return store.storeFunctor( 00042 new eoFuncPtrStat<EOT, T>( func, description) 00043 ); 00044 } 00045 00052 template <class EOT, class T> 00053 class eoFunctorStat : public eoStat<EOT, T> 00054 { 00055 public : 00056 eoFunctorStat(eoUF< const eoPop<EOT>&, T >& f, std::string _description = "functor") 00057 : eoStat<EOT, T>(T(), _description), func(f) 00058 {} 00059 00060 using eoStat<EOT, T>::value; 00061 00062 void operator()(const eoPop<EOT>& pop) { 00063 value() = func(pop); 00064 } 00065 00066 private: 00067 eoUF< const eoPop<EOT>&, T >& func; 00068 }; 00069 00073 template <class EOT, class T> 00074 eoFunctorStat<EOT, T>& makeFunctorStat( eoUF< const eoPop<EOT>&, T >& func, eoFunctorStore& store, std::string description = "func") { 00075 return store.storeFunctor( 00076 new eoFunctorStat<EOT, T>( func, description) 00077 ); 00078 } 00079 00080 #endif