Massive indent of all codes:
[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  *  This file must be used under the terms of the CeCILL.
6  *  This source file is licensed as described in the file COPYING, which
7  *  you should have received as part of this distribution.  The terms
8  *  are also available at
9  *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 #ifndef __TIMER_HXX__
14 #define __TIMER_HXX__
15
16 #ifndef _MSC_VER
17 #include <sys/time.h>
18 #else
19 #include <windows.h>
20 //#include <winbase.h>
21 #endif
22 #include <iostream>
23 #include <iomanip>
24
25 class Timer
26 {
27
28 private:
29 #ifndef _MSC_VER
30     int start_hour;
31     int start_min;
32     int start_sec;
33     int start_usec;
34 #else
35     LARGE_INTEGER iStart;
36     LARGE_INTEGER iEnd;
37     LARGE_INTEGER iFreq;
38 #endif
39
40 public:
41
42     //===========================================================================
43     // Return the total time that the timer has been in the "running"
44     // state since it was first "started" or last "restarted".  For
45     // "short" time periods (less than an hour), the actual cpu time
46     // used is reported instead of the elapsed time.
47
48     inline double elapsed_time(bool _bRestart = false)
49     {
50         // FIXME : Tonio
51 #ifndef _MSC_VER
52         struct timeval tv;
53         struct timezone tz;
54         struct tm *tm;
55         gettimeofday(&tv, &tz);
56         tm = localtime(&tv.tv_sec);
57         double dblTime = ( 3600000.0 * (tm->tm_hour - start_hour) +
58                            60000.0 * (tm->tm_min - start_min) +
59                            1000.0 * (tm->tm_sec - start_sec) +
60                            (1.0 * (tv.tv_usec - start_usec)) / 1000.0
61                          );
62 #else
63         QueryPerformanceCounter(&iEnd);
64         double dblTime  = ((iEnd.QuadPart - iStart.QuadPart) * 1000.0) / iFreq.QuadPart;
65 #endif
66
67         if (_bRestart == true)
68         {
69             start();
70         }
71         return dblTime;
72     } // timer::elapsed_time
73 public:
74     Timer()
75     {
76 #ifndef _MSC_VER
77         start_hour      = 0;
78         start_min               = 0;
79         start_sec               = 0;
80         start_usec      = 0;
81 #else
82         iStart.QuadPart = 0;
83         iEnd.QuadPart           = 0;
84         QueryPerformanceFrequency(&iFreq);
85 #endif
86     }
87
88     //===========================================================================
89     // Start a timer.  If it is already running, let it continue running.
90     // Print an optional message.
91
92     inline void start(const char* msg = 0)
93     {
94         // Print an optional message, something like "Starting timer t";
95         if (msg)
96         {
97             std::cerr << msg << std::endl;
98         }
99 #ifndef _MSC_VER
100         // FIXME : Tonio
101
102         // Set the start time
103         struct timeval tv;
104         struct timezone tz;
105         struct tm *tm;
106         gettimeofday(&tv, &tz);
107         tm = localtime(&tv.tv_sec);
108         start_hour = tm->tm_hour;
109         start_min = tm->tm_min;
110         start_sec = tm->tm_sec;
111         start_usec = tv.tv_usec;
112 #else
113         QueryPerformanceCounter(&iStart);
114 #endif
115     } // timer::start
116
117     //===========================================================================
118     // Stop the timer and print an optional message.
119
120     //===========================================================================
121     // Print out an optional message followed by the current timer timing.
122
123     inline double check(const char* msg, bool _bRestart = false)
124     {
125         // Print an optional message, something like "Checking timer t";
126         double t = elapsed_time();
127         if (msg)
128         {
129             std::cerr << "[" << msg << "]" << " : ";
130         }
131         std::cerr << "Elapsed time ["
132                   << std::setiosflags(std::ios::fixed)
133                   << std::setprecision(3)
134                   << t << "] milliseconds"
135                   << std::endl;
136
137         if (_bRestart == true)
138         {
139             start();
140         }
141         return t;
142     } // timer::check
143
144 };
145
146 //===========================================================================
147 // Allow timers to be printed to ostreams using the syntax 'os << t'
148 // for an ostream 'os' and a timer 't'.  For example, "cout << t" will
149 // print out the total amount of time 't' has been "running".
150
151 inline std::ostream& operator<<(std::ostream& os, Timer& t)
152 {
153     os << std::setprecision(3)
154        << std::setiosflags(std::ios::fixed)
155        << t.elapsed_time() ;
156     return os;
157 }
158
159 //===========================================================================
160 #endif /* !__TIMER_HXX__ */