Coverity: Core module errors fixed
[scilab.git] / scilab / modules / core / includes / timer.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2008-2008 - DIGITEO - Bruno JOFRET
4  *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  *
14  */
15
16 #ifndef __TIMER_HXX__
17 #define __TIMER_HXX__
18
19 #ifndef _MSC_VER
20 #include <sys/time.h>
21 #else
22 #define NOMINMAX
23 #include <windows.h>
24 #undef NOMINMAX
25 #endif
26 #include <iostream>
27 #include <iomanip>
28
29 class Timer
30 {
31
32 private:
33 #ifndef _MSC_VER
34     int start_hour;
35     int start_min;
36     int start_sec;
37     int start_usec;
38 #else
39     LARGE_INTEGER iStart;
40     LARGE_INTEGER iEnd;
41     LARGE_INTEGER iFreq;
42 #endif
43
44 public:
45
46     //===========================================================================
47     // Return the total time that the timer has been in the "running"
48     // state since it was first "started" or last "restarted".  For
49     // "short" time periods (less than an hour), the actual cpu time
50     // used is reported instead of the elapsed time.
51
52     inline double elapsed_time(bool _bRestart = false)
53     {
54         // FIXME : Tonio
55 #ifndef _MSC_VER
56         struct timeval tv;
57         struct timezone tz;
58         struct tm *tm;
59         gettimeofday(&tv, &tz);
60         tm = localtime(&tv.tv_sec);
61         double dblTime = ( 3600000.0 * (tm->tm_hour - start_hour) +
62                            60000.0 * (tm->tm_min - start_min) +
63                            1000.0 * (tm->tm_sec - start_sec) +
64                            (1.0 * (tv.tv_usec - start_usec)) / 1000.0
65                          );
66 #else
67         QueryPerformanceCounter(&iEnd);
68         double dblTime  = ((iEnd.QuadPart - iStart.QuadPart) * 1000.0) / iFreq.QuadPart;
69 #endif
70
71         if (_bRestart == true)
72         {
73             start();
74         }
75         return dblTime;
76     } // timer::elapsed_time
77 public:
78     Timer()
79     {
80 #ifndef _MSC_VER
81         start_hour      = 0;
82         start_min               = 0;
83         start_sec               = 0;
84         start_usec      = 0;
85 #else
86         iStart.QuadPart = 0;
87         iEnd.QuadPart           = 0;
88         QueryPerformanceFrequency(&iFreq);
89 #endif
90     }
91
92     //===========================================================================
93     // Start a timer.  If it is already running, let it continue running.
94     // Print an optional message.
95
96     inline void start(const std::wstring _msg = std::wstring(L""))
97     {
98         // Print an optional message, something like "Starting timer t";
99         if (_msg.empty() == false)
100         {
101             std::wcerr << _msg << std::endl;
102         }
103 #ifndef _MSC_VER
104         // FIXME : Tonio
105
106         // Set the start time
107         struct timeval tv;
108         struct timezone tz;
109         struct tm *tm;
110         gettimeofday(&tv, &tz);
111         tm = localtime(&tv.tv_sec);
112         start_hour = tm->tm_hour;
113         start_min = tm->tm_min;
114         start_sec = tm->tm_sec;
115         start_usec = tv.tv_usec;
116 #else
117         QueryPerformanceCounter(&iStart);
118 #endif
119     } // timer::start
120
121     //===========================================================================
122     // Stop the timer and print an optional message.
123
124     //===========================================================================
125     // Print out an optional message followed by the current timer timing.
126
127     inline double check(const std::wstring& _msg, bool _bRestart = false)
128     {
129         // Print an optional message, something like "Checking timer t";
130         double t = elapsed_time();
131         std::streamsize ss = std::cout.precision();
132         if (_msg.empty() == false)
133         {
134             std::wcerr << L"[" << _msg << L"]" << L" : ";
135         }
136         std::wcerr << L"Elapsed time ["
137                    << std::setiosflags(std::ios::fixed)
138                    << std::setprecision(3)
139                    << t
140                    << std::setprecision(ss)
141                    << L"] milliseconds"
142                    << std::endl;
143
144         if (_bRestart == true)
145         {
146             start();
147         }
148         return t;
149     } // timer::check
150
151 };
152
153 //===========================================================================
154 // Allow timers to be printed to ostreams using the syntax 'os << t'
155 // for an ostream 'os' and a timer 't'.  For example, "cout << t" will
156 // print out the total amount of time 't' has been "running".
157
158 inline std::wostream& operator<<(std::wostream& os, Timer& t)
159 {
160     os << std::setprecision(3)
161        << std::setiosflags(std::ios::fixed)
162        << t.elapsed_time() ;
163     return os;
164 }
165
166 //===========================================================================
167 #endif /* !__TIMER_HXX__ */