diff --git a/corsika/detail/framework/analytics/ClassTimer.inl b/corsika/detail/framework/analytics/ClassTimer.inl index c025efe56a9d540de5605395be406794c4f6ab8f..813e765a1971a52aed937c50724d926e893a8965 100644 --- a/corsika/detail/framework/analytics/ClassTimer.inl +++ b/corsika/detail/framework/analytics/ClassTimer.inl @@ -24,84 +24,58 @@ namespace corsika { template <typename TClass, typename TRet, typename... TArgs, TRet (TClass::*TFuncPtr)(TArgs...)> ClassTimer<TRet (TClass::*)(TArgs...), TFuncPtr>::ClassTimer(TClass& obj) - : obj_(obj) {} + : ClassTimerImpl<TClass>(obj) {} template <typename TClass, typename TRet, typename... TArgs, TRet (TClass::*TFuncPtr)(TArgs...)> TRet ClassTimer<TRet (TClass::*)(TArgs...), TFuncPtr>::call(TArgs... args) { - start_ = TClock::now(); - auto tmp = (obj_.*TFuncPtr)(std::forward<TArgs>(args)...); - timeDiff_ = std::chrono::duration_cast<TDuration>(TClock::now() - start_); + this->start_ = ClassTimerImpl<TClass>::TClock::now(); + auto tmp = (this->obj_.*TFuncPtr)(std::forward<TArgs>(args)...); + this->timeDiff_ = std::chrono::duration_cast<typename ClassTimerImpl<TClass>::TDuration>(ClassTimerImpl<TClass>::TClock::now() - this->start_); return tmp; } - template <typename TClass, typename TRet, typename... TArgs, - TRet (TClass::*TFuncPtr)(TArgs...)> - inline typename ClassTimer<TRet (TClass::*)(TArgs...), TFuncPtr>::TDuration - ClassTimer<TRet (TClass::*)(TArgs...), TFuncPtr>::getTime() const { - return timeDiff_; - } - // Specialisation 1 template <typename TClass, typename... TArgs, void (TClass::*TFuncPtr)(TArgs...)> ClassTimer<void (TClass::*)(TArgs...), TFuncPtr>::ClassTimer(TClass& obj) - : obj_(obj) {} + : ClassTimerImpl<TClass>(obj) {} template <typename TClass, typename... TArgs, void (TClass::*TFuncPtr)(TArgs...)> void ClassTimer<void (TClass::*)(TArgs...), TFuncPtr>::call(TArgs... args) { - start_ = TClock::now(); - (obj_.*TFuncPtr)(std::forward<TArgs>(args)...); - timeDiff_ = std::chrono::duration_cast<TDuration>(TClock::now() - start_); + this->start_ = ClassTimerImpl<TClass>::TClock::now(); + (this->obj_.*TFuncPtr)(std::forward<TArgs>(args)...); + this->timeDiff_ = std::chrono::duration_cast<typename ClassTimerImpl<TClass>::TDuration>(ClassTimerImpl<TClass>::TClock::now() - this->start_); return; } - template <typename TClass, typename... TArgs, void (TClass::*TFuncPtr)(TArgs...)> - inline typename ClassTimer<void (TClass::*)(TArgs...), TFuncPtr>::TDuration - ClassTimer<void (TClass::*)(TArgs...), TFuncPtr>::getTime() const { - return timeDiff_; - } - /// Specialisation 2 template <typename TClass, typename TRet, typename... TArgs, TRet (TClass::*TFuncPtr)(TArgs...) const> ClassTimer<TRet (TClass::*)(TArgs...) const, TFuncPtr>::ClassTimer(TClass& obj) - : obj_(obj) {} + : ClassTimerImpl<TClass>(obj) {} template <typename TClass, typename TRet, typename... TArgs, TRet (TClass::*TFuncPtr)(TArgs...) const> TRet ClassTimer<TRet (TClass::*)(TArgs...) const, TFuncPtr>::call(TArgs... args) { - start_ = TClock::now(); - auto tmp = (obj_.*TFuncPtr)(std::forward<TArgs>(args)...); - timeDiff_ = std::chrono::duration_cast<TDuration>(TClock::now() - start_); + this->start_ = ClassTimerImpl<TClass>::TClock::now(); + auto tmp = (this->obj_.*TFuncPtr)(std::forward<TArgs>(args)...); + this->timeDiff_ = std::chrono::duration_cast<typename ClassTimerImpl<TClass>::TDuration>(ClassTimerImpl<TClass>::TClock::now() - this->start_); return tmp; } - template <typename TClass, typename TRet, typename... TArgs, - TRet (TClass::*TFuncPtr)(TArgs...) const> - inline typename ClassTimer<TRet (TClass::*)(TArgs...) const, TFuncPtr>::TDuration - ClassTimer<TRet (TClass::*)(TArgs...) const, TFuncPtr>::getTime() const { - return timeDiff_; - } - /// Specialisation 3 template <typename TClass, typename... TArgs, void (TClass::*TFuncPtr)(TArgs...) const> ClassTimer<void (TClass::*)(TArgs...) const, TFuncPtr>::ClassTimer(TClass& obj) - : obj_(obj) {} + : ClassTimerImpl<TClass>(obj) {} template <typename TClass, typename... TArgs, void (TClass::*TFuncPtr)(TArgs...) const> void ClassTimer<void (TClass::*)(TArgs...) const, TFuncPtr>::call(TArgs... args) { - start_ = TClock::now(); - (obj_.*TFuncPtr)(std::forward<TArgs>(args)...); - timeDiff_ = std::chrono::duration_cast<TDuration>(TClock::now() - start_); + this->start_ = ClassTimerImpl<TClass>::TClock::now(); + (this->obj_.*TFuncPtr)(std::forward<TArgs>(args)...); + this->timeDiff_ = std::chrono::duration_cast<typename ClassTimerImpl<TClass>::TDuration>(ClassTimerImpl<TClass>::TClock::now() - this->start_); return; } - template <typename TClass, typename... TArgs, void (TClass::*TFuncPtr)(TArgs...) const> - inline typename ClassTimer<void (TClass::*)(TArgs...) const, TFuncPtr>::TDuration - ClassTimer<void (TClass::*)(TArgs...) const, TFuncPtr>::getTime() const { - return timeDiff_; - } - } // namespace corsika \ No newline at end of file diff --git a/corsika/framework/analytics/ClassTimer.hpp b/corsika/framework/analytics/ClassTimer.hpp index f0bc63914bc894523db7f3c9cd849c8635d5f103..59ee8c8a2b612b9c315e7948cf4ba8026995a839 100644 --- a/corsika/framework/analytics/ClassTimer.hpp +++ b/corsika/framework/analytics/ClassTimer.hpp @@ -36,6 +36,13 @@ namespace corsika { /// Measured runtime of the function TDuration timeDiff_; + + public: + ClassTimerImpl(TClass& obj) + : obj_(obj){}; + + /// returns the last runtime of the wraped function accessed via call + inline TDuration getTime() const{return timeDiff_;} }; /// Measure the runtime of a single class function @@ -61,7 +68,7 @@ namespace corsika { */ template <typename TClass, typename TRet, typename... TArgs, TRet (TClass::*TFuncPtr)(TArgs...)> - class ClassTimer<TRet (TClass::*)(TArgs...), TFuncPtr> : ClassTimerImpl<TClass>{ + class ClassTimer<TRet (TClass::*)(TArgs...), TFuncPtr> : public ClassTimerImpl<TClass> { private: public: ClassTimer(TClass& obj); @@ -75,14 +82,11 @@ namespace corsika { * during the process and therefore must be copy constructible! */ TRet call(TArgs... args); - - /// returns the last runtime of the wraped function accessed via call - inline TDuration getTime() const; }; /// Specialisation for member functions without return value template <typename TClass, typename... TArgs, void (TClass::*TFuncPtr)(TArgs...)> - class ClassTimer<void (TClass::*)(TArgs...), TFuncPtr> : ClassTimerImpl<TClass> { + class ClassTimer<void (TClass::*)(TArgs...), TFuncPtr> : public ClassTimerImpl<TClass> { private: using TClock = std::chrono::high_resolution_clock; using TDuration = std::chrono::microseconds; @@ -91,31 +95,27 @@ namespace corsika { ClassTimer(TClass& obj); void call(TArgs... args); - - inline TDuration getTime() const; }; /// Specialisation for const member functions template <typename TClass, typename TRet, typename... TArgs, TRet (TClass::*TFuncPtr)(TArgs...) const> - class ClassTimer<TRet (TClass::*)(TArgs...) const, TFuncPtr> : ClassTimerImpl<TClass>{ + class ClassTimer<TRet (TClass::*)(TArgs...) const, TFuncPtr> + : public ClassTimerImpl<TClass> { public: ClassTimer(TClass& obj); TRet call(TArgs... args); - - inline TDuration getTime() const; }; /// Specialisation for const member functions without return value template <typename TClass, typename... TArgs, void (TClass::*TFuncPtr)(TArgs...) const> - class ClassTimer<void (TClass::*)(TArgs...) const, TFuncPtr> : ClassTimerImpl<TClass> { + class ClassTimer<void (TClass::*)(TArgs...) const, TFuncPtr> + : public ClassTimerImpl<TClass> { public: ClassTimer(TClass& obj); void call(TArgs... args); - - inline TDuration getTime() const; }; } // namespace corsika