Chris@16
|
1 // boost/chrono/process_cpu_clocks.hpp -----------------------------------------------------------//
|
Chris@16
|
2
|
Chris@16
|
3 // Copyright 2009-2011 Vicente J. Botet Escriba
|
Chris@101
|
4 // Copyright (c) Microsoft Corporation 2014
|
Chris@16
|
5
|
Chris@16
|
6 // Distributed under the Boost Software License, Version 1.0.
|
Chris@16
|
7 // See http://www.boost.org/LICENSE_1_0.txt
|
Chris@16
|
8
|
Chris@16
|
9 // See http://www.boost.org/libs/system for documentation.
|
Chris@16
|
10
|
Chris@16
|
11 #ifndef BOOST_CHRONO_PROCESS_CPU_CLOCKS_HPP
|
Chris@16
|
12 #define BOOST_CHRONO_PROCESS_CPU_CLOCKS_HPP
|
Chris@16
|
13
|
Chris@16
|
14 #include <boost/chrono/config.hpp>
|
Chris@16
|
15
|
Chris@16
|
16
|
Chris@16
|
17 #if defined(BOOST_CHRONO_HAS_PROCESS_CLOCKS)
|
Chris@16
|
18
|
Chris@16
|
19 #include <boost/chrono/duration.hpp>
|
Chris@16
|
20 #include <boost/chrono/time_point.hpp>
|
Chris@16
|
21 #include <boost/operators.hpp>
|
Chris@16
|
22 #include <boost/chrono/detail/system.hpp>
|
Chris@16
|
23 #include <iostream>
|
Chris@16
|
24 #include <boost/type_traits/common_type.hpp>
|
Chris@16
|
25 #include <boost/chrono/clock_string.hpp>
|
Chris@16
|
26
|
Chris@16
|
27 #ifndef BOOST_CHRONO_HEADER_ONLY
|
Chris@16
|
28 #include <boost/config/abi_prefix.hpp> // must be the last #include
|
Chris@16
|
29 #endif
|
Chris@16
|
30
|
Chris@16
|
31 namespace boost { namespace chrono {
|
Chris@16
|
32
|
Chris@16
|
33 class BOOST_CHRONO_DECL process_real_cpu_clock {
|
Chris@16
|
34 public:
|
Chris@16
|
35 typedef nanoseconds duration;
|
Chris@16
|
36 typedef duration::rep rep;
|
Chris@16
|
37 typedef duration::period period;
|
Chris@16
|
38 typedef chrono::time_point<process_real_cpu_clock> time_point;
|
Chris@16
|
39 BOOST_STATIC_CONSTEXPR bool is_steady = true;
|
Chris@16
|
40
|
Chris@16
|
41 static BOOST_CHRONO_INLINE time_point now() BOOST_NOEXCEPT;
|
Chris@16
|
42 #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
|
Chris@16
|
43 static BOOST_CHRONO_INLINE time_point now(system::error_code & ec );
|
Chris@16
|
44 #endif
|
Chris@16
|
45 };
|
Chris@16
|
46
|
Chris@101
|
47 #if ! BOOST_OS_WINDOWS || BOOST_PLAT_WINDOWS_DESKTOP
|
Chris@16
|
48 class BOOST_CHRONO_DECL process_user_cpu_clock {
|
Chris@16
|
49 public:
|
Chris@16
|
50 typedef nanoseconds duration;
|
Chris@16
|
51 typedef duration::rep rep;
|
Chris@16
|
52 typedef duration::period period;
|
Chris@16
|
53 typedef chrono::time_point<process_user_cpu_clock> time_point;
|
Chris@16
|
54 BOOST_STATIC_CONSTEXPR bool is_steady = true;
|
Chris@16
|
55
|
Chris@16
|
56 static BOOST_CHRONO_INLINE time_point now() BOOST_NOEXCEPT;
|
Chris@16
|
57 #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
|
Chris@16
|
58 static BOOST_CHRONO_INLINE time_point now(system::error_code & ec );
|
Chris@16
|
59 #endif
|
Chris@16
|
60 };
|
Chris@16
|
61
|
Chris@16
|
62 class BOOST_CHRONO_DECL process_system_cpu_clock {
|
Chris@16
|
63 public:
|
Chris@16
|
64 typedef nanoseconds duration;
|
Chris@16
|
65 typedef duration::rep rep;
|
Chris@16
|
66 typedef duration::period period;
|
Chris@16
|
67 typedef chrono::time_point<process_system_cpu_clock> time_point;
|
Chris@16
|
68 BOOST_STATIC_CONSTEXPR bool is_steady = true;
|
Chris@16
|
69
|
Chris@16
|
70 static BOOST_CHRONO_INLINE time_point now() BOOST_NOEXCEPT;
|
Chris@16
|
71 #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
|
Chris@16
|
72 static BOOST_CHRONO_INLINE time_point now(system::error_code & ec );
|
Chris@16
|
73 #endif
|
Chris@16
|
74 };
|
Chris@101
|
75 #endif
|
Chris@16
|
76
|
Chris@16
|
77 template <typename Rep>
|
Chris@16
|
78 struct process_times
|
Chris@16
|
79 : arithmetic<process_times<Rep>,
|
Chris@16
|
80 multiplicative<process_times<Rep>, Rep,
|
Chris@16
|
81 less_than_comparable<process_times<Rep> > > >
|
Chris@16
|
82 {
|
Chris@16
|
83 //typedef process_real_cpu_clock::rep rep;
|
Chris@16
|
84 typedef Rep rep;
|
Chris@16
|
85 process_times()
|
Chris@16
|
86 : real(0)
|
Chris@16
|
87 , user(0)
|
Chris@16
|
88 , system(0){}
|
Chris@101
|
89
|
Chris@101
|
90 #if ! defined BOOST_CHRONO_DONT_PROVIDES_DEPRECATED_IO_SINCE_V2_0_0
|
Chris@16
|
91 template <typename Rep2>
|
Chris@16
|
92 explicit process_times(
|
Chris@16
|
93 Rep2 r)
|
Chris@16
|
94 : real(r)
|
Chris@16
|
95 , user(r)
|
Chris@16
|
96 , system(r){}
|
Chris@101
|
97 #endif
|
Chris@16
|
98 template <typename Rep2>
|
Chris@16
|
99 explicit process_times(
|
Chris@16
|
100 process_times<Rep2> const& rhs)
|
Chris@16
|
101 : real(rhs.real)
|
Chris@16
|
102 , user(rhs.user)
|
Chris@16
|
103 , system(rhs.system){}
|
Chris@16
|
104 process_times(
|
Chris@16
|
105 rep r,
|
Chris@16
|
106 rep u,
|
Chris@16
|
107 rep s)
|
Chris@16
|
108 : real(r)
|
Chris@16
|
109 , user(u)
|
Chris@16
|
110 , system(s){}
|
Chris@16
|
111
|
Chris@16
|
112 rep real; // real (i.e wall clock) time
|
Chris@16
|
113 rep user; // user cpu time
|
Chris@16
|
114 rep system; // system cpu time
|
Chris@16
|
115
|
Chris@101
|
116 #if ! defined BOOST_CHRONO_DONT_PROVIDES_DEPRECATED_IO_SINCE_V2_0_0
|
Chris@16
|
117 operator rep() const
|
Chris@16
|
118 {
|
Chris@16
|
119 return real;
|
Chris@16
|
120 }
|
Chris@101
|
121 #endif
|
Chris@16
|
122 template <typename Rep2>
|
Chris@16
|
123 bool operator==(process_times<Rep2> const& rhs) {
|
Chris@16
|
124 return (real==rhs.real &&
|
Chris@16
|
125 user==rhs.user &&
|
Chris@16
|
126 system==rhs.system);
|
Chris@16
|
127 }
|
Chris@16
|
128
|
Chris@16
|
129 process_times& operator+=(
|
Chris@16
|
130 process_times const& rhs)
|
Chris@16
|
131 {
|
Chris@16
|
132 real+=rhs.real;
|
Chris@16
|
133 user+=rhs.user;
|
Chris@16
|
134 system+=rhs.system;
|
Chris@16
|
135 return *this;
|
Chris@16
|
136 }
|
Chris@16
|
137 process_times& operator-=(
|
Chris@16
|
138 process_times const& rhs)
|
Chris@16
|
139 {
|
Chris@16
|
140 real-=rhs.real;
|
Chris@16
|
141 user-=rhs.user;
|
Chris@16
|
142 system-=rhs.system;
|
Chris@16
|
143 return *this;
|
Chris@16
|
144 }
|
Chris@16
|
145 process_times& operator*=(
|
Chris@16
|
146 process_times const& rhs)
|
Chris@16
|
147 {
|
Chris@16
|
148 real*=rhs.real;
|
Chris@16
|
149 user*=rhs.user;
|
Chris@16
|
150 system*=rhs.system;
|
Chris@16
|
151 return *this;
|
Chris@16
|
152 }
|
Chris@16
|
153 process_times& operator*=(rep const& rhs)
|
Chris@16
|
154 {
|
Chris@16
|
155 real*=rhs;
|
Chris@16
|
156 user*=rhs;
|
Chris@16
|
157 system*=rhs;
|
Chris@16
|
158 return *this;
|
Chris@16
|
159 }
|
Chris@16
|
160 process_times& operator/=(process_times const& rhs)
|
Chris@16
|
161 {
|
Chris@16
|
162 real/=rhs.real;
|
Chris@16
|
163 user/=rhs.user;
|
Chris@16
|
164 system/=rhs.system;
|
Chris@16
|
165 return *this;
|
Chris@16
|
166 }
|
Chris@16
|
167 process_times& operator/=(rep const& rhs)
|
Chris@16
|
168 {
|
Chris@16
|
169 real/=rhs;
|
Chris@16
|
170 user/=rhs;
|
Chris@16
|
171 system/=rhs;
|
Chris@16
|
172 return *this;
|
Chris@16
|
173 }
|
Chris@16
|
174 bool operator<(process_times const & rhs) const
|
Chris@16
|
175 {
|
Chris@16
|
176 if (real < rhs.real) return true;
|
Chris@16
|
177 if (real > rhs.real) return false;
|
Chris@16
|
178 if (user < rhs.user) return true;
|
Chris@16
|
179 if (user > rhs.user) return false;
|
Chris@16
|
180 if (system < rhs.system) return true;
|
Chris@16
|
181 else return false;
|
Chris@16
|
182 }
|
Chris@16
|
183
|
Chris@16
|
184 template <class CharT, class Traits>
|
Chris@16
|
185 void print(std::basic_ostream<CharT, Traits>& os) const
|
Chris@16
|
186 {
|
Chris@16
|
187 os << "{"<< real <<";"<< user <<";"<< system << "}";
|
Chris@16
|
188 }
|
Chris@16
|
189
|
Chris@16
|
190 template <class CharT, class Traits>
|
Chris@101
|
191 void read(std::basic_istream<CharT, Traits>& is)
|
Chris@16
|
192 {
|
Chris@16
|
193 typedef std::istreambuf_iterator<CharT, Traits> in_iterator;
|
Chris@16
|
194 in_iterator i(is);
|
Chris@16
|
195 in_iterator e;
|
Chris@16
|
196 if (i == e || *i != '{') // mandatory '{'
|
Chris@16
|
197 {
|
Chris@16
|
198 is.setstate(is.failbit | is.eofbit);
|
Chris@16
|
199 return;
|
Chris@16
|
200 }
|
Chris@16
|
201 CharT x,y,z;
|
Chris@16
|
202 is >> real >> x >> user >> y >> system >> z;
|
Chris@16
|
203 if (!is.good() || (x != ';')|| (y != ';')|| (z != '}'))
|
Chris@16
|
204 {
|
Chris@16
|
205 is.setstate(is.failbit);
|
Chris@16
|
206 }
|
Chris@16
|
207 }
|
Chris@16
|
208 };
|
Chris@16
|
209 }
|
Chris@16
|
210 template <class Rep1, class Rep2>
|
Chris@16
|
211 struct common_type<
|
Chris@16
|
212 chrono::process_times<Rep1>,
|
Chris@16
|
213 chrono::process_times<Rep2>
|
Chris@16
|
214 >
|
Chris@16
|
215 {
|
Chris@16
|
216 typedef chrono::process_times<typename common_type<Rep1, Rep2>::type> type;
|
Chris@16
|
217 };
|
Chris@16
|
218
|
Chris@16
|
219 template <class Rep1, class Rep2>
|
Chris@16
|
220 struct common_type<
|
Chris@16
|
221 chrono::process_times<Rep1>,
|
Chris@16
|
222 Rep2
|
Chris@16
|
223 >
|
Chris@16
|
224 {
|
Chris@16
|
225 typedef chrono::process_times<typename common_type<Rep1, Rep2>::type> type;
|
Chris@16
|
226 };
|
Chris@16
|
227
|
Chris@16
|
228 template <class Rep1, class Rep2>
|
Chris@16
|
229 struct common_type<
|
Chris@16
|
230 Rep1,
|
Chris@16
|
231 chrono::process_times<Rep2>
|
Chris@16
|
232 >
|
Chris@16
|
233 {
|
Chris@16
|
234 typedef chrono::process_times<typename common_type<Rep1, Rep2>::type> type;
|
Chris@16
|
235 };
|
Chris@16
|
236
|
Chris@16
|
237
|
Chris@16
|
238 namespace chrono
|
Chris@16
|
239 {
|
Chris@16
|
240 template <class Rep1, class Period1, class Rep2, class Period2>
|
Chris@16
|
241 inline BOOST_CONSTEXPR
|
Chris@16
|
242 bool
|
Chris@16
|
243 operator==(const duration<process_times<Rep1>, Period1>& lhs,
|
Chris@16
|
244 const duration<process_times<Rep2>, Period2>& rhs)
|
Chris@16
|
245 {
|
Chris@16
|
246 return boost::chrono::detail::duration_eq<
|
Chris@16
|
247 duration<process_times<Rep1>, Period1>, duration<process_times<Rep2>, Period2> >()(lhs, rhs);
|
Chris@16
|
248 }
|
Chris@16
|
249
|
Chris@16
|
250 template <class Rep1, class Period1, class Rep2, class Period2>
|
Chris@16
|
251 inline BOOST_CONSTEXPR
|
Chris@16
|
252 bool
|
Chris@16
|
253 operator==(const duration<process_times<Rep1>, Period1>& lhs,
|
Chris@16
|
254 const duration<Rep2, Period2>& rhs)
|
Chris@16
|
255 {
|
Chris@16
|
256 return boost::chrono::detail::duration_eq<
|
Chris@16
|
257 duration<Rep1, Period1>, duration<Rep2, Period2> >()(duration<Rep1, Period1>(lhs.count().real), rhs);
|
Chris@16
|
258 }
|
Chris@16
|
259
|
Chris@16
|
260 template <class Rep1, class Period1, class Rep2, class Period2>
|
Chris@16
|
261 inline BOOST_CONSTEXPR
|
Chris@16
|
262 bool
|
Chris@16
|
263 operator==(const duration<Rep1, Period1>& lhs,
|
Chris@16
|
264 const duration<process_times<Rep2>, Period2>& rhs)
|
Chris@16
|
265 {
|
Chris@16
|
266 return rhs == lhs;
|
Chris@16
|
267 }
|
Chris@16
|
268
|
Chris@16
|
269
|
Chris@16
|
270 // Duration <
|
Chris@16
|
271
|
Chris@16
|
272 template <class Rep1, class Period1, class Rep2, class Period2>
|
Chris@16
|
273 inline BOOST_CONSTEXPR
|
Chris@16
|
274 bool
|
Chris@16
|
275 operator< (const duration<process_times<Rep1>, Period1>& lhs,
|
Chris@16
|
276 const duration<Rep2, Period2>& rhs)
|
Chris@16
|
277 {
|
Chris@16
|
278 return boost::chrono::detail::duration_lt<
|
Chris@16
|
279 duration<Rep1, Period1>, duration<Rep2, Period2> >()(duration<Rep1, Period1>(lhs.count().real), rhs);
|
Chris@16
|
280 }
|
Chris@16
|
281
|
Chris@16
|
282 template <class Rep1, class Period1, class Rep2, class Period2>
|
Chris@16
|
283 inline BOOST_CONSTEXPR
|
Chris@16
|
284 bool
|
Chris@16
|
285 operator< (const duration<Rep1, Period1>& lhs,
|
Chris@16
|
286 const duration<process_times<Rep2>, Period2>& rhs)
|
Chris@16
|
287 {
|
Chris@16
|
288 return rhs < lhs;
|
Chris@16
|
289 }
|
Chris@16
|
290
|
Chris@16
|
291 template <class Rep1, class Period1, class Rep2, class Period2>
|
Chris@16
|
292 inline BOOST_CONSTEXPR
|
Chris@16
|
293 bool
|
Chris@16
|
294 operator< (const duration<process_times<Rep1>, Period1>& lhs,
|
Chris@16
|
295 const duration<process_times<Rep2>, Period2>& rhs)
|
Chris@16
|
296 {
|
Chris@16
|
297 return boost::chrono::detail::duration_lt<
|
Chris@16
|
298 duration<Rep1, Period1>, duration<Rep2, Period2> >()(lhs, rhs);
|
Chris@16
|
299 }
|
Chris@16
|
300
|
Chris@16
|
301
|
Chris@16
|
302 typedef process_times<nanoseconds::rep> process_cpu_clock_times;
|
Chris@101
|
303 #if ! BOOST_OS_WINDOWS || BOOST_PLAT_WINDOWS_DESKTOP
|
Chris@16
|
304 class BOOST_CHRONO_DECL process_cpu_clock
|
Chris@16
|
305 {
|
Chris@16
|
306 public:
|
Chris@16
|
307
|
Chris@16
|
308 typedef process_cpu_clock_times times;
|
Chris@16
|
309 typedef boost::chrono::duration<times, nano> duration;
|
Chris@16
|
310 typedef duration::rep rep;
|
Chris@16
|
311 typedef duration::period period;
|
Chris@16
|
312 typedef chrono::time_point<process_cpu_clock> time_point;
|
Chris@16
|
313 BOOST_STATIC_CONSTEXPR bool is_steady = true;
|
Chris@16
|
314
|
Chris@16
|
315 static BOOST_CHRONO_INLINE time_point now() BOOST_NOEXCEPT;
|
Chris@16
|
316 #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
|
Chris@16
|
317 static BOOST_CHRONO_INLINE time_point now(system::error_code & ec );
|
Chris@16
|
318 #endif
|
Chris@16
|
319 };
|
Chris@101
|
320 #endif
|
Chris@16
|
321
|
Chris@16
|
322 template <class CharT, class Traits, typename Rep>
|
Chris@16
|
323 std::basic_ostream<CharT, Traits>&
|
Chris@16
|
324 operator<<(std::basic_ostream<CharT, Traits>& os,
|
Chris@16
|
325 process_times<Rep> const& rhs)
|
Chris@16
|
326 {
|
Chris@16
|
327 rhs.print(os);
|
Chris@16
|
328 return os;
|
Chris@16
|
329 }
|
Chris@16
|
330
|
Chris@16
|
331 template <class CharT, class Traits, typename Rep>
|
Chris@16
|
332 std::basic_istream<CharT, Traits>&
|
Chris@16
|
333 operator>>(std::basic_istream<CharT, Traits>& is,
|
Chris@101
|
334 process_times<Rep>& rhs)
|
Chris@16
|
335 {
|
Chris@16
|
336 rhs.read(is);
|
Chris@16
|
337 return is;
|
Chris@16
|
338 }
|
Chris@16
|
339
|
Chris@16
|
340 template <typename Rep>
|
Chris@16
|
341 struct duration_values<process_times<Rep> >
|
Chris@16
|
342 {
|
Chris@16
|
343 typedef process_times<Rep> Res;
|
Chris@16
|
344 public:
|
Chris@16
|
345 static Res zero()
|
Chris@16
|
346 {
|
Chris@16
|
347 return Res();
|
Chris@16
|
348 }
|
Chris@16
|
349 static Res max BOOST_PREVENT_MACRO_SUBSTITUTION ()
|
Chris@16
|
350 {
|
Chris@16
|
351 return Res((std::numeric_limits<Rep>::max)(),
|
Chris@16
|
352 (std::numeric_limits<Rep>::max)(),
|
Chris@16
|
353 (std::numeric_limits<Rep>::max)());
|
Chris@16
|
354 }
|
Chris@16
|
355 static Res min BOOST_PREVENT_MACRO_SUBSTITUTION ()
|
Chris@16
|
356 {
|
Chris@16
|
357 return Res((std::numeric_limits<Rep>::min)(),
|
Chris@16
|
358 (std::numeric_limits<Rep>::min)(),
|
Chris@16
|
359 (std::numeric_limits<Rep>::min)());
|
Chris@16
|
360 }
|
Chris@16
|
361 };
|
Chris@16
|
362
|
Chris@16
|
363 template<class CharT>
|
Chris@16
|
364 struct clock_string<process_real_cpu_clock, CharT>
|
Chris@16
|
365 {
|
Chris@16
|
366 static std::basic_string<CharT> name()
|
Chris@16
|
367 {
|
Chris@16
|
368 static const CharT
|
Chris@16
|
369 u[] =
|
Chris@16
|
370 { 'p', 'r', 'o', 'c', 'e', 's', 's', '_', 'r', 'e', 'a', 'l', '_', 'c', 'l', 'o', 'c', 'k' };
|
Chris@16
|
371 static const std::basic_string<CharT> str(u, u + sizeof(u)
|
Chris@16
|
372 / sizeof(u[0]));
|
Chris@16
|
373 return str;
|
Chris@16
|
374 }
|
Chris@16
|
375 static std::basic_string<CharT> since()
|
Chris@16
|
376 {
|
Chris@16
|
377 const CharT
|
Chris@16
|
378 u[] =
|
Chris@16
|
379 { ' ', 's', 'i', 'n', 'c', 'e', ' ', 'p', 'r', 'o', 'c', 'e', 's', 's', ' ', 's', 't', 'a', 'r', 't', '-', 'u', 'p' };
|
Chris@16
|
380 const std::basic_string<CharT> str(u, u + sizeof(u) / sizeof(u[0]));
|
Chris@16
|
381 return str;
|
Chris@16
|
382 }
|
Chris@16
|
383 };
|
Chris@16
|
384
|
Chris@101
|
385 #if ! BOOST_OS_WINDOWS || BOOST_PLAT_WINDOWS_DESKTOP
|
Chris@16
|
386 template<class CharT>
|
Chris@16
|
387 struct clock_string<process_user_cpu_clock, CharT>
|
Chris@16
|
388 {
|
Chris@16
|
389 static std::basic_string<CharT> name()
|
Chris@16
|
390 {
|
Chris@16
|
391 static const CharT
|
Chris@16
|
392 u[] =
|
Chris@16
|
393 { 'p', 'r', 'o', 'c', 'e', 's', 's', '_', 'u', 's', 'e', 'r', '_', 'c', 'l', 'o', 'c', 'k' };
|
Chris@16
|
394 static const std::basic_string<CharT> str(u, u + sizeof(u)
|
Chris@16
|
395 / sizeof(u[0]));
|
Chris@16
|
396 return str;
|
Chris@16
|
397 }
|
Chris@16
|
398 static std::basic_string<CharT> since()
|
Chris@16
|
399 {
|
Chris@16
|
400 const CharT
|
Chris@16
|
401 u[] =
|
Chris@16
|
402 { ' ', 's', 'i', 'n', 'c', 'e', ' ', 'p', 'r', 'o', 'c', 'e', 's', 's', ' ', 's', 't', 'a', 'r', 't', '-', 'u', 'p' };
|
Chris@16
|
403 const std::basic_string<CharT> str(u, u + sizeof(u) / sizeof(u[0]));
|
Chris@16
|
404 return str;
|
Chris@16
|
405 }
|
Chris@16
|
406 };
|
Chris@16
|
407
|
Chris@16
|
408 template<class CharT>
|
Chris@16
|
409 struct clock_string<process_system_cpu_clock, CharT>
|
Chris@16
|
410 {
|
Chris@16
|
411 static std::basic_string<CharT> name()
|
Chris@16
|
412 {
|
Chris@16
|
413 static const CharT
|
Chris@16
|
414 u[] =
|
Chris@16
|
415 { 'p', 'r', 'o', 'c', 'e', 's', 's', '_', 's', 'y', 's', 't', 't', 'e', 'm', '_', 'c', 'l', 'o', 'c', 'k' };
|
Chris@16
|
416 static const std::basic_string<CharT> str(u, u + sizeof(u)
|
Chris@16
|
417 / sizeof(u[0]));
|
Chris@16
|
418 return str;
|
Chris@16
|
419 }
|
Chris@16
|
420 static std::basic_string<CharT> since()
|
Chris@16
|
421 {
|
Chris@16
|
422 const CharT
|
Chris@16
|
423 u[] =
|
Chris@16
|
424 { ' ', 's', 'i', 'n', 'c', 'e', ' ', 'p', 'r', 'o', 'c', 'e', 's', 's', ' ', 's', 't', 'a', 'r', 't', '-', 'u', 'p' };
|
Chris@16
|
425 const std::basic_string<CharT> str(u, u + sizeof(u) / sizeof(u[0]));
|
Chris@16
|
426 return str;
|
Chris@16
|
427 }
|
Chris@16
|
428 };
|
Chris@16
|
429
|
Chris@16
|
430 template<class CharT>
|
Chris@16
|
431 struct clock_string<process_cpu_clock, CharT>
|
Chris@16
|
432 {
|
Chris@16
|
433 static std::basic_string<CharT> name()
|
Chris@16
|
434 {
|
Chris@16
|
435 static const CharT u[] =
|
Chris@16
|
436 { 'p', 'r', 'o', 'c', 'e', 's', 's', '_', 'c', 'l', 'o', 'c', 'k' };
|
Chris@16
|
437 static const std::basic_string<CharT> str(u, u + sizeof(u)
|
Chris@16
|
438 / sizeof(u[0]));
|
Chris@16
|
439 return str;
|
Chris@16
|
440 }
|
Chris@16
|
441 static std::basic_string<CharT> since()
|
Chris@16
|
442 {
|
Chris@16
|
443 const CharT
|
Chris@16
|
444 u[] =
|
Chris@16
|
445 { ' ', 's', 'i', 'n', 'c', 'e', ' ', 'p', 'r', 'o', 'c', 'e', 's', 's', ' ', 's', 't', 'a', 'r', 't', '-', 'u', 'p' };
|
Chris@16
|
446 const std::basic_string<CharT> str(u, u + sizeof(u) / sizeof(u[0]));
|
Chris@16
|
447 return str;
|
Chris@16
|
448 }
|
Chris@16
|
449 };
|
Chris@101
|
450 #endif
|
Chris@16
|
451
|
Chris@16
|
452 } // namespace chrono
|
Chris@16
|
453 } // namespace boost
|
Chris@16
|
454
|
Chris@16
|
455 namespace std {
|
Chris@16
|
456
|
Chris@16
|
457 template <typename Rep>
|
Chris@16
|
458 struct numeric_limits<boost::chrono::process_times<Rep> >
|
Chris@16
|
459 {
|
Chris@16
|
460 typedef boost::chrono::process_times<Rep> Res;
|
Chris@16
|
461
|
Chris@16
|
462 public:
|
Chris@16
|
463 static const bool is_specialized = true;
|
Chris@16
|
464 static Res min BOOST_PREVENT_MACRO_SUBSTITUTION ()
|
Chris@16
|
465 {
|
Chris@16
|
466 return Res((std::numeric_limits<Rep>::min)(),
|
Chris@16
|
467 (std::numeric_limits<Rep>::min)(),
|
Chris@16
|
468 (std::numeric_limits<Rep>::min)());
|
Chris@16
|
469 }
|
Chris@16
|
470 static Res max BOOST_PREVENT_MACRO_SUBSTITUTION ()
|
Chris@16
|
471 {
|
Chris@16
|
472 return Res((std::numeric_limits<Rep>::max)(),
|
Chris@16
|
473 (std::numeric_limits<Rep>::max)(),
|
Chris@16
|
474 (std::numeric_limits<Rep>::max)());
|
Chris@16
|
475 }
|
Chris@16
|
476 static Res lowest() throw()
|
Chris@16
|
477 {
|
Chris@16
|
478 return (min)();
|
Chris@16
|
479 }
|
Chris@16
|
480 static const int digits = std::numeric_limits<Rep>::digits+
|
Chris@16
|
481 std::numeric_limits<Rep>::digits+
|
Chris@16
|
482 std::numeric_limits<Rep>::digits;
|
Chris@16
|
483 static const int digits10 = std::numeric_limits<Rep>::digits10+
|
Chris@16
|
484 std::numeric_limits<Rep>::digits10+
|
Chris@16
|
485 std::numeric_limits<Rep>::digits10;
|
Chris@16
|
486 static const bool is_signed = Rep::is_signed;
|
Chris@16
|
487 static const bool is_integer = Rep::is_integer;
|
Chris@16
|
488 static const bool is_exact = Rep::is_exact;
|
Chris@16
|
489 static const int radix = 0;
|
Chris@16
|
490 //~ static Res epsilon() throw() { return 0; }
|
Chris@16
|
491 //~ static Res round_error() throw() { return 0; }
|
Chris@16
|
492 //~ static const int min_exponent = 0;
|
Chris@16
|
493 //~ static const int min_exponent10 = 0;
|
Chris@16
|
494 //~ static const int max_exponent = 0;
|
Chris@16
|
495 //~ static const int max_exponent10 = 0;
|
Chris@16
|
496 //~ static const bool has_infinity = false;
|
Chris@16
|
497 //~ static const bool has_quiet_NaN = false;
|
Chris@16
|
498 //~ static const bool has_signaling_NaN = false;
|
Chris@16
|
499 //~ static const float_denorm_style has_denorm = denorm_absent;
|
Chris@16
|
500 //~ static const bool has_denorm_loss = false;
|
Chris@16
|
501 //~ static Res infinity() throw() { return 0; }
|
Chris@16
|
502 //~ static Res quiet_NaN() throw() { return 0; }
|
Chris@16
|
503 //~ static Res signaling_NaN() throw() { return 0; }
|
Chris@16
|
504 //~ static Res denorm_min() throw() { return 0; }
|
Chris@16
|
505 //~ static const bool is_iec559 = false;
|
Chris@16
|
506 //~ static const bool is_bounded = true;
|
Chris@16
|
507 //~ static const bool is_modulo = false;
|
Chris@16
|
508 //~ static const bool traps = false;
|
Chris@16
|
509 //~ static const bool tinyness_before = false;
|
Chris@16
|
510 //~ static const float_round_style round_style = round_toward_zero;
|
Chris@16
|
511
|
Chris@16
|
512 };
|
Chris@16
|
513 }
|
Chris@16
|
514
|
Chris@16
|
515 #ifndef BOOST_CHRONO_HEADER_ONLY
|
Chris@16
|
516 #include <boost/config/abi_suffix.hpp> // pops abi_prefix.hpp pragmas
|
Chris@16
|
517 #else
|
Chris@16
|
518 #include <boost/chrono/detail/inlined/process_cpu_clocks.hpp>
|
Chris@16
|
519 #endif
|
Chris@16
|
520 #endif
|
Chris@16
|
521
|
Chris@16
|
522 #endif // BOOST_CHRONO_PROCESS_CPU_CLOCKS_HPP
|