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