1 // Copyright (c) 2020 Robert Vaser
2 
3 #ifndef BIOSOUP_TIMER_HPP_
4 #define BIOSOUP_TIMER_HPP_
5 
6 #include <chrono>  // NOLINT
7 #include <cstdint>
8 
9 namespace biosoup {
10 
11 class Timer {
12  public:
Timer()13   Timer()
14       : checkpoint_(), elapsed_time_(0) {}
15 
16   Timer(const Timer&) = default;
17   Timer& operator=(const Timer&) = default;
18 
19   Timer(Timer&&) = default;
20   Timer& operator=(Timer&&) = default;
21 
22   ~Timer() = default;
23 
elapsed_time(void) const24   double elapsed_time(void) const {
25     return elapsed_time_;
26   }
27 
Start()28   void Start() {
29     checkpoint_ = std::chrono::steady_clock::now();
30   }
31 
Stop()32   double Stop() {
33     if (checkpoint_.time_since_epoch().count()) {  // Start() was called
34       auto duration = std::chrono::duration_cast<std::chrono::duration<double>>(
35           std::chrono::steady_clock::now() - checkpoint_).count();
36       checkpoint_ = {};
37       elapsed_time_ += duration;
38       return duration;
39     }
40     return 0;
41   }
42 
Lap() const43   double Lap() const {
44     if (checkpoint_.time_since_epoch().count()) {  // Start() was called
45       return std::chrono::duration_cast<std::chrono::duration<double>>(
46           std::chrono::steady_clock::now() - checkpoint_).count();
47     }
48     return 0;
49   }
50 
Reset()51   void Reset() {
52     checkpoint_ = {};
53     elapsed_time_ = 0;
54   }
55 
56  private:
57   std::chrono::time_point<std::chrono::steady_clock> checkpoint_;
58   double elapsed_time_;
59 };
60 
61 }  // namespace biosoup
62 
63 #endif  // BIOSOUP_TIMER_HPP_
64