Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(42)

Side by Side Diff: gcc/libstdc++-v3/include/std/chrono

Issue 3050029: [gcc] GCC 4.5.0=>4.5.1 (Closed) Base URL: ssh://git@gitrw.chromium.org:9222/nacl-toolchain.git
Patch Set: Created 10 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « gcc/libstdc++-v3/include/std/bitset ('k') | gcc/libstdc++-v3/include/std/condition_variable » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // <chrono> -*- C++ -*-
2
3 // Copyright (C) 2008, 2009 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library. This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
9 // any later version.
10
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
15
16 // Under Section 7 of GPL version 3, you are granted additional
17 // permissions described in the GCC Runtime Library Exception, version
18 // 3.1, as published by the Free Software Foundation.
19
20 // You should have received a copy of the GNU General Public License and
21 // a copy of the GCC Runtime Library Exception along with this program;
22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 // <http://www.gnu.org/licenses/>.
24
25 /** @file include/chrono
26 * This is a Standard C++ Library header.
27 */
28
29 #ifndef _GLIBCXX_CHRONO
30 #define _GLIBCXX_CHRONO 1
31
32 #pragma GCC system_header
33
34 #ifndef __GXX_EXPERIMENTAL_CXX0X__
35 # include <c++0x_warning.h>
36 #else
37
38 #ifdef _GLIBCXX_INCLUDE_AS_TR1
39 # error C++0x header cannot be included from TR1 header
40 #endif
41
42 #include <ratio>
43 #include <type_traits>
44 #include <limits>
45 #include <ctime>
46
47 #ifdef _GLIBCXX_USE_C99_STDINT_TR1
48
49 namespace std
50 {
51 /**
52 * @defgroup chrono Time
53 * @ingroup utilities
54 *
55 * Classes and functions for time.
56 * @{
57 */
58
59 /** @namespace std::chrono
60 * @brief ISO C++ 0x entities sub namespace for time and date.
61 */
62 namespace chrono
63 {
64 template<typename _Rep, typename _Period = ratio<1>>
65 struct duration;
66
67 template<typename _Clock, typename _Duration = typename _Clock::duration>
68 struct time_point;
69 }
70
71 // 20.8.2.3 specialization of common_type (for duration)
72 template<typename _Rep1, typename _Period1, typename _Rep2, typename _Period2>
73 struct common_type<chrono::duration<_Rep1, _Period1>,
74 chrono::duration<_Rep2, _Period2>>
75 {
76 typedef chrono::duration<typename common_type<_Rep1, _Rep2>::type,
77 ratio<__static_gcd<_Period1::num, _Period2::num>::value,
78 (_Period1::den / __static_gcd<_Period1::den, _Period2::den>::value)
79 * _Period2::den>> type;
80 };
81
82 // 20.8.2.3 specialization of common_type (for time_point)
83 template<typename _Clock, typename _Duration1, typename _Duration2>
84 struct common_type<chrono::time_point<_Clock, _Duration1>,
85 chrono::time_point<_Clock, _Duration2>>
86 {
87 typedef chrono::time_point<_Clock,
88 typename common_type<_Duration1, _Duration2>::type> type;
89 };
90
91 namespace chrono
92 {
93 // Primary template for duration_cast impl.
94 template<typename _ToDuration, typename _CF, typename _CR,
95 bool _NumIsOne = false, bool _DenIsOne = false>
96 struct __duration_cast_impl
97 {
98 template<typename _Rep, typename _Period>
99 static _ToDuration __cast(const duration<_Rep, _Period>& __d)
100 {
101 return _ToDuration(static_cast<
102 typename _ToDuration::rep>(static_cast<_CR>(__d.count())
103 * static_cast<_CR>(_CF::num)
104 / static_cast<_CR>(_CF::den)));
105 }
106 };
107
108 template<typename _ToDuration, typename _CF, typename _CR>
109 struct __duration_cast_impl<_ToDuration, _CF, _CR, true, true>
110 {
111 template<typename _Rep, typename _Period>
112 static _ToDuration __cast(const duration<_Rep, _Period>& __d)
113 {
114 return _ToDuration(
115 static_cast<typename _ToDuration::rep>(__d.count()));
116 }
117 };
118
119 template<typename _ToDuration, typename _CF, typename _CR>
120 struct __duration_cast_impl<_ToDuration, _CF, _CR, true, false>
121 {
122 template<typename _Rep, typename _Period>
123 static _ToDuration __cast(const duration<_Rep, _Period>& __d)
124 {
125 return _ToDuration(static_cast<typename _ToDuration::rep>(
126 static_cast<_CR>(__d.count()) / static_cast<_CR>(_CF::den)));
127 }
128 };
129
130 template<typename _ToDuration, typename _CF, typename _CR>
131 struct __duration_cast_impl<_ToDuration, _CF, _CR, false, true>
132 {
133 template<typename _Rep, typename _Period>
134 static _ToDuration __cast(const duration<_Rep, _Period>& __d)
135 {
136 return _ToDuration(static_cast<typename _ToDuration::rep>(
137 static_cast<_CR>(__d.count()) * static_cast<_CR>(_CF::num)));
138 }
139 };
140
141 /// duration_cast
142 template<typename _ToDuration, typename _Rep, typename _Period>
143 inline _ToDuration
144 duration_cast(const duration<_Rep, _Period>& __d)
145 {
146 typedef typename
147 ratio_divide<_Period, typename _ToDuration::period>::type __cf;
148 typedef typename
149 common_type<typename _ToDuration::rep, _Rep, intmax_t>::type __cr;
150
151 return __duration_cast_impl<_ToDuration, __cf, __cr,
152 __cf::num == 1, __cf::den == 1>::__cast(__d);
153 }
154
155 /// treat_as_floating_point
156 template<typename _Rep>
157 struct treat_as_floating_point
158 : is_floating_point<_Rep>
159 { };
160
161 /// duration_values
162 template<typename _Rep>
163 struct duration_values
164 {
165 static const _Rep
166 zero()
167 { return _Rep(0); }
168
169 static const _Rep
170 max()
171 { return numeric_limits<_Rep>::max(); }
172
173 static const _Rep
174 min()
175 { return numeric_limits<_Rep>::min(); }
176 };
177
178 template<typename _Tp>
179 struct __is_duration
180 : std::false_type
181 { };
182
183 template<typename _Rep, typename _Period>
184 struct __is_duration<duration<_Rep, _Period>>
185 : std::true_type
186 { };
187
188 template<typename T>
189 struct __is_ratio
190 : std::false_type
191 { };
192
193 template<intmax_t _Num, intmax_t _Den>
194 struct __is_ratio<ratio<_Num, _Den>>
195 : std::true_type
196 { };
197
198 /// duration
199 template<typename _Rep, typename _Period>
200 struct duration
201 {
202 static_assert(!__is_duration<_Rep>::value, "rep cannot be a duration");
203 static_assert(__is_ratio<_Period>::value,
204 "period must be a specialization of ratio");
205 static_assert(_Period::num > 0, "period must be positive");
206
207 typedef _Rep rep;
208 typedef _Period period;
209
210 // 20.8.3.1 construction / copy / destroy
211 duration() = default;
212
213 template<typename _Rep2>
214 explicit duration(_Rep2 const& __rep)
215 : __r(static_cast<rep>(__rep))
216 {
217 static_assert(is_convertible<_Rep2,rep>::value
218 && (treat_as_floating_point<rep>::value
219 || !treat_as_floating_point<_Rep2>::value),
220 "cannot construct integral duration with floating point type");
221 }
222
223 template<typename _Rep2, typename _Period2>
224 duration(const duration<_Rep2, _Period2>& __d)
225 : __r(duration_cast<duration>(__d).count())
226 {
227 static_assert(treat_as_floating_point<rep>::value == true
228 || ratio_divide<_Period2, period>::type::den == 1,
229 "the resulting duration is not exactly representable");
230 }
231
232 ~duration() = default;
233 duration(const duration&) = default;
234 duration& operator=(const duration&) = default;
235
236 // 20.8.3.2 observer
237 rep
238 count() const
239 { return __r; }
240
241 // 20.8.3.3 arithmetic
242 duration
243 operator+() const
244 { return *this; }
245
246 duration
247 operator-() const
248 { return duration(-__r); }
249
250 duration&
251 operator++()
252 {
253 ++__r;
254 return *this;
255 }
256
257 duration
258 operator++(int)
259 { return duration(__r++); }
260
261 duration&
262 operator--()
263 {
264 --__r;
265 return *this;
266 }
267
268 duration
269 operator--(int)
270 { return duration(__r--); }
271
272 duration&
273 operator+=(const duration& __d)
274 {
275 __r += __d.count();
276 return *this;
277 }
278
279 duration&
280 operator-=(const duration& __d)
281 {
282 __r -= __d.count();
283 return *this;
284 }
285
286 duration&
287 operator*=(const rep& __rhs)
288 {
289 __r *= __rhs;
290 return *this;
291 }
292
293 duration&
294 operator/=(const rep& __rhs)
295 {
296 __r /= __rhs;
297 return *this;
298 }
299
300 // 20.8.3.4 special values
301 // TODO: These should be constexprs.
302 static const duration
303 zero()
304 { return duration(duration_values<rep>::zero()); }
305
306 static const duration
307 min()
308 { return duration(duration_values<rep>::min()); }
309
310 static const duration
311 max()
312 { return duration(duration_values<rep>::max()); }
313
314 private:
315 rep __r;
316 };
317
318 template<typename _Rep1, typename _Period1,
319 typename _Rep2, typename _Period2>
320 inline typename common_type<duration<_Rep1, _Period1>,
321 duration<_Rep2, _Period2>>::type
322 operator+(const duration<_Rep1, _Period1>& __lhs,
323 const duration<_Rep2, _Period2>& __rhs)
324 {
325 typedef typename common_type<duration<_Rep1, _Period1>,
326 duration<_Rep2, _Period2>>::type __ct;
327 return __ct(__lhs) += __rhs;
328 }
329
330 template<typename _Rep1, typename _Period1,
331 typename _Rep2, typename _Period2>
332 inline typename common_type<duration<_Rep1, _Period1>,
333 duration<_Rep2, _Period2>>::type
334 operator-(const duration<_Rep1, _Period1>& __lhs,
335 const duration<_Rep2, _Period2>& __rhs)
336 {
337 typedef typename common_type<duration<_Rep1, _Period1>,
338 duration<_Rep2, _Period2>>::type __ct;
339 return __ct(__lhs) -= __rhs;
340 }
341
342 template<typename _Rep1, typename _Period, typename _Rep2>
343 inline duration<typename common_type<_Rep1, _Rep2>::type, _Period>
344 operator*(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
345 {
346 typedef typename common_type<_Rep1, _Rep2>::type __cr;
347 return duration<__cr, _Period>(__d) *= __s;
348 }
349
350 template<typename _Rep1, typename _Period, typename _Rep2>
351 inline duration<typename common_type<_Rep1, _Rep2>::type, _Period>
352 operator*(const _Rep2& __s, const duration<_Rep1, _Period>& __d)
353 { return __d * __s; }
354
355 template<typename _Tp, typename _Up, typename _Ep = void>
356 struct __division_impl;
357
358 template<typename _Rep1, typename _Period, typename _Rep2>
359 struct __division_impl<duration<_Rep1, _Period>, _Rep2,
360 typename enable_if<!__is_duration<_Rep2>::value>::type>
361 {
362 typedef typename common_type<_Rep1, _Rep2>::type __cr;
363 typedef
364 duration<typename common_type<_Rep1, _Rep2>::type, _Period> __rt;
365
366 static __rt
367 __divide(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
368 { return duration<__cr, _Period>(__d) /= __s; }
369 };
370
371 template<typename _Rep1, typename _Period1,
372 typename _Rep2, typename _Period2>
373 struct __division_impl<duration<_Rep1, _Period1>,
374 duration<_Rep2, _Period2>>
375 {
376 typedef typename common_type<duration<_Rep1, _Period1>,
377 duration<_Rep2, _Period2>>::type __ct;
378 typedef typename common_type<_Rep1, _Rep2>::type __rt;
379
380 static __rt
381 __divide(const duration<_Rep1, _Period1>& __lhs,
382 const duration<_Rep2, _Period2>& __rhs)
383 { return __ct(__lhs).count() / __ct(__rhs).count(); }
384 };
385
386 template<typename _Rep, typename _Period, typename _Up>
387 inline typename __division_impl<duration<_Rep, _Period>, _Up>::__rt
388 operator/(const duration<_Rep, _Period>& __d, const _Up& __u)
389 {
390 return
391 __division_impl<duration<_Rep, _Period>, _Up>::__divide(__d, __u);
392 }
393
394 // comparisons
395 template<typename _Rep1, typename _Period1,
396 typename _Rep2, typename _Period2>
397 inline bool
398 operator==(const duration<_Rep1, _Period1>& __lhs,
399 const duration<_Rep2, _Period2>& __rhs)
400 {
401 typedef typename common_type<duration<_Rep1, _Period1>,
402 duration<_Rep2, _Period2>>::type __ct;
403 return __ct(__lhs).count() == __ct(__rhs).count();
404 }
405
406 template<typename _Rep1, typename _Period1,
407 typename _Rep2, typename _Period2>
408 inline bool
409 operator<(const duration<_Rep1, _Period1>& __lhs,
410 const duration<_Rep2, _Period2>& __rhs)
411 {
412 typedef typename common_type<duration<_Rep1, _Period1>,
413 duration<_Rep2, _Period2>>::type __ct;
414 return __ct(__lhs).count() < __ct(__rhs).count();
415 }
416
417 template<typename _Rep1, typename _Period1,
418 typename _Rep2, typename _Period2>
419 inline bool
420 operator!=(const duration<_Rep1, _Period1>& __lhs,
421 const duration<_Rep2, _Period2>& __rhs)
422 { return !(__lhs == __rhs); }
423
424 template<typename _Rep1, typename _Period1,
425 typename _Rep2, typename _Period2>
426 inline bool
427 operator<=(const duration<_Rep1, _Period1>& __lhs,
428 const duration<_Rep2, _Period2>& __rhs)
429 { return !(__rhs < __lhs); }
430
431 template<typename _Rep1, typename _Period1,
432 typename _Rep2, typename _Period2>
433 inline bool
434 operator>(const duration<_Rep1, _Period1>& __lhs,
435 const duration<_Rep2, _Period2>& __rhs)
436 { return __rhs < __lhs; }
437
438 template<typename _Rep1, typename _Period1,
439 typename _Rep2, typename _Period2>
440 inline bool
441 operator>=(const duration<_Rep1, _Period1>& __lhs,
442 const duration<_Rep2, _Period2>& __rhs)
443 { return !(__lhs < __rhs); }
444
445 /// nanoseconds
446 typedef duration<int64_t, nano> nanoseconds;
447
448 /// microseconds
449 typedef duration<int64_t, micro> microseconds;
450
451 /// milliseconds
452 typedef duration<int64_t, milli> milliseconds;
453
454 /// seconds
455 typedef duration<int64_t > seconds;
456
457 /// minutes
458 typedef duration<int, ratio< 60>> minutes;
459
460 /// hours
461 typedef duration<int, ratio<3600>> hours;
462
463 /// time_point
464 template<typename _Clock, typename _Duration>
465 struct time_point
466 {
467 typedef _Clock clock;
468 typedef _Duration duration;
469 typedef typename duration::rep rep;
470 typedef typename duration::period period;
471
472 time_point() : __d(duration::zero())
473 { }
474
475 explicit time_point(const duration& __dur)
476 : __d(duration::zero() + __dur)
477 { }
478
479 // conversions
480 template<typename _Duration2>
481 time_point(const time_point<clock, _Duration2>& __t)
482 : __d(__t.time_since_epoch())
483 { }
484
485 // observer
486 duration
487 time_since_epoch() const
488 { return __d; }
489
490 // arithmetic
491 time_point&
492 operator+=(const duration& __dur)
493 {
494 __d += __dur;
495 return *this;
496 }
497
498 time_point&
499 operator-=(const duration& __dur)
500 {
501 __d -= __dur;
502 return *this;
503 }
504
505 // special values
506 // TODO: These should be constexprs.
507 static const time_point
508 min()
509 { return time_point(duration::min()); }
510
511 static const time_point
512 max()
513 { return time_point(duration::max()); }
514
515 private:
516 duration __d;
517 };
518
519 /// time_point_cast
520 template<typename _ToDuration, typename _Clock, typename _Duration>
521 inline time_point<_Clock, _ToDuration>
522 time_point_cast(const time_point<_Clock, _Duration>& __t)
523 {
524 return time_point<_Clock, _ToDuration>(
525 duration_cast<_ToDuration>(__t.time_since_epoch()));
526 }
527
528 template<typename _Clock, typename _Duration1,
529 typename _Rep2, typename _Period2>
530 inline time_point<_Clock,
531 typename common_type<_Duration1, duration<_Rep2, _Period2>>::type>
532 operator+(const time_point<_Clock, _Duration1>& __lhs,
533 const duration<_Rep2, _Period2>& __rhs)
534 {
535 typedef time_point<_Clock,
536 typename common_type<_Duration1,
537 duration<_Rep2, _Period2>>::type> __ct;
538 return __ct(__lhs) += __rhs;
539 }
540
541 template<typename _Rep1, typename _Period1,
542 typename _Clock, typename _Duration2>
543 inline time_point<_Clock,
544 typename common_type<duration<_Rep1, _Period1>, _Duration2>::type>
545 operator+(const duration<_Rep1, _Period1>& __lhs,
546 const time_point<_Clock, _Duration2>& __rhs)
547 { return __rhs + __lhs; }
548
549 template<typename _Clock, typename _Duration1,
550 typename _Rep2, typename _Period2>
551 inline time_point<_Clock,
552 typename common_type<_Duration1, duration<_Rep2, _Period2>>::type>
553 operator-(const time_point<_Clock, _Duration1>& __lhs,
554 const duration<_Rep2, _Period2>& __rhs)
555 { return __lhs + (-__rhs); }
556
557 template<typename _Clock, typename _Duration1, typename _Duration2>
558 inline typename common_type<_Duration1, _Duration2>::type
559 operator-(const time_point<_Clock, _Duration1>& __lhs,
560 const time_point<_Clock, _Duration2>& __rhs)
561 { return __lhs.time_since_epoch() - __rhs.time_since_epoch(); }
562
563 template<typename _Clock, typename _Duration1, typename _Duration2>
564 inline bool
565 operator==(const time_point<_Clock, _Duration1>& __lhs,
566 const time_point<_Clock, _Duration2>& __rhs)
567 { return __lhs.time_since_epoch() == __rhs.time_since_epoch(); }
568
569 template<typename _Clock, typename _Duration1, typename _Duration2>
570 inline bool
571 operator!=(const time_point<_Clock, _Duration1>& __lhs,
572 const time_point<_Clock, _Duration2>& __rhs)
573 { return !(__lhs == __rhs); }
574
575 template<typename _Clock, typename _Duration1, typename _Duration2>
576 inline bool
577 operator<(const time_point<_Clock, _Duration1>& __lhs,
578 const time_point<_Clock, _Duration2>& __rhs)
579 { return __lhs.time_since_epoch() < __rhs.time_since_epoch(); }
580
581 template<typename _Clock, typename _Duration1, typename _Duration2>
582 inline bool
583 operator<=(const time_point<_Clock, _Duration1>& __lhs,
584 const time_point<_Clock, _Duration2>& __rhs)
585 { return !(__rhs < __lhs); }
586
587 template<typename _Clock, typename _Duration1, typename _Duration2>
588 inline bool
589 operator>(const time_point<_Clock, _Duration1>& __lhs,
590 const time_point<_Clock, _Duration2>& __rhs)
591 { return __rhs < __lhs; }
592
593 template<typename _Clock, typename _Duration1, typename _Duration2>
594 inline bool
595 operator>=(const time_point<_Clock, _Duration1>& __lhs,
596 const time_point<_Clock, _Duration2>& __rhs)
597 { return !(__lhs < __rhs); }
598
599 /// system_clock
600 struct system_clock
601 {
602 #ifdef _GLIBCXX_USE_CLOCK_REALTIME
603 typedef chrono::nanoseconds duration;
604 #elif defined(_GLIBCXX_USE_GETTIMEOFDAY)
605 typedef chrono::microseconds duration;
606 #else
607 typedef chrono::seconds duration;
608 #endif
609
610 typedef duration::rep rep;
611 typedef duration::period period;
612 typedef chrono::time_point<system_clock, duration> time_point;
613
614 static const bool is_monotonic = false;
615
616 static time_point
617 now();
618
619 // Map to C API
620 static std::time_t
621 to_time_t(const time_point& __t)
622 {
623 return std::time_t(
624 duration_cast<chrono::seconds>(__t.time_since_epoch()).count());
625 }
626
627 static time_point
628 from_time_t(std::time_t __t)
629 {
630 return time_point_cast<system_clock::duration>(
631 chrono::time_point<system_clock, chrono::seconds>(
632 chrono::seconds(__t)));
633 }
634
635 // TODO: requires constexpr
636 /*
637 static_assert(
638 system_clock::duration::min() <
639 system_clock::duration::zero(),
640 "a clock's minimum duration cannot be less than its epoch");
641 */
642 };
643
644 #ifdef _GLIBCXX_USE_CLOCK_MONOTONIC
645 /// monotonic_clock
646 struct monotonic_clock
647 {
648 typedef chrono::nanoseconds duration;
649 typedef duration::rep rep;
650 typedef duration::period period;
651 typedef chrono::time_point<monotonic_clock, duration> time_point;
652
653 static const bool is_monotonic = true;
654
655 static time_point
656 now();
657 };
658 #else
659 typedef system_clock monotonic_clock;
660 #endif
661
662 typedef system_clock high_resolution_clock;
663 } // namespace chrono
664
665 // @} group chrono
666 } // namespace std
667
668 #endif //_GLIBCXX_USE_C99_STDINT_TR1
669
670 #endif //__GXX_EXPERIMENTAL_CXX0X__
671
672 #endif //_GLIBCXX_CHRONO
OLDNEW
« no previous file with comments | « gcc/libstdc++-v3/include/std/bitset ('k') | gcc/libstdc++-v3/include/std/condition_variable » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698