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
No related merge requests found
......@@ -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
......@@ -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
......
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