CORSIKA  @c8_version@
The framework to simulate particle cascades for astroparticle physics
ClassTimer.hpp
1 /*
2  * (c) Copyright 2020 CORSIKA Project, corsika-project@lists.kit.edu
3  *
4  * This software is distributed under the terms of the GNU General Public
5  * Licence version 3 (GPL Version 3). See file LICENSE for a full version of
6  * the license.
7  */
8 
9 // Another possibility:
10 // https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Execute-Around_Pointer
11 // for a more global approach
12 //
13 // In this case here only a single function is measured via member function pointer.
14 
15 #pragma once
16 
17 #include <chrono>
18 #include <utility>
19 
20 #include <corsika/framework/analytics/Timer.hpp>
21 
22 namespace corsika {
23 
24  template <class TClass, typename TTimer>
25  class ClassTimerImpl : public TTimer {
26  static_assert(
27  is_timer_v<TTimer>,
28  "TTimer is not a timer!"); // Better
29  // https://en.cppreference.com/w/cpp/language/constraints
30  // but not available in C++17
31 
32  protected:
34  TClass& obj_;
35 
36  public:
37  ClassTimerImpl(TClass& obj)
38  : obj_(obj){};
39  };
40 
42 
46  template <typename TClassFunc, TClassFunc TFunc,
47  typename TTimer =
49  class ClassTimer;
50 
52 
64  template <typename TClass, typename TRet, typename... TArgs,
65  TRet (TClass::*TFuncPtr)(TArgs...), typename TTimer>
66  class ClassTimer<TRet (TClass::*)(TArgs...), TFuncPtr, TTimer>
67  : public ClassTimerImpl<TClass, TTimer> {
68  private:
69  public:
70  ClassTimer(TClass& obj);
71 
73 
80  TRet call(TArgs... args);
81  };
82 
84  template <typename TClass, typename... TArgs, void (TClass::*TFuncPtr)(TArgs...),
85  typename TTimer>
86  class ClassTimer<void (TClass::*)(TArgs...), TFuncPtr, TTimer>
87  : public ClassTimerImpl<TClass, TTimer> {
88  public:
89  ClassTimer(TClass& obj);
90 
91  void call(TArgs... args);
92  };
93 
95  template <typename TClass, typename TRet, typename... TArgs,
96  TRet (TClass::*TFuncPtr)(TArgs...) const, typename TTimer>
97  class ClassTimer<TRet (TClass::*)(TArgs...) const, TFuncPtr, TTimer>
98  : public ClassTimerImpl<TClass, TTimer> {
99  public:
100  ClassTimer(TClass& obj);
101 
102  TRet call(TArgs... args);
103  };
104 
106  template <typename TClass, typename... TArgs, void (TClass::*TFuncPtr)(TArgs...) const,
107  typename TTimer>
108  class ClassTimer<void (TClass::*)(TArgs...) const, TFuncPtr, TTimer>
109  : public ClassTimerImpl<TClass, TTimer> {
110  public:
111  ClassTimer(TClass& obj);
112 
113  void call(TArgs... args);
114  };
115 
116 } // namespace corsika
117 
118 #include <corsika/detail/framework/analytics/ClassTimer.inl>
`, since they are used everywhere as integral part of the framework.
TClass & obj_
Reference to the class object on which the function should be called.
Definition: ClassTimer.hpp:28
Measure the runtime of a single class function.
Definition: ClassTimer.hpp:49