annotate modules/elapsed-timer/elapsed-timer.hpp @ 548:f48bb09bccc7

Misc: huge cleanup, switch to spaces
author David Demelier <markand@malikania.fr>
date Wed, 15 Jun 2016 13:13:26 +0200
parents 33f98fda1884
children d0b9ce94b857
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
532
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * elapsed-timer.hpp -- measure elapsed time
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2013-2016 David Demelier <markand@malikania.fr>
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #ifndef ELAPSED_TIMER_HPP
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #define ELAPSED_TIMER_HPP
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
21
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 /**
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 * \file elapsed-timer.hpp
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 * \brief Measure elapsed time
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 */
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
26
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 #include <chrono>
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
28
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 /**
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 * \brief Measure elapsed time
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 *
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 * This class provides an abstraction to measure elapsed time since the construction of the object. It uses
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 * std::chrono::high_resolution_clock for more precision and uses milliseconds only.
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 */
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 class ElapsedTimer {
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 private:
548
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
37 using TimePoint = std::chrono::time_point<std::chrono::high_resolution_clock>;
532
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
38
548
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
39 TimePoint m_last;
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
40 bool m_paused{false};
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
41 unsigned m_elapsed{0};
532
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
42
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 public:
548
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
44 /**
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
45 * Construct the elapsed timer, start counting.
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
46 */
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
47 inline ElapsedTimer() noexcept
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
48 : m_last(std::chrono::high_resolution_clock::now())
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
49 {
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
50 }
532
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
51
548
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
52 /**
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
53 * Put the timer on pause, the already elapsed time is stored.
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
54 */
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
55 inline void pause() noexcept
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
56 {
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
57 /*
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
58 * When we put the timer on pause, do not forget to set the already
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
59 * elapsed time.
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
60 */
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
61 elapsed();
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
62 m_paused = true;
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
63 }
532
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
64
548
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
65 /**
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
66 * Restart the timer, does not reset it.
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
67 */
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
68 inline void restart() noexcept
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
69 {
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
70 m_paused = false;
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
71 m_last = std::chrono::high_resolution_clock::now();
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
72 }
532
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
73
548
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
74 /**
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
75 * Reset the timer to 0.
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
76 */
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
77 inline void reset() noexcept
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
78 {
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
79 m_elapsed = 0;
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
80 m_last = std::chrono::high_resolution_clock::now();
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
81 }
532
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
82
548
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
83 /**
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
84 * Get the number of elapsed milliseconds.
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
85 *
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
86 * \return the milliseconds
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
87 */
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
88 inline unsigned elapsed() noexcept
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
89 {
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
90 using std::chrono::duration_cast;
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
91 using std::chrono::high_resolution_clock;
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
92 using std::chrono::milliseconds;
532
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
93
548
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
94 if (!m_paused) {
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
95 m_elapsed += duration_cast<milliseconds>(high_resolution_clock::now() - m_last).count();
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
96 m_last = high_resolution_clock::now();
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
97 }
532
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
98
548
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
99 return m_elapsed;
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 532
diff changeset
100 }
532
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 };
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
102
33f98fda1884 ElapsedTimer: import
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 #endif // !ELAPSED_TIMER_HPP