Home | History | Annotate | Download | only in include
      1 // -*- C++ -*-
      2 //===---------------------------- chrono ----------------------------------===//
      3 //
      4 //                     The LLVM Compiler Infrastructure
      5 //
      6 // This file is dual licensed under the MIT and the University of Illinois Open
      7 // Source Licenses. See LICENSE.TXT for details.
      8 //
      9 //===----------------------------------------------------------------------===//
     10 
     11 #ifndef _LIBCPP_CHRONO
     12 #define _LIBCPP_CHRONO
     13 
     14 /*
     15     chrono synopsis
     16 
     17 namespace std
     18 {
     19 namespace chrono
     20 {
     21 
     22 template <class ToDuration, class Rep, class Period>
     23 constexpr
     24 ToDuration
     25 duration_cast(const duration<Rep, Period>& fd);
     26 
     27 template <class Rep> struct treat_as_floating_point : is_floating_point<Rep> {};
     28 
     29 template <class Rep> inline constexpr bool treat_as_floating_point_v
     30     = treat_as_floating_point<Rep>::value;                       // C++17
     31 
     32 template <class Rep>
     33 struct duration_values
     34 {
     35 public:
     36     static constexpr Rep zero();
     37     static constexpr Rep max();
     38     static constexpr Rep min();
     39 };
     40 
     41 // duration
     42 
     43 template <class Rep, class Period = ratio<1>>
     44 class duration
     45 {
     46     static_assert(!__is_duration<Rep>::value, "A duration representation can not be a duration");
     47     static_assert(__is_ratio<Period>::value, "Second template parameter of duration must be a std::ratio");
     48     static_assert(Period::num > 0, "duration period must be positive");
     49 public:
     50     typedef Rep rep;
     51     typedef typename _Period::type period;
     52 
     53     constexpr duration() = default;
     54     template <class Rep2>
     55         constexpr explicit duration(const Rep2& r,
     56             typename enable_if
     57             <
     58                is_convertible<Rep2, rep>::value &&
     59                (treat_as_floating_point<rep>::value ||
     60                !treat_as_floating_point<rep>::value && !treat_as_floating_point<Rep2>::value)
     61             >::type* = 0);
     62 
     63     // conversions
     64     template <class Rep2, class Period2>
     65         constexpr duration(const duration<Rep2, Period2>& d,
     66             typename enable_if
     67             <
     68                 treat_as_floating_point<rep>::value ||
     69                 ratio_divide<Period2, period>::type::den == 1
     70             >::type* = 0);
     71 
     72     // observer
     73 
     74     constexpr rep count() const;
     75 
     76     // arithmetic
     77 
     78     constexpr common_type<duration>::type  operator+() const;
     79     constexpr common_type<duration>::type  operator-() const;
     80     constexpr duration& operator++();
     81     constexpr duration  operator++(int);
     82     constexpr duration& operator--();
     83     constexpr duration  operator--(int);
     84 
     85     constexpr duration& operator+=(const duration& d);
     86     constexpr duration& operator-=(const duration& d);
     87 
     88     duration& operator*=(const rep& rhs);
     89     duration& operator/=(const rep& rhs);
     90 
     91     // special values
     92 
     93     static constexpr duration zero();
     94     static constexpr duration min();
     95     static constexpr duration max();
     96 };
     97 
     98 typedef duration<long long,         nano> nanoseconds;
     99 typedef duration<long long,        micro> microseconds;
    100 typedef duration<long long,        milli> milliseconds;
    101 typedef duration<long long              > seconds;
    102 typedef duration<     long, ratio<  60> > minutes;
    103 typedef duration<     long, ratio<3600> > hours;
    104 
    105 template <class Clock, class Duration = typename Clock::duration>
    106 class time_point
    107 {
    108 public:
    109     typedef Clock                     clock;
    110     typedef Duration                  duration;
    111     typedef typename duration::rep    rep;
    112     typedef typename duration::period period;
    113 private:
    114     duration d_;  // exposition only
    115 
    116 public:
    117     time_point();  // has value "epoch" // constexpr in C++14
    118     explicit time_point(const duration& d);  // same as time_point() + d // constexpr in C++14
    119 
    120     // conversions
    121     template <class Duration2>
    122        time_point(const time_point<clock, Duration2>& t); // constexpr in C++14
    123 
    124     // observer
    125 
    126     duration time_since_epoch() const; // constexpr in C++14
    127 
    128     // arithmetic
    129 
    130     time_point& operator+=(const duration& d);
    131     time_point& operator-=(const duration& d);
    132 
    133     // special values
    134 
    135     static constexpr time_point min();
    136     static constexpr time_point max();
    137 };
    138 
    139 } // chrono
    140 
    141 // common_type traits
    142 template <class Rep1, class Period1, class Rep2, class Period2>
    143   struct common_type<chrono::duration<Rep1, Period1>, chrono::duration<Rep2, Period2>>;
    144 
    145 template <class Clock, class Duration1, class Duration2>
    146   struct common_type<chrono::time_point<Clock, Duration1>, chrono::time_point<Clock, Duration2>>;
    147 
    148 namespace chrono {
    149 
    150 // duration arithmetic
    151 template <class Rep1, class Period1, class Rep2, class Period2>
    152   constexpr
    153   typename common_type<duration<Rep1, Period1>, duration<Rep2, Period2>>::type
    154   operator+(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
    155 template <class Rep1, class Period1, class Rep2, class Period2>
    156   constexpr
    157   typename common_type<duration<Rep1, Period1>, duration<Rep2, Period2>>::type
    158   operator-(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
    159 template <class Rep1, class Period, class Rep2>
    160   constexpr
    161   duration<typename common_type<Rep1, Rep2>::type, Period>
    162   operator*(const duration<Rep1, Period>& d, const Rep2& s);
    163 template <class Rep1, class Period, class Rep2>
    164   constexpr
    165   duration<typename common_type<Rep1, Rep2>::type, Period>
    166   operator*(const Rep1& s, const duration<Rep2, Period>& d);
    167 template <class Rep1, class Period, class Rep2>
    168   constexpr
    169   duration<typename common_type<Rep1, Rep2>::type, Period>
    170   operator/(const duration<Rep1, Period>& d, const Rep2& s);
    171 template <class Rep1, class Period1, class Rep2, class Period2>
    172   constexpr
    173   typename common_type<Rep1, Rep2>::type
    174   operator/(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
    175 
    176 // duration comparisons
    177 template <class Rep1, class Period1, class Rep2, class Period2>
    178    constexpr
    179    bool operator==(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
    180 template <class Rep1, class Period1, class Rep2, class Period2>
    181    constexpr
    182    bool operator!=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
    183 template <class Rep1, class Period1, class Rep2, class Period2>
    184    constexpr
    185    bool operator< (const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
    186 template <class Rep1, class Period1, class Rep2, class Period2>
    187    constexpr
    188    bool operator<=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
    189 template <class Rep1, class Period1, class Rep2, class Period2>
    190    constexpr
    191    bool operator> (const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
    192 template <class Rep1, class Period1, class Rep2, class Period2>
    193    constexpr
    194    bool operator>=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
    195 
    196 // duration_cast
    197 template <class ToDuration, class Rep, class Period>
    198   ToDuration duration_cast(const duration<Rep, Period>& d);
    199 
    200 template <class ToDuration, class Rep, class Period>
    201     constexpr ToDuration floor(const duration<Rep, Period>& d);    // C++17
    202 template <class ToDuration, class Rep, class Period>
    203     constexpr ToDuration ceil(const duration<Rep, Period>& d);     // C++17
    204 template <class ToDuration, class Rep, class Period>
    205     constexpr ToDuration round(const duration<Rep, Period>& d);    // C++17
    206 
    207 // time_point arithmetic (all constexpr in C++14)
    208 template <class Clock, class Duration1, class Rep2, class Period2>
    209   time_point<Clock, typename common_type<Duration1, duration<Rep2, Period2>>::type>
    210   operator+(const time_point<Clock, Duration1>& lhs, const duration<Rep2, Period2>& rhs);
    211 template <class Rep1, class Period1, class Clock, class Duration2>
    212   time_point<Clock, typename common_type<duration<Rep1, Period1>, Duration2>::type>
    213   operator+(const duration<Rep1, Period1>& lhs, const time_point<Clock, Duration2>& rhs);
    214 template <class Clock, class Duration1, class Rep2, class Period2>
    215   time_point<Clock, typename common_type<Duration1, duration<Rep2, Period2>>::type>
    216   operator-(const time_point<Clock, Duration1>& lhs, const duration<Rep2, Period2>& rhs);
    217 template <class Clock, class Duration1, class Duration2>
    218   typename common_type<Duration1, Duration2>::type
    219   operator-(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
    220 
    221 // time_point comparisons (all constexpr in C++14)
    222 template <class Clock, class Duration1, class Duration2>
    223    bool operator==(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
    224 template <class Clock, class Duration1, class Duration2>
    225    bool operator!=(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
    226 template <class Clock, class Duration1, class Duration2>
    227    bool operator< (const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
    228 template <class Clock, class Duration1, class Duration2>
    229    bool operator<=(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
    230 template <class Clock, class Duration1, class Duration2>
    231    bool operator> (const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
    232 template <class Clock, class Duration1, class Duration2>
    233    bool operator>=(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
    234 
    235 // time_point_cast (constexpr in C++14)
    236 
    237 template <class ToDuration, class Clock, class Duration>
    238   time_point<Clock, ToDuration> time_point_cast(const time_point<Clock, Duration>& t);
    239 
    240 template <class ToDuration, class Clock, class Duration>
    241     constexpr time_point<Clock, ToDuration>
    242     floor(const time_point<Clock, Duration>& tp);                  // C++17
    243 
    244 template <class ToDuration, class Clock, class Duration>
    245     constexpr time_point<Clock, ToDuration>
    246     ceil(const time_point<Clock, Duration>& tp);                   // C++17
    247 
    248 template <class ToDuration, class Clock, class Duration>
    249     constexpr time_point<Clock, ToDuration>
    250     round(const time_point<Clock, Duration>& tp);                  // C++17
    251 
    252 template <class Rep, class Period>
    253     constexpr duration<Rep, Period> abs(duration<Rep, Period> d);  // C++17
    254 // Clocks
    255 
    256 class system_clock
    257 {
    258 public:
    259     typedef microseconds                     duration;
    260     typedef duration::rep                    rep;
    261     typedef duration::period                 period;
    262     typedef chrono::time_point<system_clock> time_point;
    263     static const bool is_steady =            false; // constexpr in C++14
    264 
    265     static time_point now() noexcept;
    266     static time_t     to_time_t  (const time_point& __t) noexcept;
    267     static time_point from_time_t(time_t __t) noexcept;
    268 };
    269 
    270 class steady_clock
    271 {
    272 public:
    273     typedef nanoseconds                                   duration;
    274     typedef duration::rep                                 rep;
    275     typedef duration::period                              period;
    276     typedef chrono::time_point<steady_clock, duration>    time_point;
    277     static const bool is_steady =                         true; // constexpr in C++14
    278 
    279     static time_point now() noexcept;
    280 };
    281 
    282 typedef steady_clock high_resolution_clock;
    283 
    284 }  // chrono
    285 
    286 constexpr chrono::hours                                 operator ""h(unsigned long long); // C++14
    287 constexpr chrono::duration<unspecified , ratio<3600,1>> operator ""h(long double); // C++14
    288 constexpr chrono::minutes                               operator ""min(unsigned long long); // C++14
    289 constexpr chrono::duration<unspecified , ratio<60,1>>   operator ""min(long double); // C++14
    290 constexpr chrono::seconds                               operator ""s(unsigned long long); // C++14
    291 constexpr chrono::duration<unspecified >                operator ""s(long double); // C++14
    292 constexpr chrono::milliseconds                          operator ""ms(unsigned long long); // C++14
    293 constexpr chrono::duration<unspecified , milli>         operator ""ms(long double); // C++14
    294 constexpr chrono::microseconds                          operator ""us(unsigned long long); // C++14
    295 constexpr chrono::duration<unspecified , micro>         operator ""us(long double); // C++14
    296 constexpr chrono::nanoseconds                           operator ""ns(unsigned long long); // C++14
    297 constexpr chrono::duration<unspecified , nano>          operator ""ns(long double); // C++14
    298 
    299 }  // std
    300 */
    301 
    302 #include <__config>
    303 #include <ctime>
    304 #include <type_traits>
    305 #include <ratio>
    306 #include <limits>
    307 
    308 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
    309 #pragma GCC system_header
    310 #endif
    311 
    312 _LIBCPP_PUSH_MACROS
    313 #include <__undef_macros>
    314 
    315 
    316 _LIBCPP_BEGIN_NAMESPACE_STD
    317 
    318 namespace chrono
    319 {
    320 
    321 template <class _Rep, class _Period = ratio<1> > class _LIBCPP_TEMPLATE_VIS duration;
    322 
    323 template <class _Tp>
    324 struct __is_duration : false_type {};
    325 
    326 template <class _Rep, class _Period>
    327 struct __is_duration<duration<_Rep, _Period> > : true_type  {};
    328 
    329 template <class _Rep, class _Period>
    330 struct __is_duration<const duration<_Rep, _Period> > : true_type  {};
    331 
    332 template <class _Rep, class _Period>
    333 struct __is_duration<volatile duration<_Rep, _Period> > : true_type  {};
    334 
    335 template <class _Rep, class _Period>
    336 struct __is_duration<const volatile duration<_Rep, _Period> > : true_type  {};
    337 
    338 } // chrono
    339 
    340 template <class _Rep1, class _Period1, class _Rep2, class _Period2>
    341 struct _LIBCPP_TEMPLATE_VIS common_type<chrono::duration<_Rep1, _Period1>,
    342                                          chrono::duration<_Rep2, _Period2> >
    343 {
    344     typedef chrono::duration<typename common_type<_Rep1, _Rep2>::type,
    345                              typename __ratio_gcd<_Period1, _Period2>::type> type;
    346 };
    347 
    348 namespace chrono {
    349 
    350 // duration_cast
    351 
    352 template <class _FromDuration, class _ToDuration,
    353           class _Period = typename ratio_divide<typename _FromDuration::period, typename _ToDuration::period>::type,
    354           bool = _Period::num == 1,
    355           bool = _Period::den == 1>
    356 struct __duration_cast;
    357 
    358 template <class _FromDuration, class _ToDuration, class _Period>
    359 struct __duration_cast<_FromDuration, _ToDuration, _Period, true, true>
    360 {
    361     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
    362     _ToDuration operator()(const _FromDuration& __fd) const
    363     {
    364         return _ToDuration(static_cast<typename _ToDuration::rep>(__fd.count()));
    365     }
    366 };
    367 
    368 template <class _FromDuration, class _ToDuration, class _Period>
    369 struct __duration_cast<_FromDuration, _ToDuration, _Period, true, false>
    370 {
    371     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
    372     _ToDuration operator()(const _FromDuration& __fd) const
    373     {
    374         typedef typename common_type<typename _ToDuration::rep, typename _FromDuration::rep, intmax_t>::type _Ct;
    375         return _ToDuration(static_cast<typename _ToDuration::rep>(
    376                            static_cast<_Ct>(__fd.count()) / static_cast<_Ct>(_Period::den)));
    377     }
    378 };
    379 
    380 template <class _FromDuration, class _ToDuration, class _Period>
    381 struct __duration_cast<_FromDuration, _ToDuration, _Period, false, true>
    382 {
    383     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
    384     _ToDuration operator()(const _FromDuration& __fd) const
    385     {
    386         typedef typename common_type<typename _ToDuration::rep, typename _FromDuration::rep, intmax_t>::type _Ct;
    387         return _ToDuration(static_cast<typename _ToDuration::rep>(
    388                            static_cast<_Ct>(__fd.count()) * static_cast<_Ct>(_Period::num)));
    389     }
    390 };
    391 
    392 template <class _FromDuration, class _ToDuration, class _Period>
    393 struct __duration_cast<_FromDuration, _ToDuration, _Period, false, false>
    394 {
    395     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
    396     _ToDuration operator()(const _FromDuration& __fd) const
    397     {
    398         typedef typename common_type<typename _ToDuration::rep, typename _FromDuration::rep, intmax_t>::type _Ct;
    399         return _ToDuration(static_cast<typename _ToDuration::rep>(
    400                            static_cast<_Ct>(__fd.count()) * static_cast<_Ct>(_Period::num)
    401                                                           / static_cast<_Ct>(_Period::den)));
    402     }
    403 };
    404 
    405 template <class _ToDuration, class _Rep, class _Period>
    406 inline _LIBCPP_INLINE_VISIBILITY
    407 _LIBCPP_CONSTEXPR
    408 typename enable_if
    409 <
    410     __is_duration<_ToDuration>::value,
    411     _ToDuration
    412 >::type
    413 duration_cast(const duration<_Rep, _Period>& __fd)
    414 {
    415     return __duration_cast<duration<_Rep, _Period>, _ToDuration>()(__fd);
    416 }
    417 
    418 template <class _Rep>
    419 struct _LIBCPP_TEMPLATE_VIS treat_as_floating_point : is_floating_point<_Rep> {};
    420 
    421 #if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
    422 template <class _Rep>
    423 _LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool treat_as_floating_point_v
    424     = treat_as_floating_point<_Rep>::value;
    425 #endif
    426 
    427 template <class _Rep>
    428 struct _LIBCPP_TEMPLATE_VIS duration_values
    429 {
    430 public:
    431     _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR _Rep zero() {return _Rep(0);}
    432     _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR _Rep max()  {return numeric_limits<_Rep>::max();}
    433     _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR _Rep min()  {return numeric_limits<_Rep>::lowest();}
    434 };
    435 
    436 #if _LIBCPP_STD_VER > 14
    437 template <class _ToDuration, class _Rep, class _Period>
    438 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
    439 typename enable_if
    440 <
    441     __is_duration<_ToDuration>::value,
    442     _ToDuration
    443 >::type
    444 floor(const duration<_Rep, _Period>& __d)
    445 {
    446     _ToDuration __t = duration_cast<_ToDuration>(__d);
    447     if (__t > __d)
    448         __t = __t - _ToDuration{1};
    449     return __t;
    450 }
    451 
    452 template <class _ToDuration, class _Rep, class _Period>
    453 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
    454 typename enable_if
    455 <
    456     __is_duration<_ToDuration>::value,
    457     _ToDuration
    458 >::type
    459 ceil(const duration<_Rep, _Period>& __d)
    460 {
    461     _ToDuration __t = duration_cast<_ToDuration>(__d);
    462     if (__t < __d)
    463         __t = __t + _ToDuration{1};
    464     return __t;
    465 }
    466 
    467 template <class _ToDuration, class _Rep, class _Period>
    468 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
    469 typename enable_if
    470 <
    471     __is_duration<_ToDuration>::value,
    472     _ToDuration
    473 >::type
    474 round(const duration<_Rep, _Period>& __d)
    475 {
    476     _ToDuration __lower = floor<_ToDuration>(__d);
    477     _ToDuration __upper = __lower + _ToDuration{1};
    478     auto __lowerDiff = __d - __lower;
    479     auto __upperDiff = __upper - __d;
    480     if (__lowerDiff < __upperDiff)
    481         return __lower;
    482     if (__lowerDiff > __upperDiff)
    483         return __upper;
    484     return __lower.count() & 1 ? __upper : __lower;
    485 }
    486 #endif
    487 
    488 // duration
    489 
    490 template <class _Rep, class _Period>
    491 class _LIBCPP_TEMPLATE_VIS duration
    492 {
    493     static_assert(!__is_duration<_Rep>::value, "A duration representation can not be a duration");
    494     static_assert(__is_ratio<_Period>::value, "Second template parameter of duration must be a std::ratio");
    495     static_assert(_Period::num > 0, "duration period must be positive");
    496 
    497     template <class _R1, class _R2>
    498     struct __no_overflow
    499     {
    500     private:
    501         static const intmax_t __gcd_n1_n2 = __static_gcd<_R1::num, _R2::num>::value;
    502         static const intmax_t __gcd_d1_d2 = __static_gcd<_R1::den, _R2::den>::value;
    503         static const intmax_t __n1 = _R1::num / __gcd_n1_n2;
    504         static const intmax_t __d1 = _R1::den / __gcd_d1_d2;
    505         static const intmax_t __n2 = _R2::num / __gcd_n1_n2;
    506         static const intmax_t __d2 = _R2::den / __gcd_d1_d2;
    507         static const intmax_t max = -((intmax_t(1) << (sizeof(intmax_t) * CHAR_BIT - 1)) + 1);
    508 
    509         template <intmax_t _Xp, intmax_t _Yp, bool __overflow>
    510         struct __mul    // __overflow == false
    511         {
    512             static const intmax_t value = _Xp * _Yp;
    513         };
    514 
    515         template <intmax_t _Xp, intmax_t _Yp>
    516         struct __mul<_Xp, _Yp, true>
    517         {
    518             static const intmax_t value = 1;
    519         };
    520 
    521     public:
    522         static const bool value = (__n1 <= max / __d2) && (__n2 <= max / __d1);
    523         typedef ratio<__mul<__n1, __d2, !value>::value,
    524                       __mul<__n2, __d1, !value>::value> type;
    525     };
    526     
    527 public:
    528     typedef _Rep rep;
    529     typedef typename _Period::type period;
    530 private:
    531     rep __rep_;
    532 public:
    533 
    534     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
    535 #ifndef _LIBCPP_CXX03_LANG
    536         duration() = default;
    537 #else
    538         duration() {}
    539 #endif
    540 
    541     template <class _Rep2>
    542         _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
    543         explicit duration(const _Rep2& __r,
    544             typename enable_if
    545             <
    546                is_convertible<_Rep2, rep>::value &&
    547                (treat_as_floating_point<rep>::value ||
    548                !treat_as_floating_point<_Rep2>::value)
    549             >::type* = 0)
    550                 : __rep_(__r) {}
    551 
    552     // conversions
    553     template <class _Rep2, class _Period2>
    554         _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
    555         duration(const duration<_Rep2, _Period2>& __d,
    556             typename enable_if
    557             <
    558                 __no_overflow<_Period2, period>::value && (
    559                 treat_as_floating_point<rep>::value ||
    560                 (__no_overflow<_Period2, period>::type::den == 1 &&
    561                  !treat_as_floating_point<_Rep2>::value))
    562             >::type* = 0)
    563                 : __rep_(_VSTD::chrono::duration_cast<duration>(__d).count()) {}
    564 
    565     // observer
    566 
    567     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR rep count() const {return __rep_;}
    568 
    569     // arithmetic
    570 
    571     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR typename common_type<duration>::type operator+() const {return typename common_type<duration>::type(*this);}
    572     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR typename common_type<duration>::type operator-() const {return typename common_type<duration>::type(-__rep_);}
    573     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator++()      {++__rep_; return *this;}
    574     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration  operator++(int)   {return duration(__rep_++);}
    575     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator--()      {--__rep_; return *this;}
    576     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration  operator--(int)   {return duration(__rep_--);}
    577 
    578     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator+=(const duration& __d) {__rep_ += __d.count(); return *this;}
    579     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator-=(const duration& __d) {__rep_ -= __d.count(); return *this;}
    580 
    581     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator*=(const rep& rhs) {__rep_ *= rhs; return *this;}
    582     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator/=(const rep& rhs) {__rep_ /= rhs; return *this;}
    583     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator%=(const rep& rhs) {__rep_ %= rhs; return *this;}
    584     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator%=(const duration& rhs) {__rep_ %= rhs.count(); return *this;}
    585 
    586     // special values
    587 
    588     _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR duration zero() {return duration(duration_values<rep>::zero());}
    589     _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR duration min()  {return duration(duration_values<rep>::min());}
    590     _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR duration max()  {return duration(duration_values<rep>::max());}
    591 };
    592 
    593 typedef duration<long long,         nano> nanoseconds;
    594 typedef duration<long long,        micro> microseconds;
    595 typedef duration<long long,        milli> milliseconds;
    596 typedef duration<long long              > seconds;
    597 typedef duration<     long, ratio<  60> > minutes;
    598 typedef duration<     long, ratio<3600> > hours;
    599 
    600 // Duration ==
    601 
    602 template <class _LhsDuration, class _RhsDuration>
    603 struct __duration_eq
    604 {
    605     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
    606     bool operator()(const _LhsDuration& __lhs, const _RhsDuration& __rhs) const
    607         {
    608             typedef typename common_type<_LhsDuration, _RhsDuration>::type _Ct;
    609             return _Ct(__lhs).count() == _Ct(__rhs).count();
    610         }
    611 };
    612 
    613 template <class _LhsDuration>
    614 struct __duration_eq<_LhsDuration, _LhsDuration>
    615 {
    616     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
    617     bool operator()(const _LhsDuration& __lhs, const _LhsDuration& __rhs) const
    618         {return __lhs.count() == __rhs.count();}
    619 };
    620 
    621 template <class _Rep1, class _Period1, class _Rep2, class _Period2>
    622 inline _LIBCPP_INLINE_VISIBILITY
    623 _LIBCPP_CONSTEXPR
    624 bool
    625 operator==(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
    626 {
    627     return __duration_eq<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >()(__lhs, __rhs);
    628 }
    629 
    630 // Duration !=
    631 
    632 template <class _Rep1, class _Period1, class _Rep2, class _Period2>
    633 inline _LIBCPP_INLINE_VISIBILITY
    634 _LIBCPP_CONSTEXPR
    635 bool
    636 operator!=(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
    637 {
    638     return !(__lhs == __rhs);
    639 }
    640 
    641 // Duration <
    642 
    643 template <class _LhsDuration, class _RhsDuration>
    644 struct __duration_lt
    645 {
    646     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
    647     bool operator()(const _LhsDuration& __lhs, const _RhsDuration& __rhs) const
    648         {
    649             typedef typename common_type<_LhsDuration, _RhsDuration>::type _Ct;
    650             return _Ct(__lhs).count() < _Ct(__rhs).count();
    651         }
    652 };
    653 
    654 template <class _LhsDuration>
    655 struct __duration_lt<_LhsDuration, _LhsDuration>
    656 {
    657     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
    658     bool operator()(const _LhsDuration& __lhs, const _LhsDuration& __rhs) const
    659         {return __lhs.count() < __rhs.count();}
    660 };
    661 
    662 template <class _Rep1, class _Period1, class _Rep2, class _Period2>
    663 inline _LIBCPP_INLINE_VISIBILITY
    664 _LIBCPP_CONSTEXPR
    665 bool
    666 operator< (const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
    667 {
    668     return __duration_lt<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >()(__lhs, __rhs);
    669 }
    670 
    671 // Duration >
    672 
    673 template <class _Rep1, class _Period1, class _Rep2, class _Period2>
    674 inline _LIBCPP_INLINE_VISIBILITY
    675 _LIBCPP_CONSTEXPR
    676 bool
    677 operator> (const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
    678 {
    679     return __rhs < __lhs;
    680 }
    681 
    682 // Duration <=
    683 
    684 template <class _Rep1, class _Period1, class _Rep2, class _Period2>
    685 inline _LIBCPP_INLINE_VISIBILITY
    686 _LIBCPP_CONSTEXPR
    687 bool
    688 operator<=(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
    689 {
    690     return !(__rhs < __lhs);
    691 }
    692 
    693 // Duration >=
    694 
    695 template <class _Rep1, class _Period1, class _Rep2, class _Period2>
    696 inline _LIBCPP_INLINE_VISIBILITY
    697 _LIBCPP_CONSTEXPR
    698 bool
    699 operator>=(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
    700 {
    701     return !(__lhs < __rhs);
    702 }
    703 
    704 // Duration +
    705 
    706 template <class _Rep1, class _Period1, class _Rep2, class _Period2>
    707 inline _LIBCPP_INLINE_VISIBILITY
    708 _LIBCPP_CONSTEXPR
    709 typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type
    710 operator+(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
    711 {
    712     typedef typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type _Cd;
    713     return _Cd(_Cd(__lhs).count() + _Cd(__rhs).count());
    714 }
    715 
    716 // Duration -
    717 
    718 template <class _Rep1, class _Period1, class _Rep2, class _Period2>
    719 inline _LIBCPP_INLINE_VISIBILITY
    720 _LIBCPP_CONSTEXPR
    721 typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type
    722 operator-(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
    723 {
    724     typedef typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type _Cd;
    725     return _Cd(_Cd(__lhs).count() - _Cd(__rhs).count());
    726 }
    727 
    728 // Duration *
    729 
    730 template <class _Rep1, class _Period, class _Rep2>
    731 inline _LIBCPP_INLINE_VISIBILITY
    732 _LIBCPP_CONSTEXPR
    733 typename enable_if
    734 <
    735     is_convertible<_Rep2, typename common_type<_Rep1, _Rep2>::type>::value,
    736     duration<typename common_type<_Rep1, _Rep2>::type, _Period>
    737 >::type
    738 operator*(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
    739 {
    740     typedef typename common_type<_Rep1, _Rep2>::type _Cr;
    741     typedef duration<_Cr, _Period> _Cd;
    742     return _Cd(_Cd(__d).count() * static_cast<_Cr>(__s));
    743 }
    744 
    745 template <class _Rep1, class _Period, class _Rep2>
    746 inline _LIBCPP_INLINE_VISIBILITY
    747 _LIBCPP_CONSTEXPR
    748 typename enable_if
    749 <
    750     is_convertible<_Rep1, typename common_type<_Rep1, _Rep2>::type>::value,
    751     duration<typename common_type<_Rep1, _Rep2>::type, _Period>
    752 >::type
    753 operator*(const _Rep1& __s, const duration<_Rep2, _Period>& __d)
    754 {
    755     return __d * __s;
    756 }
    757 
    758 // Duration /
    759 
    760 template <class _Duration, class _Rep, bool = __is_duration<_Rep>::value>
    761 struct __duration_divide_result
    762 {
    763 };
    764 
    765 template <class _Duration, class _Rep2,
    766     bool = is_convertible<_Rep2,
    767                           typename common_type<typename _Duration::rep, _Rep2>::type>::value>
    768 struct __duration_divide_imp
    769 {
    770 };
    771 
    772 template <class _Rep1, class _Period, class _Rep2>
    773 struct __duration_divide_imp<duration<_Rep1, _Period>, _Rep2, true>
    774 {
    775     typedef duration<typename common_type<_Rep1, _Rep2>::type, _Period> type;
    776 };
    777 
    778 template <class _Rep1, class _Period, class _Rep2>
    779 struct __duration_divide_result<duration<_Rep1, _Period>, _Rep2, false>
    780     : __duration_divide_imp<duration<_Rep1, _Period>, _Rep2>
    781 {
    782 };
    783 
    784 template <class _Rep1, class _Period, class _Rep2>
    785 inline _LIBCPP_INLINE_VISIBILITY
    786 _LIBCPP_CONSTEXPR
    787 typename __duration_divide_result<duration<_Rep1, _Period>, _Rep2>::type
    788 operator/(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
    789 {
    790     typedef typename common_type<_Rep1, _Rep2>::type _Cr;
    791     typedef duration<_Cr, _Period> _Cd;
    792     return _Cd(_Cd(__d).count() / static_cast<_Cr>(__s));
    793 }
    794 
    795 template <class _Rep1, class _Period1, class _Rep2, class _Period2>
    796 inline _LIBCPP_INLINE_VISIBILITY
    797 _LIBCPP_CONSTEXPR
    798 typename common_type<_Rep1, _Rep2>::type
    799 operator/(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
    800 {
    801     typedef typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type _Ct;
    802     return _Ct(__lhs).count() / _Ct(__rhs).count();
    803 }
    804 
    805 // Duration %
    806 
    807 template <class _Rep1, class _Period, class _Rep2>
    808 inline _LIBCPP_INLINE_VISIBILITY
    809 _LIBCPP_CONSTEXPR
    810 typename __duration_divide_result<duration<_Rep1, _Period>, _Rep2>::type
    811 operator%(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
    812 {
    813     typedef typename common_type<_Rep1, _Rep2>::type _Cr;
    814     typedef duration<_Cr, _Period> _Cd;
    815     return _Cd(_Cd(__d).count() % static_cast<_Cr>(__s));
    816 }
    817 
    818 template <class _Rep1, class _Period1, class _Rep2, class _Period2>
    819 inline _LIBCPP_INLINE_VISIBILITY
    820 _LIBCPP_CONSTEXPR
    821 typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type
    822 operator%(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
    823 {
    824     typedef typename common_type<_Rep1, _Rep2>::type _Cr;
    825     typedef typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type _Cd;
    826     return _Cd(static_cast<_Cr>(_Cd(__lhs).count()) % static_cast<_Cr>(_Cd(__rhs).count()));
    827 }
    828 
    829 //////////////////////////////////////////////////////////
    830 ///////////////////// time_point /////////////////////////
    831 //////////////////////////////////////////////////////////
    832 
    833 template <class _Clock, class _Duration = typename _Clock::duration>
    834 class _LIBCPP_TEMPLATE_VIS time_point
    835 {
    836     static_assert(__is_duration<_Duration>::value,
    837                   "Second template parameter of time_point must be a std::chrono::duration");
    838 public:
    839     typedef _Clock                    clock;
    840     typedef _Duration                 duration;
    841     typedef typename duration::rep    rep;
    842     typedef typename duration::period period;
    843 private:
    844     duration __d_;
    845 
    846 public:
    847     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 time_point() : __d_(duration::zero()) {}
    848     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 explicit time_point(const duration& __d) : __d_(__d) {}
    849 
    850     // conversions
    851     template <class _Duration2>
    852     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
    853     time_point(const time_point<clock, _Duration2>& t,
    854         typename enable_if
    855         <
    856             is_convertible<_Duration2, duration>::value
    857         >::type* = 0)
    858             : __d_(t.time_since_epoch()) {}
    859 
    860     // observer
    861 
    862     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 duration time_since_epoch() const {return __d_;}
    863 
    864     // arithmetic
    865 
    866     _LIBCPP_INLINE_VISIBILITY time_point& operator+=(const duration& __d) {__d_ += __d; return *this;}
    867     _LIBCPP_INLINE_VISIBILITY time_point& operator-=(const duration& __d) {__d_ -= __d; return *this;}
    868 
    869     // special values
    870 
    871     _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR time_point min() {return time_point(duration::min());}
    872     _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR time_point max() {return time_point(duration::max());}
    873 };
    874 
    875 } // chrono
    876 
    877 template <class _Clock, class _Duration1, class _Duration2>
    878 struct _LIBCPP_TEMPLATE_VIS common_type<chrono::time_point<_Clock, _Duration1>,
    879                                          chrono::time_point<_Clock, _Duration2> >
    880 {
    881     typedef chrono::time_point<_Clock, typename common_type<_Duration1, _Duration2>::type> type;
    882 };
    883 
    884 namespace chrono {
    885 
    886 template <class _ToDuration, class _Clock, class _Duration>
    887 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
    888 time_point<_Clock, _ToDuration>
    889 time_point_cast(const time_point<_Clock, _Duration>& __t)
    890 {
    891     return time_point<_Clock, _ToDuration>(_VSTD::chrono::duration_cast<_ToDuration>(__t.time_since_epoch()));
    892 }
    893 
    894 #if _LIBCPP_STD_VER > 14
    895 template <class _ToDuration, class _Clock, class _Duration>
    896 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
    897 typename enable_if
    898 <
    899     __is_duration<_ToDuration>::value,
    900     time_point<_Clock, _ToDuration>
    901 >::type
    902 floor(const time_point<_Clock, _Duration>& __t)
    903 {
    904     return time_point<_Clock, _ToDuration>{floor<_ToDuration>(__t.time_since_epoch())};
    905 }
    906 
    907 template <class _ToDuration, class _Clock, class _Duration>
    908 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
    909 typename enable_if
    910 <
    911     __is_duration<_ToDuration>::value,
    912     time_point<_Clock, _ToDuration>
    913 >::type
    914 ceil(const time_point<_Clock, _Duration>& __t)
    915 {
    916     return time_point<_Clock, _ToDuration>{ceil<_ToDuration>(__t.time_since_epoch())};
    917 }
    918 
    919 template <class _ToDuration, class _Clock, class _Duration>
    920 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
    921 typename enable_if
    922 <
    923     __is_duration<_ToDuration>::value,
    924     time_point<_Clock, _ToDuration>
    925 >::type
    926 round(const time_point<_Clock, _Duration>& __t)
    927 {
    928     return time_point<_Clock, _ToDuration>{round<_ToDuration>(__t.time_since_epoch())};
    929 }
    930 
    931 template <class _Rep, class _Period>
    932 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
    933 typename enable_if
    934 <
    935     numeric_limits<_Rep>::is_signed,
    936     duration<_Rep, _Period>
    937 >::type
    938 abs(duration<_Rep, _Period> __d)
    939 {
    940     return __d >= __d.zero() ? __d : -__d;
    941 }
    942 #endif
    943 
    944 // time_point ==
    945 
    946 template <class _Clock, class _Duration1, class _Duration2>
    947 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
    948 bool
    949 operator==(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
    950 {
    951     return __lhs.time_since_epoch() == __rhs.time_since_epoch();
    952 }
    953 
    954 // time_point !=
    955 
    956 template <class _Clock, class _Duration1, class _Duration2>
    957 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
    958 bool
    959 operator!=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
    960 {
    961     return !(__lhs == __rhs);
    962 }
    963 
    964 // time_point <
    965 
    966 template <class _Clock, class _Duration1, class _Duration2>
    967 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
    968 bool
    969 operator<(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
    970 {
    971     return __lhs.time_since_epoch() < __rhs.time_since_epoch();
    972 }
    973 
    974 // time_point >
    975 
    976 template <class _Clock, class _Duration1, class _Duration2>
    977 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
    978 bool
    979 operator>(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
    980 {
    981     return __rhs < __lhs;
    982 }
    983 
    984 // time_point <=
    985 
    986 template <class _Clock, class _Duration1, class _Duration2>
    987 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
    988 bool
    989 operator<=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
    990 {
    991     return !(__rhs < __lhs);
    992 }
    993 
    994 // time_point >=
    995 
    996 template <class _Clock, class _Duration1, class _Duration2>
    997 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
    998 bool
    999 operator>=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
   1000 {
   1001     return !(__lhs < __rhs);
   1002 }
   1003 
   1004 // time_point operator+(time_point x, duration y);
   1005 
   1006 template <class _Clock, class _Duration1, class _Rep2, class _Period2>
   1007 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
   1008 time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type>
   1009 operator+(const time_point<_Clock, _Duration1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
   1010 {
   1011     typedef time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type> _Tr;
   1012     return _Tr (__lhs.time_since_epoch() + __rhs);
   1013 }
   1014 
   1015 // time_point operator+(duration x, time_point y);
   1016 
   1017 template <class _Rep1, class _Period1, class _Clock, class _Duration2>
   1018 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
   1019 time_point<_Clock, typename common_type<duration<_Rep1, _Period1>, _Duration2>::type>
   1020 operator+(const duration<_Rep1, _Period1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
   1021 {
   1022     return __rhs + __lhs;
   1023 }
   1024 
   1025 // time_point operator-(time_point x, duration y);
   1026 
   1027 template <class _Clock, class _Duration1, class _Rep2, class _Period2>
   1028 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
   1029 time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type>
   1030 operator-(const time_point<_Clock, _Duration1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
   1031 {
   1032     typedef time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type> _Ret;
   1033     return _Ret(__lhs.time_since_epoch() -__rhs);
   1034 }
   1035 
   1036 // duration operator-(time_point x, time_point y);
   1037 
   1038 template <class _Clock, class _Duration1, class _Duration2>
   1039 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
   1040 typename common_type<_Duration1, _Duration2>::type
   1041 operator-(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
   1042 {
   1043     return __lhs.time_since_epoch() - __rhs.time_since_epoch();
   1044 }
   1045 
   1046 //////////////////////////////////////////////////////////
   1047 /////////////////////// clocks ///////////////////////////
   1048 //////////////////////////////////////////////////////////
   1049 
   1050 class _LIBCPP_TYPE_VIS system_clock
   1051 {
   1052 public:
   1053     typedef microseconds                     duration;
   1054     typedef duration::rep                    rep;
   1055     typedef duration::period                 period;
   1056     typedef chrono::time_point<system_clock> time_point;
   1057     static _LIBCPP_CONSTEXPR_AFTER_CXX11 const bool is_steady = false;
   1058 
   1059     static time_point now() _NOEXCEPT;
   1060     static time_t     to_time_t  (const time_point& __t) _NOEXCEPT;
   1061     static time_point from_time_t(time_t __t) _NOEXCEPT;
   1062 };
   1063 
   1064 #ifndef _LIBCPP_HAS_NO_MONOTONIC_CLOCK
   1065 class _LIBCPP_TYPE_VIS steady_clock
   1066 {
   1067 public:
   1068     typedef nanoseconds                                   duration;
   1069     typedef duration::rep                                 rep;
   1070     typedef duration::period                              period;
   1071     typedef chrono::time_point<steady_clock, duration>    time_point;
   1072     static _LIBCPP_CONSTEXPR_AFTER_CXX11 const bool is_steady = true;
   1073 
   1074     static time_point now() _NOEXCEPT;
   1075 };
   1076 
   1077 typedef steady_clock high_resolution_clock;
   1078 #else
   1079 typedef system_clock high_resolution_clock;
   1080 #endif
   1081 
   1082 } // chrono
   1083 
   1084 #if _LIBCPP_STD_VER > 11
   1085 // Suffixes for duration literals [time.duration.literals]
   1086 inline namespace literals
   1087 { 
   1088   inline namespace chrono_literals
   1089   {
   1090 
   1091     constexpr chrono::hours operator""h(unsigned long long __h)
   1092     {
   1093         return chrono::hours(static_cast<chrono::hours::rep>(__h));
   1094     }
   1095 
   1096     constexpr chrono::duration<long double, ratio<3600,1>> operator""h(long double __h)
   1097     {
   1098         return chrono::duration<long double, ratio<3600,1>>(__h);
   1099     }
   1100 
   1101 
   1102     constexpr chrono::minutes operator""min(unsigned long long __m)
   1103     {
   1104         return chrono::minutes(static_cast<chrono::minutes::rep>(__m));
   1105     }
   1106 
   1107     constexpr chrono::duration<long double, ratio<60,1>> operator""min(long double __m)
   1108     {
   1109         return chrono::duration<long double, ratio<60,1>> (__m);
   1110     }
   1111 
   1112 
   1113     constexpr chrono::seconds operator""s(unsigned long long __s)
   1114     {
   1115         return chrono::seconds(static_cast<chrono::seconds::rep>(__s));
   1116     }
   1117 
   1118     constexpr chrono::duration<long double> operator""s(long double __s)
   1119     {
   1120         return chrono::duration<long double> (__s);
   1121     }
   1122 
   1123 
   1124     constexpr chrono::milliseconds operator""ms(unsigned long long __ms)
   1125     {
   1126         return chrono::milliseconds(static_cast<chrono::milliseconds::rep>(__ms));
   1127     }
   1128 
   1129     constexpr chrono::duration<long double, milli> operator""ms(long double __ms)
   1130     {
   1131         return chrono::duration<long double, milli>(__ms);
   1132     }
   1133 
   1134 
   1135     constexpr chrono::microseconds operator""us(unsigned long long __us)
   1136     {
   1137         return chrono::microseconds(static_cast<chrono::microseconds::rep>(__us));
   1138     }
   1139 
   1140     constexpr chrono::duration<long double, micro> operator""us(long double __us)
   1141     {
   1142         return chrono::duration<long double, micro> (__us);
   1143     }
   1144     
   1145 
   1146     constexpr chrono::nanoseconds operator""ns(unsigned long long __ns)
   1147     {
   1148         return chrono::nanoseconds(static_cast<chrono::nanoseconds::rep>(__ns));
   1149     }
   1150 
   1151     constexpr chrono::duration<long double, nano> operator""ns(long double __ns)
   1152     {
   1153         return chrono::duration<long double, nano> (__ns);
   1154     }
   1155 
   1156 }}
   1157 
   1158 namespace chrono { // hoist the literals into namespace std::chrono
   1159    using namespace literals::chrono_literals;
   1160 }
   1161 
   1162 #endif
   1163 
   1164 _LIBCPP_END_NAMESPACE_STD
   1165 
   1166 _LIBCPP_POP_MACROS
   1167 
   1168 #endif  // _LIBCPP_CHRONO
   1169