IAP GITLAB

Skip to content
Snippets Groups Projects
Commit fd59a064 authored by Dominik Baack's avatar Dominik Baack Committed by ralfulrich
Browse files

Bit more cleanup

parent c84760b5
No related branches found
No related tags found
1 merge request!280Refactory 2020
...@@ -24,84 +24,58 @@ namespace corsika { ...@@ -24,84 +24,58 @@ namespace corsika {
template <typename TClass, typename TRet, typename... TArgs, template <typename TClass, typename TRet, typename... TArgs,
TRet (TClass::*TFuncPtr)(TArgs...)> TRet (TClass::*TFuncPtr)(TArgs...)>
ClassTimer<TRet (TClass::*)(TArgs...), TFuncPtr>::ClassTimer(TClass& obj) ClassTimer<TRet (TClass::*)(TArgs...), TFuncPtr>::ClassTimer(TClass& obj)
: obj_(obj) {} : ClassTimerImpl<TClass>(obj) {}
template <typename TClass, typename TRet, typename... TArgs, template <typename TClass, typename TRet, typename... TArgs,
TRet (TClass::*TFuncPtr)(TArgs...)> TRet (TClass::*TFuncPtr)(TArgs...)>
TRet ClassTimer<TRet (TClass::*)(TArgs...), TFuncPtr>::call(TArgs... args) { TRet ClassTimer<TRet (TClass::*)(TArgs...), TFuncPtr>::call(TArgs... args) {
start_ = TClock::now(); this->start_ = ClassTimerImpl<TClass>::TClock::now();
auto tmp = (obj_.*TFuncPtr)(std::forward<TArgs>(args)...); auto tmp = (this->obj_.*TFuncPtr)(std::forward<TArgs>(args)...);
timeDiff_ = std::chrono::duration_cast<TDuration>(TClock::now() - start_); this->timeDiff_ = std::chrono::duration_cast<typename ClassTimerImpl<TClass>::TDuration>(ClassTimerImpl<TClass>::TClock::now() - this->start_);
return tmp; 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 // Specialisation 1
template <typename TClass, typename... TArgs, void (TClass::*TFuncPtr)(TArgs...)> template <typename TClass, typename... TArgs, void (TClass::*TFuncPtr)(TArgs...)>
ClassTimer<void (TClass::*)(TArgs...), TFuncPtr>::ClassTimer(TClass& obj) ClassTimer<void (TClass::*)(TArgs...), TFuncPtr>::ClassTimer(TClass& obj)
: obj_(obj) {} : ClassTimerImpl<TClass>(obj) {}
template <typename TClass, typename... TArgs, void (TClass::*TFuncPtr)(TArgs...)> template <typename TClass, typename... TArgs, void (TClass::*TFuncPtr)(TArgs...)>
void ClassTimer<void (TClass::*)(TArgs...), TFuncPtr>::call(TArgs... args) { void ClassTimer<void (TClass::*)(TArgs...), TFuncPtr>::call(TArgs... args) {
start_ = TClock::now(); this->start_ = ClassTimerImpl<TClass>::TClock::now();
(obj_.*TFuncPtr)(std::forward<TArgs>(args)...); (this->obj_.*TFuncPtr)(std::forward<TArgs>(args)...);
timeDiff_ = std::chrono::duration_cast<TDuration>(TClock::now() - start_); this->timeDiff_ = std::chrono::duration_cast<typename ClassTimerImpl<TClass>::TDuration>(ClassTimerImpl<TClass>::TClock::now() - this->start_);
return; 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 /// Specialisation 2
template <typename TClass, typename TRet, typename... TArgs, template <typename TClass, typename TRet, typename... TArgs,
TRet (TClass::*TFuncPtr)(TArgs...) const> TRet (TClass::*TFuncPtr)(TArgs...) const>
ClassTimer<TRet (TClass::*)(TArgs...) const, TFuncPtr>::ClassTimer(TClass& obj) ClassTimer<TRet (TClass::*)(TArgs...) const, TFuncPtr>::ClassTimer(TClass& obj)
: obj_(obj) {} : ClassTimerImpl<TClass>(obj) {}
template <typename TClass, typename TRet, typename... TArgs, template <typename TClass, typename TRet, typename... TArgs,
TRet (TClass::*TFuncPtr)(TArgs...) const> TRet (TClass::*TFuncPtr)(TArgs...) const>
TRet ClassTimer<TRet (TClass::*)(TArgs...) const, TFuncPtr>::call(TArgs... args) { TRet ClassTimer<TRet (TClass::*)(TArgs...) const, TFuncPtr>::call(TArgs... args) {
start_ = TClock::now(); this->start_ = ClassTimerImpl<TClass>::TClock::now();
auto tmp = (obj_.*TFuncPtr)(std::forward<TArgs>(args)...); auto tmp = (this->obj_.*TFuncPtr)(std::forward<TArgs>(args)...);
timeDiff_ = std::chrono::duration_cast<TDuration>(TClock::now() - start_); this->timeDiff_ = std::chrono::duration_cast<typename ClassTimerImpl<TClass>::TDuration>(ClassTimerImpl<TClass>::TClock::now() - this->start_);
return tmp; 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 /// Specialisation 3
template <typename TClass, typename... TArgs, void (TClass::*TFuncPtr)(TArgs...) const> template <typename TClass, typename... TArgs, void (TClass::*TFuncPtr)(TArgs...) const>
ClassTimer<void (TClass::*)(TArgs...) const, TFuncPtr>::ClassTimer(TClass& obj) ClassTimer<void (TClass::*)(TArgs...) const, TFuncPtr>::ClassTimer(TClass& obj)
: obj_(obj) {} : ClassTimerImpl<TClass>(obj) {}
template <typename TClass, typename... TArgs, void (TClass::*TFuncPtr)(TArgs...) const> template <typename TClass, typename... TArgs, void (TClass::*TFuncPtr)(TArgs...) const>
void ClassTimer<void (TClass::*)(TArgs...) const, TFuncPtr>::call(TArgs... args) { void ClassTimer<void (TClass::*)(TArgs...) const, TFuncPtr>::call(TArgs... args) {
start_ = TClock::now(); this->start_ = ClassTimerImpl<TClass>::TClock::now();
(obj_.*TFuncPtr)(std::forward<TArgs>(args)...); (this->obj_.*TFuncPtr)(std::forward<TArgs>(args)...);
timeDiff_ = std::chrono::duration_cast<TDuration>(TClock::now() - start_); this->timeDiff_ = std::chrono::duration_cast<typename ClassTimerImpl<TClass>::TDuration>(ClassTimerImpl<TClass>::TClock::now() - this->start_);
return; 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 } // namespace corsika
\ No newline at end of file
...@@ -36,6 +36,13 @@ namespace corsika { ...@@ -36,6 +36,13 @@ namespace corsika {
/// Measured runtime of the function /// Measured runtime of the function
TDuration timeDiff_; 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 /// Measure the runtime of a single class function
...@@ -61,7 +68,7 @@ namespace corsika { ...@@ -61,7 +68,7 @@ namespace corsika {
*/ */
template <typename TClass, typename TRet, typename... TArgs, template <typename TClass, typename TRet, typename... TArgs,
TRet (TClass::*TFuncPtr)(TArgs...)> TRet (TClass::*TFuncPtr)(TArgs...)>
class ClassTimer<TRet (TClass::*)(TArgs...), TFuncPtr> : ClassTimerImpl<TClass>{ class ClassTimer<TRet (TClass::*)(TArgs...), TFuncPtr> : public ClassTimerImpl<TClass> {
private: private:
public: public:
ClassTimer(TClass& obj); ClassTimer(TClass& obj);
...@@ -75,14 +82,11 @@ namespace corsika { ...@@ -75,14 +82,11 @@ namespace corsika {
* during the process and therefore must be copy constructible! * during the process and therefore must be copy constructible!
*/ */
TRet call(TArgs... args); 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 /// Specialisation for member functions without return value
template <typename TClass, typename... TArgs, void (TClass::*TFuncPtr)(TArgs...)> 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: private:
using TClock = std::chrono::high_resolution_clock; using TClock = std::chrono::high_resolution_clock;
using TDuration = std::chrono::microseconds; using TDuration = std::chrono::microseconds;
...@@ -91,31 +95,27 @@ namespace corsika { ...@@ -91,31 +95,27 @@ namespace corsika {
ClassTimer(TClass& obj); ClassTimer(TClass& obj);
void call(TArgs... args); void call(TArgs... args);
inline TDuration getTime() const;
}; };
/// Specialisation for const member functions /// Specialisation for const member functions
template <typename TClass, typename TRet, typename... TArgs, template <typename TClass, typename TRet, typename... TArgs,
TRet (TClass::*TFuncPtr)(TArgs...) const> 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: public:
ClassTimer(TClass& obj); ClassTimer(TClass& obj);
TRet call(TArgs... args); TRet call(TArgs... args);
inline TDuration getTime() const;
}; };
/// Specialisation for const member functions without return value /// Specialisation for const member functions without return value
template <typename TClass, typename... TArgs, void (TClass::*TFuncPtr)(TArgs...) const> 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: public:
ClassTimer(TClass& obj); ClassTimer(TClass& obj);
void call(TArgs... args); void call(TArgs... args);
inline TDuration getTime() const;
}; };
} // namespace corsika } // namespace corsika
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment