installed pty
[VSoRC/.git] / node_modules / node-pty / deps / winpty / src / shared / TimeMeasurement.h
1 // Copyright (c) 2015 Ryan Prichard
2 //
3 // Permission is hereby granted, free of charge, to any person obtaining a copy
4 // of this software and associated documentation files (the "Software"), to
5 // deal in the Software without restriction, including without limitation the
6 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7 // sell copies of the Software, and to permit persons to whom the Software is
8 // furnished to do so, subject to the following conditions:
9 //
10 // The above copyright notice and this permission notice shall be included in
11 // all copies or substantial portions of the Software.
12 //
13 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
19 // IN THE SOFTWARE.
20
21 // Convenience header library for using the high-resolution performance counter
22 // to measure how long some process takes.
23
24 #ifndef TIME_MEASUREMENT_H
25 #define TIME_MEASUREMENT_H
26
27 #include <windows.h>
28 #include <assert.h>
29 #include <stdint.h>
30
31 class TimeMeasurement {
32 public:
33     TimeMeasurement() {
34         static double freq = static_cast<double>(getFrequency());
35         m_freq = freq;
36         m_start = value();
37     }
38
39     double elapsed() {
40         uint64_t elapsedTicks = value() - m_start;
41         return static_cast<double>(elapsedTicks) / m_freq;
42     }
43
44 private:
45     uint64_t getFrequency() {
46         LARGE_INTEGER freq;
47         BOOL success = QueryPerformanceFrequency(&freq);
48         assert(success && "QueryPerformanceFrequency failed");
49         return freq.QuadPart;
50     }
51
52     uint64_t value() {
53         LARGE_INTEGER ret;
54         BOOL success = QueryPerformanceCounter(&ret);
55         assert(success && "QueryPerformanceCounter failed");
56         return ret.QuadPart;
57     }
58
59     uint64_t m_start;
60     double m_freq;
61 };
62
63 #endif // TIME_MEASUREMENT_H