1e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/*
2e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Copyright (c) 2006
3e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Francois Dumont
4e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
5e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * This material is provided "as is", with absolutely no warranty expressed
6e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * or implied. Any use is at your own risk.
7e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
8e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Permission to use or copy this software for any purpose is hereby granted
9e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * without fee, provided the above notices are retained on all copies.
10e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Permission to modify the code and to distribute modified code is granted,
11e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * provided the above notices are retained, and a notice that the code was
12e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * modified is included with the above copyright notice.
13e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
14e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott */
15e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
16e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef CPPUNIT_TIMER_H
17e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#define CPPUNIT_TIMER_H
18e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
19e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_WIN32)
20e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  define CPPUNIT_WIN32_TIMER
21e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <windows.h>
22e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
23e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
24e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottclass Timer {
25e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottpublic:
26e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  Timer() {
27e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (CPPUNIT_WIN32_TIMER)
28e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    m_start.LowPart = m_restart.LowPart = m_stop.LowPart = 0;
29e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    m_start.HighPart = m_restart.HighPart = m_stop.HighPart = 0;
30e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    QueryPerformanceFrequency(&m_frequency);
31e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
32e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
33e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
34e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void start() {
35e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (CPPUNIT_WIN32_TIMER)
36e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    QueryPerformanceCounter(&m_start);
37e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
38e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
39e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
40e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void restart() {
41e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (CPPUNIT_WIN32_TIMER)
42e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    QueryPerformanceCounter(&m_restart);
43e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (m_start.HighPart == 0 && m_start.LowPart == 0) {
44e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      m_start = m_restart;
45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
46e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
47e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
48e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
49e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void stop() {
50e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (CPPUNIT_WIN32_TIMER)
51e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    LARGE_INTEGER stop;
52e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    QueryPerformanceCounter(&stop);
53e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if ((m_stop.HighPart != 0 || m_stop.LowPart != 0) &&
54e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        m_restart.HighPart != 0 && m_restart.LowPart != 0) {
55e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      m_stop.HighPart += (stop.HighPart - m_restart.HighPart);
56e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (stop.LowPart < m_restart.LowPart) {
57e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (m_restart.LowPart - stop.LowPart > m_stop.LowPart) {
58e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          m_stop.HighPart -= 1;
59e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
60e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        m_stop.LowPart -= m_restart.LowPart - stop.LowPart;
61e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
62e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      else {
63e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (stop.LowPart - m_restart.LowPart > 0xFFFFFFFF - m_stop.LowPart) {
64e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          m_stop.HighPart += 1;
65e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
66e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        m_stop.LowPart += stop.LowPart - m_restart.LowPart;
67e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
68e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
69e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    else {
70e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      m_stop = stop;
71e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
72e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
73e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
74e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
75e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  double elapsedMilliseconds() const {
76e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (CPPUNIT_WIN32_TIMER)
77e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    LARGE_INTEGER elapsed;
78e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    elapsed.HighPart = m_stop.HighPart - m_start.HighPart;
79e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    elapsed.LowPart = m_stop.LowPart - m_start.LowPart;
80e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return (double)elapsed.QuadPart / (double)m_frequency.QuadPart * 1000;
81e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
82e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return 0;
83e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
84e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
85e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
86e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  static bool supported() {
87e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (CPPUNIT_WIN32_TIMER)
88e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return true;
89e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
90e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return false;
91e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
92e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
93e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
94e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottprivate:
95e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (CPPUNIT_WIN32_TIMER)
96e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  LARGE_INTEGER m_frequency;
97e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  LARGE_INTEGER m_start, m_stop, m_restart;
98e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
99e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott};
100e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
101e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
102