Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
6554 serge 1
//  -*- C++ -*-
2
 
3
// Copyright (C) 2008-2015 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
// .
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
#if __cplusplus < 201103L
35
# include 
36
#else
37
 
38
#include 
39
#include 
40
#include 
41
#include 
42
#include  // for literals support.
43
 
44
#ifdef _GLIBCXX_USE_C99_STDINT_TR1
45
 
46
namespace std _GLIBCXX_VISIBILITY(default)
47
{
48
  /**
49
   * @defgroup chrono Time
50
   * @ingroup utilities
51
   *
52
   * Classes and functions for time.
53
   * @{
54
   */
55
 
56
  /** @namespace std::chrono
57
   *  @brief ISO C++ 2011 entities sub-namespace for time and date.
58
   */
59
  namespace chrono
60
  {
61
  _GLIBCXX_BEGIN_NAMESPACE_VERSION
62
 
63
    template>
64
      struct duration;
65
 
66
    template
67
      struct time_point;
68
 
69
  _GLIBCXX_END_NAMESPACE_VERSION
70
  }
71
 
72
_GLIBCXX_BEGIN_NAMESPACE_VERSION
73
 
74
  // 20.11.4.3 specialization of common_type (for duration, sfinae-friendly)
75
 
76
  template
77
    struct __duration_common_type_wrapper
78
    {
79
    private:
80
      typedef __static_gcd<_Period1::num, _Period2::num> __gcd_num;
81
      typedef __static_gcd<_Period1::den, _Period2::den> __gcd_den;
82
      typedef typename _CT::type __cr;
83
      typedef ratio<__gcd_num::value,
84
        (_Period1::den / __gcd_den::value) * _Period2::den> __r;
85
    public:
86
      typedef __success_type> type;
87
    };
88
 
89
  template
90
    struct __duration_common_type_wrapper<__failure_type, _Period1, _Period2>
91
    { typedef __failure_type type; };
92
 
93
  template
94
    struct common_type,
95
             chrono::duration<_Rep2, _Period2>>
96
    : public __duration_common_type_wrapper
97
             common_type<_Rep1, _Rep2>>::type, _Period1, _Period2>::type
98
    { };
99
 
100
  // 20.11.4.3 specialization of common_type (for time_point, sfinae-friendly)
101
 
102
  template
103
    struct __timepoint_common_type_wrapper
104
    {
105
      typedef __success_type>
106
        type;
107
    };
108
 
109
  template
110
    struct __timepoint_common_type_wrapper<__failure_type, _Clock>
111
    { typedef __failure_type type; };
112
 
113
  template
114
    struct common_type,
115
             chrono::time_point<_Clock, _Duration2>>
116
    : public __timepoint_common_type_wrapper
117
             common_type<_Duration1, _Duration2>>::type, _Clock>::type
118
    { };
119
 
120
_GLIBCXX_END_NAMESPACE_VERSION
121
 
122
  namespace chrono
123
  {
124
  _GLIBCXX_BEGIN_NAMESPACE_VERSION
125
 
126
    // Primary template for duration_cast impl.
127
    template
128
	     bool _NumIsOne = false, bool _DenIsOne = false>
129
      struct __duration_cast_impl
130
      {
131
	template
132
	  static constexpr _ToDur
133
	  __cast(const duration<_Rep, _Period>& __d)
134
	  {
135
	    typedef typename _ToDur::rep			__to_rep;
136
	    return _ToDur(static_cast<__to_rep>(static_cast<_CR>(__d.count())
137
	      * static_cast<_CR>(_CF::num)
138
	      / static_cast<_CR>(_CF::den)));
139
	  }
140
      };
141
 
142
    template
143
      struct __duration_cast_impl<_ToDur, _CF, _CR, true, true>
144
      {
145
	template
146
	  static constexpr _ToDur
147
	  __cast(const duration<_Rep, _Period>& __d)
148
	  {
149
	    typedef typename _ToDur::rep			__to_rep;
150
	    return _ToDur(static_cast<__to_rep>(__d.count()));
151
	  }
152
      };
153
 
154
    template
155
      struct __duration_cast_impl<_ToDur, _CF, _CR, true, false>
156
      {
157
	template
158
	  static constexpr _ToDur
159
	  __cast(const duration<_Rep, _Period>& __d)
160
	  {
161
	    typedef typename _ToDur::rep			__to_rep;
162
	    return _ToDur(static_cast<__to_rep>(
163
	      static_cast<_CR>(__d.count()) / static_cast<_CR>(_CF::den)));
164
	  }
165
      };
166
 
167
    template
168
      struct __duration_cast_impl<_ToDur, _CF, _CR, false, true>
169
      {
170
	template
171
	  static constexpr _ToDur
172
	  __cast(const duration<_Rep, _Period>& __d)
173
	  {
174
	    typedef typename _ToDur::rep			__to_rep;
175
	    return _ToDur(static_cast<__to_rep>(
176
	      static_cast<_CR>(__d.count()) * static_cast<_CR>(_CF::num)));
177
	  }
178
      };
179
 
180
    template
181
      struct __is_duration
182
      : std::false_type
183
      { };
184
 
185
    template
186
      struct __is_duration>
187
      : std::true_type
188
      { };
189
 
190
    /// duration_cast
191
    template
192
      constexpr typename enable_if<__is_duration<_ToDur>::value,
193
				   _ToDur>::type
194
      duration_cast(const duration<_Rep, _Period>& __d)
195
      {
196
	typedef typename _ToDur::period				__to_period;
197
	typedef typename _ToDur::rep				__to_rep;
198
	typedef ratio_divide<_Period, __to_period> 		__cf;
199
	typedef typename common_type<__to_rep, _Rep, intmax_t>::type
200
	  							__cr;
201
	typedef  __duration_cast_impl<_ToDur, __cf, __cr,
202
				      __cf::num == 1, __cf::den == 1> __dc;
203
	return __dc::__cast(__d);
204
      }
205
 
206
    /// treat_as_floating_point
207
    template
208
      struct treat_as_floating_point
209
      : is_floating_point<_Rep>
210
      { };
211
 
212
    /// duration_values
213
    template
214
      struct duration_values
215
      {
216
	static constexpr _Rep
217
	zero()
218
	{ return _Rep(0); }
219
 
220
	static constexpr _Rep
221
	max()
222
	{ return numeric_limits<_Rep>::max(); }
223
 
224
	static constexpr _Rep
225
	min()
226
	{ return numeric_limits<_Rep>::lowest(); }
227
      };
228
 
229
    template
230
      struct __is_ratio
231
      : std::false_type
232
      { };
233
 
234
    template
235
      struct __is_ratio>
236
      : std::true_type
237
      { };
238
 
239
    /// duration
240
    template
241
      struct duration
242
      {
243
	typedef _Rep						rep;
244
	typedef _Period 					period;
245
 
246
	static_assert(!__is_duration<_Rep>::value, "rep cannot be a duration");
247
	static_assert(__is_ratio<_Period>::value,
248
		      "period must be a specialization of ratio");
249
	static_assert(_Period::num > 0, "period must be positive");
250
 
251
	// 20.11.5.1 construction / copy / destroy
252
	constexpr duration() = default;
253
 
254
	// NB: Make constexpr implicit. This cannot be explicitly
255
	// constexpr, as any UDT that is not a literal type with a
256
	// constexpr copy constructor will be ill-formed.
257
	duration(const duration&) = default;
258
 
259
	template
260
	       enable_if::value
261
			 && (treat_as_floating_point::value
262
			     || !treat_as_floating_point<_Rep2>::value)>::type>
263
	  constexpr explicit duration(const _Rep2& __rep)
264
	  : __r(static_cast(__rep)) { }
265
 
266
	template
267
	       enable_if::value
268
			 || (ratio_divide<_Period2, period>::den == 1
269
			     && !treat_as_floating_point<_Rep2>::value)>::type>
270
	  constexpr duration(const duration<_Rep2, _Period2>& __d)
271
	  : __r(duration_cast(__d).count()) { }
272
 
273
	~duration() = default;
274
	duration& operator=(const duration&) = default;
275
 
276
	// 20.11.5.2 observer
277
	constexpr rep
278
	count() const
279
	{ return __r; }
280
 
281
	// 20.11.5.3 arithmetic
282
	constexpr duration
283
	operator+() const
284
	{ return *this; }
285
 
286
	constexpr duration
287
	operator-() const
288
	{ return duration(-__r); }
289
 
290
	duration&
291
	operator++()
292
	{
293
	  ++__r;
294
	  return *this;
295
	}
296
 
297
	duration
298
	operator++(int)
299
	{ return duration(__r++); }
300
 
301
	duration&
302
	operator--()
303
	{
304
	  --__r;
305
	  return *this;
306
	}
307
 
308
	duration
309
	operator--(int)
310
	{ return duration(__r--); }
311
 
312
	duration&
313
	operator+=(const duration& __d)
314
	{
315
	  __r += __d.count();
316
	  return *this;
317
	}
318
 
319
	duration&
320
	operator-=(const duration& __d)
321
	{
322
	  __r -= __d.count();
323
	  return *this;
324
	}
325
 
326
	duration&
327
	operator*=(const rep& __rhs)
328
	{
329
	  __r *= __rhs;
330
	  return *this;
331
	}
332
 
333
	duration&
334
	operator/=(const rep& __rhs)
335
	{
336
	  __r /= __rhs;
337
	  return *this;
338
	}
339
 
340
	// DR 934.
341
	template
342
	  typename enable_if::value,
343
			     duration&>::type
344
	  operator%=(const rep& __rhs)
345
	  {
346
	    __r %= __rhs;
347
	    return *this;
348
	  }
349
 
350
	template
351
	  typename enable_if::value,
352
			     duration&>::type
353
	  operator%=(const duration& __d)
354
	  {
355
	    __r %= __d.count();
356
	    return *this;
357
	  }
358
 
359
	// 20.11.5.4 special values
360
	static constexpr duration
361
	zero()
362
	{ return duration(duration_values::zero()); }
363
 
364
	static constexpr duration
365
	min()
366
	{ return duration(duration_values::min()); }
367
 
368
	static constexpr duration
369
	max()
370
	{ return duration(duration_values::max()); }
371
 
372
      private:
373
	rep __r;
374
      };
375
 
376
    template
377
	     typename _Rep2, typename _Period2>
378
      constexpr typename common_type,
379
				     duration<_Rep2, _Period2>>::type
380
      operator+(const duration<_Rep1, _Period1>& __lhs,
381
		const duration<_Rep2, _Period2>& __rhs)
382
      {
383
	typedef duration<_Rep1, _Period1>			__dur1;
384
	typedef duration<_Rep2, _Period2>			__dur2;
385
	typedef typename common_type<__dur1,__dur2>::type	__cd;
386
	return __cd(__cd(__lhs).count() + __cd(__rhs).count());
387
      }
388
 
389
    template
390
	     typename _Rep2, typename _Period2>
391
      constexpr typename common_type,
392
				     duration<_Rep2, _Period2>>::type
393
      operator-(const duration<_Rep1, _Period1>& __lhs,
394
		const duration<_Rep2, _Period2>& __rhs)
395
      {
396
	typedef duration<_Rep1, _Period1>			__dur1;
397
	typedef duration<_Rep2, _Period2>			__dur2;
398
	typedef typename common_type<__dur1,__dur2>::type	__cd;
399
	return __cd(__cd(__lhs).count() - __cd(__rhs).count());
400
      }
401
 
402
    template
403
	     is_convertible<_Rep2,
404
			    typename common_type<_Rep1, _Rep2>::type>::value>
405
      struct __common_rep_type { };
406
 
407
    template
408
      struct __common_rep_type<_Rep1, _Rep2, true>
409
      { typedef typename common_type<_Rep1, _Rep2>::type type; };
410
 
411
    template
412
      constexpr
413
      duration::type, _Period>
414
      operator*(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
415
      {
416
	typedef duration::type, _Period>
417
	  __cd;
418
	return __cd(__cd(__d).count() * __s);
419
      }
420
 
421
    template
422
      constexpr
423
      duration::type, _Period>
424
      operator*(const _Rep1& __s, const duration<_Rep2, _Period>& __d)
425
      { return __d * __s; }
426
 
427
    template
428
      constexpr duration
429
	enable_if::value, _Rep2>::type>::type, _Period>
430
      operator/(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
431
      {
432
	typedef duration::type, _Period>
433
	  __cd;
434
	return __cd(__cd(__d).count() / __s);
435
      }
436
 
437
    template
438
	     typename _Rep2, typename _Period2>
439
      constexpr typename common_type<_Rep1, _Rep2>::type
440
      operator/(const duration<_Rep1, _Period1>& __lhs,
441
		const duration<_Rep2, _Period2>& __rhs)
442
      {
443
	typedef duration<_Rep1, _Period1>			__dur1;
444
	typedef duration<_Rep2, _Period2>			__dur2;
445
	typedef typename common_type<__dur1,__dur2>::type	__cd;
446
	return __cd(__lhs).count() / __cd(__rhs).count();
447
      }
448
 
449
    // DR 934.
450
    template
451
      constexpr duration
452
	enable_if::value, _Rep2>::type>::type, _Period>
453
      operator%(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
454
      {
455
	typedef duration::type, _Period>
456
	  __cd;
457
	return __cd(__cd(__d).count() % __s);
458
      }
459
 
460
    template
461
	     typename _Rep2, typename _Period2>
462
      constexpr typename common_type,
463
				     duration<_Rep2, _Period2>>::type
464
      operator%(const duration<_Rep1, _Period1>& __lhs,
465
		const duration<_Rep2, _Period2>& __rhs)
466
      {
467
	typedef duration<_Rep1, _Period1>			__dur1;
468
	typedef duration<_Rep2, _Period2>			__dur2;
469
	typedef typename common_type<__dur1,__dur2>::type	__cd;
470
	return __cd(__cd(__lhs).count() % __cd(__rhs).count());
471
      }
472
 
473
    // comparisons
474
    template
475
	     typename _Rep2, typename _Period2>
476
      constexpr bool
477
      operator==(const duration<_Rep1, _Period1>& __lhs,
478
		 const duration<_Rep2, _Period2>& __rhs)
479
      {
480
	typedef duration<_Rep1, _Period1>			__dur1;
481
	typedef duration<_Rep2, _Period2>			__dur2;
482
	typedef typename common_type<__dur1,__dur2>::type	__ct;
483
	return __ct(__lhs).count() == __ct(__rhs).count();
484
      }
485
 
486
    template
487
	     typename _Rep2, typename _Period2>
488
      constexpr bool
489
      operator<(const duration<_Rep1, _Period1>& __lhs,
490
		const duration<_Rep2, _Period2>& __rhs)
491
      {
492
	typedef duration<_Rep1, _Period1>			__dur1;
493
	typedef duration<_Rep2, _Period2>			__dur2;
494
	typedef typename common_type<__dur1,__dur2>::type	__ct;
495
	return __ct(__lhs).count() < __ct(__rhs).count();
496
      }
497
 
498
    template
499
	     typename _Rep2, typename _Period2>
500
      constexpr bool
501
      operator!=(const duration<_Rep1, _Period1>& __lhs,
502
		 const duration<_Rep2, _Period2>& __rhs)
503
      { return !(__lhs == __rhs); }
504
 
505
    template
506
	     typename _Rep2, typename _Period2>
507
      constexpr bool
508
      operator<=(const duration<_Rep1, _Period1>& __lhs,
509
		 const duration<_Rep2, _Period2>& __rhs)
510
      { return !(__rhs < __lhs); }
511
 
512
    template
513
	     typename _Rep2, typename _Period2>
514
      constexpr bool
515
      operator>(const duration<_Rep1, _Period1>& __lhs,
516
		const duration<_Rep2, _Period2>& __rhs)
517
      { return __rhs < __lhs; }
518
 
519
    template
520
	     typename _Rep2, typename _Period2>
521
      constexpr bool
522
      operator>=(const duration<_Rep1, _Period1>& __lhs,
523
		 const duration<_Rep2, _Period2>& __rhs)
524
      { return !(__lhs < __rhs); }
525
 
526
    /// nanoseconds
527
    typedef duration 	    nanoseconds;
528
 
529
    /// microseconds
530
    typedef duration 	    microseconds;
531
 
532
    /// milliseconds
533
    typedef duration 	    milliseconds;
534
 
535
    /// seconds
536
    typedef duration 		    seconds;
537
 
538
    /// minutes
539
    typedef duration>   minutes;
540
 
541
    /// hours
542
    typedef duration>  hours;
543
 
544
    /// time_point
545
    template
546
      struct time_point
547
      {
548
	typedef _Clock			  			clock;
549
	typedef _Dur		  				duration;
550
	typedef typename duration::rep	  			rep;
551
	typedef typename duration::period			period;
552
 
553
	constexpr time_point() : __d(duration::zero())
554
	{ }
555
 
556
	constexpr explicit time_point(const duration& __dur)
557
	: __d(__dur)
558
	{ }
559
 
560
	// conversions
561
	template
562
	  constexpr time_point(const time_point& __t)
563
	  : __d(__t.time_since_epoch())
564
	  { }
565
 
566
	// observer
567
	constexpr duration
568
	time_since_epoch() const
569
	{ return __d; }
570
 
571
	// arithmetic
572
	time_point&
573
	operator+=(const duration& __dur)
574
	{
575
	  __d += __dur;
576
	  return *this;
577
	}
578
 
579
	time_point&
580
	operator-=(const duration& __dur)
581
	{
582
	  __d -= __dur;
583
	  return *this;
584
	}
585
 
586
	// special values
587
	static constexpr time_point
588
	min()
589
	{ return time_point(duration::min()); }
590
 
591
	static constexpr time_point
592
	max()
593
	{ return time_point(duration::max()); }
594
 
595
      private:
596
	duration __d;
597
      };
598
 
599
    /// time_point_cast
600
    template
601
      constexpr typename enable_if<__is_duration<_ToDur>::value,
602
				   time_point<_Clock, _ToDur>>::type
603
      time_point_cast(const time_point<_Clock, _Dur>& __t)
604
      {
605
	typedef time_point<_Clock, _ToDur> 			__time_point;
606
	return __time_point(duration_cast<_ToDur>(__t.time_since_epoch()));
607
      }
608
 
609
    template
610
	     typename _Rep2, typename _Period2>
611
      constexpr time_point<_Clock,
612
	typename common_type<_Dur1, duration<_Rep2, _Period2>>::type>
613
      operator+(const time_point<_Clock, _Dur1>& __lhs,
614
		const duration<_Rep2, _Period2>& __rhs)
615
      {
616
	typedef duration<_Rep2, _Period2>			__dur2;
617
	typedef typename common_type<_Dur1,__dur2>::type	__ct;
618
	typedef time_point<_Clock, __ct> 			__time_point;
619
	return __time_point(__lhs.time_since_epoch() + __rhs);
620
      }
621
 
622
    template
623
	     typename _Clock, typename _Dur2>
624
      constexpr time_point<_Clock,
625
	typename common_type, _Dur2>::type>
626
      operator+(const duration<_Rep1, _Period1>& __lhs,
627
		const time_point<_Clock, _Dur2>& __rhs)
628
      {
629
	typedef duration<_Rep1, _Period1>			__dur1;
630
	typedef typename common_type<__dur1,_Dur2>::type	__ct;
631
	typedef time_point<_Clock, __ct> 			__time_point;
632
	return __time_point(__rhs.time_since_epoch() + __lhs);
633
      }
634
 
635
    template
636
	     typename _Rep2, typename _Period2>
637
      constexpr time_point<_Clock,
638
	typename common_type<_Dur1, duration<_Rep2, _Period2>>::type>
639
      operator-(const time_point<_Clock, _Dur1>& __lhs,
640
		const duration<_Rep2, _Period2>& __rhs)
641
      {
642
	typedef duration<_Rep2, _Period2>			__dur2;
643
	typedef typename common_type<_Dur1,__dur2>::type	__ct;
644
	typedef time_point<_Clock, __ct> 			__time_point;
645
	return __time_point(__lhs.time_since_epoch() -__rhs);
646
      }
647
 
648
    template
649
      constexpr typename common_type<_Dur1, _Dur2>::type
650
      operator-(const time_point<_Clock, _Dur1>& __lhs,
651
		const time_point<_Clock, _Dur2>& __rhs)
652
      { return __lhs.time_since_epoch() - __rhs.time_since_epoch(); }
653
 
654
    template
655
      constexpr bool
656
      operator==(const time_point<_Clock, _Dur1>& __lhs,
657
		 const time_point<_Clock, _Dur2>& __rhs)
658
      { return __lhs.time_since_epoch() == __rhs.time_since_epoch(); }
659
 
660
    template
661
      constexpr bool
662
      operator!=(const time_point<_Clock, _Dur1>& __lhs,
663
		 const time_point<_Clock, _Dur2>& __rhs)
664
      { return !(__lhs == __rhs); }
665
 
666
    template
667
      constexpr bool
668
      operator<(const time_point<_Clock, _Dur1>& __lhs,
669
		const time_point<_Clock, _Dur2>& __rhs)
670
      { return  __lhs.time_since_epoch() < __rhs.time_since_epoch(); }
671
 
672
    template
673
      constexpr bool
674
      operator<=(const time_point<_Clock, _Dur1>& __lhs,
675
		 const time_point<_Clock, _Dur2>& __rhs)
676
      { return !(__rhs < __lhs); }
677
 
678
    template
679
      constexpr bool
680
      operator>(const time_point<_Clock, _Dur1>& __lhs,
681
		const time_point<_Clock, _Dur2>& __rhs)
682
      { return __rhs < __lhs; }
683
 
684
    template
685
      constexpr bool
686
      operator>=(const time_point<_Clock, _Dur1>& __lhs,
687
		 const time_point<_Clock, _Dur2>& __rhs)
688
      { return !(__lhs < __rhs); }
689
 
690
 
691
    // Clocks.
692
 
693
    // Why nanosecond resolution as the default?
694
    // Why have std::system_clock always count in the higest
695
    // resolution (ie nanoseconds), even if on some OSes the low 3
696
    // or 9 decimal digits will be always zero? This allows later
697
    // implementations to change the system_clock::now()
698
    // implementation any time to provide better resolution without
699
    // changing function signature or units.
700
 
701
    // To support the (forward) evolution of the library's defined
702
    // clocks, wrap inside inline namespace so that the current
703
    // defintions of system_clock, steady_clock, and
704
    // high_resolution_clock types are uniquely mangled. This way, new
705
    // code can use the latests clocks, while the library can contain
706
    // compatibility definitions for previous versions.  At some
707
    // point, when these clocks settle down, the inlined namespaces
708
    // can be removed.  XXX GLIBCXX_ABI Deprecated
709
    inline namespace _V2 {
710
 
711
    /**
712
     *  @brief System clock.
713
     *
714
     *  Time returned represents wall time from the system-wide clock.
715
    */
716
    struct system_clock
717
    {
718
      typedef chrono::nanoseconds     				duration;
719
      typedef duration::rep    					rep;
720
      typedef duration::period 					period;
721
      typedef chrono::time_point 	time_point;
722
 
723
      static_assert(system_clock::duration::min()
724
		    < system_clock::duration::zero(),
725
		    "a clock's minimum duration cannot be less than its epoch");
726
 
727
      static constexpr bool is_steady = false;
728
 
729
      static time_point
730
      now() noexcept;
731
 
732
      // Map to C API
733
      static std::time_t
734
      to_time_t(const time_point& __t) noexcept
735
      {
736
	return std::time_t(duration_cast
737
			   (__t.time_since_epoch()).count());
738
      }
739
 
740
      static time_point
741
      from_time_t(std::time_t __t) noexcept
742
      {
743
	typedef chrono::time_point	__from;
744
	return time_point_cast
745
	       (__from(chrono::seconds(__t)));
746
      }
747
    };
748
 
749
 
750
    /**
751
     *  @brief Monotonic clock
752
     *
753
     *  Time returned has the property of only increasing at a uniform rate.
754
    */
755
    struct steady_clock
756
    {
757
      typedef chrono::nanoseconds 				duration;
758
      typedef duration::rep	  				rep;
759
      typedef duration::period	  				period;
760
      typedef chrono::time_point 	time_point;
761
 
762
      static constexpr bool is_steady = true;
763
 
764
      static time_point
765
      now() noexcept;
766
    };
767
 
768
 
769
    /**
770
     *  @brief Highest-resolution clock
771
     *
772
     *  This is the clock "with the shortest tick period." Alias to
773
     *  std::system_clock until higher-than-nanosecond definitions
774
     *  become feasible.
775
    */
776
    using high_resolution_clock = system_clock;
777
 
778
    } // end inline namespace _V2
779
 
780
  _GLIBCXX_END_NAMESPACE_VERSION
781
  } // namespace chrono
782
 
783
#if __cplusplus > 201103L
784
 
785
#define __cpp_lib_chrono_udls 201304
786
 
787
  inline namespace literals
788
  {
789
  inline namespace chrono_literals
790
  {
791
 
792
    template
793
      struct _Checked_integral_constant
794
      : integral_constant<_Rep, static_cast<_Rep>(_Val)>
795
      {
796
	static_assert(_Checked_integral_constant::value >= 0
797
		      && _Checked_integral_constant::value == _Val,
798
		      "literal value cannot be represented by duration type");
799
      };
800
 
801
    template
802
      constexpr _Dur __check_overflow()
803
      {
804
	using _Val = __parse_int::_Parse_int<_Digits...>;
805
	using _Rep = typename _Dur::rep;
806
	// TODO: should be simply integral_constant<_Rep, _Val::value>
807
	// but GCC doesn't reject narrowing conversions to _Rep.
808
	using _CheckedVal = _Checked_integral_constant<_Rep, _Val::value>;
809
	return _Dur{_CheckedVal::value};
810
      }
811
 
812
    constexpr chrono::duration>
813
    operator""h(long double __hours)
814
    { return chrono::duration>{__hours}; }
815
 
816
    template 
817
      constexpr chrono::hours
818
      operator""h()
819
      { return __check_overflow(); }
820
 
821
    constexpr chrono::duration>
822
    operator""min(long double __mins)
823
    { return chrono::duration>{__mins}; }
824
 
825
    template 
826
      constexpr chrono::minutes
827
      operator""min()
828
      { return __check_overflow(); }
829
 
830
    constexpr chrono::duration
831
    operator""s(long double __secs)
832
    { return chrono::duration{__secs}; }
833
 
834
    template 
835
      constexpr chrono::seconds
836
      operator""s()
837
      { return __check_overflow(); }
838
 
839
    constexpr chrono::duration
840
    operator""ms(long double __msecs)
841
    { return chrono::duration{__msecs}; }
842
 
843
    template 
844
      constexpr chrono::milliseconds
845
      operator""ms()
846
      { return __check_overflow(); }
847
 
848
    constexpr chrono::duration
849
    operator""us(long double __usecs)
850
    { return chrono::duration{__usecs}; }
851
 
852
    template 
853
      constexpr chrono::microseconds
854
      operator""us()
855
      { return __check_overflow(); }
856
 
857
    constexpr chrono::duration
858
    operator""ns(long double __nsecs)
859
    { return chrono::duration{__nsecs}; }
860
 
861
    template 
862
      constexpr chrono::nanoseconds
863
      operator""ns()
864
      { return __check_overflow(); }
865
 
866
  } // inline namespace chrono_literals
867
  } // inline namespace literals
868
 
869
  namespace chrono
870
  {
871
  _GLIBCXX_BEGIN_NAMESPACE_VERSION
872
 
873
  using namespace literals::chrono_literals;
874
 
875
  _GLIBCXX_END_NAMESPACE_VERSION
876
  } // namespace chrono
877
 
878
#endif // __cplusplus > 201103L
879
 
880
  // @} group chrono
881
} // namespace std
882
 
883
#endif //_GLIBCXX_USE_C99_STDINT_TR1
884
 
885
#endif // C++11
886
 
887
#endif //_GLIBCXX_CHRONO