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