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> 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> _LIBCPP_CONSTEXPR bool treat_as_floating_point_v
    423     = treat_as_floating_point<_Rep>::value;
    424 #endif
    425 
    426 template <class _Rep>
    427 struct _LIBCPP_TEMPLATE_VIS duration_values
    428 {
    429 public:
    430     _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR _Rep zero() {return _Rep(0);}
    431     _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR _Rep max()  {return numeric_limits<_Rep>::max();}
    432     _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR _Rep min()  {return numeric_limits<_Rep>::lowest();}
    433 };
    434 
    435 #if _LIBCPP_STD_VER > 14
    436 template <class _ToDuration, class _Rep, class _Period>
    437 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
    438 typename enable_if
    439 <
    440     __is_duration<_ToDuration>::value,
    441     _ToDuration
    442 >::type
    443 floor(const duration<_Rep, _Period>& __d)
    444 {
    445     _ToDuration __t = duration_cast<_ToDuration>(__d);
    446     if (__t > __d)
    447         __t = __t - _ToDuration{1};
    448     return __t;
    449 }
    450 
    451 template <class _ToDuration, class _Rep, class _Period>
    452 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
    453 typename enable_if
    454 <
    455     __is_duration<_ToDuration>::value,
    456     _ToDuration
    457 >::type
    458 ceil(const duration<_Rep, _Period>& __d)
    459 {
    460     _ToDuration __t = duration_cast<_ToDuration>(__d);
    461     if (__t < __d)
    462         __t = __t + _ToDuration{1};
    463     return __t;
    464 }
    465 
    466 template <class _ToDuration, class _Rep, class _Period>
    467 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
    468 typename enable_if
    469 <
    470     __is_duration<_ToDuration>::value,
    471     _ToDuration
    472 >::type
    473 round(const duration<_Rep, _Period>& __d)
    474 {
    475     _ToDuration __lower = floor<_ToDuration>(__d);
    476     _ToDuration __upper = __lower + _ToDuration{1};
    477     auto __lowerDiff = __d - __lower;
    478     auto __upperDiff = __upper - __d;
    479     if (__lowerDiff < __upperDiff)
    480         return __lower;
    481     if (__lowerDiff > __upperDiff)
    482         return __upper;
    483     return __lower.count() & 1 ? __upper : __lower;
    484 }
    485 #endif
    486 
    487 // duration
    488 
    489 template <class _Rep, class _Period>
    490 class _LIBCPP_TEMPLATE_VIS duration
    491 {
    492     static_assert(!__is_duration<_Rep>::value, "A duration representation can not be a duration");
    493     static_assert(__is_ratio<_Period>::value, "Second template parameter of duration must be a std::ratio");
    494     static_assert(_Period::num > 0, "duration period must be positive");
    495 
    496     template <class _R1, class _R2>
    497     struct __no_overflow
    498     {
    499     private:
    500         static const intmax_t __gcd_n1_n2 = __static_gcd<_R1::num, _R2::num>::value;
    501         static const intmax_t __gcd_d1_d2 = __static_gcd<_R1::den, _R2::den>::value;
    502         static const intmax_t __n1 = _R1::num / __gcd_n1_n2;
    503         static const intmax_t __d1 = _R1::den / __gcd_d1_d2;
    504         static const intmax_t __n2 = _R2::num / __gcd_n1_n2;
    505         static const intmax_t __d2 = _R2::den / __gcd_d1_d2;
    506         static const intmax_t max = -((intmax_t(1) << (sizeof(intmax_t) * CHAR_BIT - 1)) + 1);
    507 
    508         template <intmax_t _Xp, intmax_t _Yp, bool __overflow>
    509         struct __mul    // __overflow == false
    510         {
    511             static const intmax_t value = _Xp * _Yp;
    512         };
    513 
    514         template <intmax_t _Xp, intmax_t _Yp>
    515         struct __mul<_Xp, _Yp, true>
    516         {
    517             static const intmax_t value = 1;
    518         };
    519 
    520     public:
    521         static const bool value = (__n1 <= max / __d2) && (__n2 <= max / __d1);
    522         typedef ratio<__mul<__n1, __d2, !value>::value,
    523                       __mul<__n2, __d1, !value>::value> type;
    524     };
    525     
    526 public:
    527     typedef _Rep rep;
    528     typedef typename _Period::type period;
    529 private:
    530     rep __rep_;
    531 public:
    532 
    533     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
    534 #ifndef _LIBCPP_CXX03_LANG
    535         duration() = default;
    536 #else
    537         duration() {}
    538 #endif
    539 
    540     template <class _Rep2>
    541         _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
    542         explicit duration(const _Rep2& __r,
    543             typename enable_if
    544             <
    545                is_convertible<_Rep2, rep>::value &&
    546                (treat_as_floating_point<rep>::value ||
    547                !treat_as_floating_point<_Rep2>::value)
    548             >::type* = 0)
    549                 : __rep_(__r) {}
    550 
    551     // conversions
    552     template <class _Rep2, class _Period2>
    553         _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
    554         duration(const duration<_Rep2, _Period2>& __d,
    555             typename enable_if
    556             <
    557                 __no_overflow<_Period2, period>::value && (
    558                 treat_as_floating_point<rep>::value ||
    559                 (__no_overflow<_Period2, period>::type::den == 1 &&
    560                  !treat_as_floating_point<_Rep2>::value))
    561             >::type* = 0)
    562                 : __rep_(_VSTD::chrono::duration_cast<duration>(__d).count()) {}
    563 
    564     // observer
    565 
    566     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR rep count() const {return __rep_;}
    567 
    568     // arithmetic
    569 
    570     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR typename common_type<duration>::type operator+() const {return typename common_type<duration>::type(*this);}
    571     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR typename common_type<duration>::type operator-() const {return typename common_type<duration>::type(-__rep_);}
    572     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator++()      {++__rep_; return *this;}
    573     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration  operator++(int)   {return duration(__rep_++);}
    574     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator--()      {--__rep_; return *this;}
    575     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration  operator--(int)   {return duration(__rep_--);}
    576 
    577     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator+=(const duration& __d) {__rep_ += __d.count(); return *this;}
    578     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator-=(const duration& __d) {__rep_ -= __d.count(); return *this;}
    579 
    580     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator*=(const rep& rhs) {__rep_ *= rhs; return *this;}
    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 duration& rhs) {__rep_ %= rhs.count(); return *this;}
    584 
    585     // special values
    586 
    587     _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR duration zero() {return duration(duration_values<rep>::zero());}
    588     _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR duration min()  {return duration(duration_values<rep>::min());}
    589     _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR duration max()  {return duration(duration_values<rep>::max());}
    590 };
    591 
    592 typedef duration<long long,         nano> nanoseconds;
    593 typedef duration<long long,        micro> microseconds;
    594 typedef duration<long long,        milli> milliseconds;
    595 typedef duration<long long              > seconds;
    596 typedef duration<     long, ratio<  60> > minutes;
    597 typedef duration<     long, ratio<3600> > hours;
    598 
    599 // Duration ==
    600 
    601 template <class _LhsDuration, class _RhsDuration>
    602 struct __duration_eq
    603 {
    604     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
    605     bool operator()(const _LhsDuration& __lhs, const _RhsDuration& __rhs) const
    606         {
    607             typedef typename common_type<_LhsDuration, _RhsDuration>::type _Ct;
    608             return _Ct(__lhs).count() == _Ct(__rhs).count();
    609         }
    610 };
    611 
    612 template <class _LhsDuration>
    613 struct __duration_eq<_LhsDuration, _LhsDuration>
    614 {
    615     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
    616     bool operator()(const _LhsDuration& __lhs, const _LhsDuration& __rhs) const
    617         {return __lhs.count() == __rhs.count();}
    618 };
    619 
    620 template <class _Rep1, class _Period1, class _Rep2, class _Period2>
    621 inline _LIBCPP_INLINE_VISIBILITY
    622 _LIBCPP_CONSTEXPR
    623 bool
    624 operator==(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
    625 {
    626     return __duration_eq<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >()(__lhs, __rhs);
    627 }
    628 
    629 // Duration !=
    630 
    631 template <class _Rep1, class _Period1, class _Rep2, class _Period2>
    632 inline _LIBCPP_INLINE_VISIBILITY
    633 _LIBCPP_CONSTEXPR
    634 bool
    635 operator!=(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
    636 {
    637     return !(__lhs == __rhs);
    638 }
    639 
    640 // Duration <
    641 
    642 template <class _LhsDuration, class _RhsDuration>
    643 struct __duration_lt
    644 {
    645     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
    646     bool operator()(const _LhsDuration& __lhs, const _RhsDuration& __rhs) const
    647         {
    648             typedef typename common_type<_LhsDuration, _RhsDuration>::type _Ct;
    649             return _Ct(__lhs).count() < _Ct(__rhs).count();
    650         }
    651 };
    652 
    653 template <class _LhsDuration>
    654 struct __duration_lt<_LhsDuration, _LhsDuration>
    655 {
    656     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
    657     bool operator()(const _LhsDuration& __lhs, const _LhsDuration& __rhs) const
    658         {return __lhs.count() < __rhs.count();}
    659 };
    660 
    661 template <class _Rep1, class _Period1, class _Rep2, class _Period2>
    662 inline _LIBCPP_INLINE_VISIBILITY
    663 _LIBCPP_CONSTEXPR
    664 bool
    665 operator< (const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
    666 {
    667     return __duration_lt<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >()(__lhs, __rhs);
    668 }
    669 
    670 // Duration >
    671 
    672 template <class _Rep1, class _Period1, class _Rep2, class _Period2>
    673 inline _LIBCPP_INLINE_VISIBILITY
    674 _LIBCPP_CONSTEXPR
    675 bool
    676 operator> (const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
    677 {
    678     return __rhs < __lhs;
    679 }
    680 
    681 // Duration <=
    682 
    683 template <class _Rep1, class _Period1, class _Rep2, class _Period2>
    684 inline _LIBCPP_INLINE_VISIBILITY
    685 _LIBCPP_CONSTEXPR
    686 bool
    687 operator<=(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
    688 {
    689     return !(__rhs < __lhs);
    690 }
    691 
    692 // Duration >=
    693 
    694 template <class _Rep1, class _Period1, class _Rep2, class _Period2>
    695 inline _LIBCPP_INLINE_VISIBILITY
    696 _LIBCPP_CONSTEXPR
    697 bool
    698 operator>=(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
    699 {
    700     return !(__lhs < __rhs);
    701 }
    702 
    703 // Duration +
    704 
    705 template <class _Rep1, class _Period1, class _Rep2, class _Period2>
    706 inline _LIBCPP_INLINE_VISIBILITY
    707 _LIBCPP_CONSTEXPR
    708 typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type
    709 operator+(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
    710 {
    711     typedef typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type _Cd;
    712     return _Cd(_Cd(__lhs).count() + _Cd(__rhs).count());
    713 }
    714 
    715 // Duration -
    716 
    717 template <class _Rep1, class _Period1, class _Rep2, class _Period2>
    718 inline _LIBCPP_INLINE_VISIBILITY
    719 _LIBCPP_CONSTEXPR
    720 typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type
    721 operator-(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
    722 {
    723     typedef typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type _Cd;
    724     return _Cd(_Cd(__lhs).count() - _Cd(__rhs).count());
    725 }
    726 
    727 // Duration *
    728 
    729 template <class _Rep1, class _Period, class _Rep2>
    730 inline _LIBCPP_INLINE_VISIBILITY
    731 _LIBCPP_CONSTEXPR
    732 typename enable_if
    733 <
    734     is_convertible<_Rep2, typename common_type<_Rep1, _Rep2>::type>::value,
    735     duration<typename common_type<_Rep1, _Rep2>::type, _Period>
    736 >::type
    737 operator*(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
    738 {
    739     typedef typename common_type<_Rep1, _Rep2>::type _Cr;
    740     typedef duration<_Cr, _Period> _Cd;
    741     return _Cd(_Cd(__d).count() * static_cast<_Cr>(__s));
    742 }
    743 
    744 template <class _Rep1, class _Period, class _Rep2>
    745 inline _LIBCPP_INLINE_VISIBILITY
    746 _LIBCPP_CONSTEXPR
    747 typename enable_if
    748 <
    749     is_convertible<_Rep1, typename common_type<_Rep1, _Rep2>::type>::value,
    750     duration<typename common_type<_Rep1, _Rep2>::type, _Period>
    751 >::type
    752 operator*(const _Rep1& __s, const duration<_Rep2, _Period>& __d)
    753 {
    754     return __d * __s;
    755 }
    756 
    757 // Duration /
    758 
    759 template <class _Duration, class _Rep, bool = __is_duration<_Rep>::value>
    760 struct __duration_divide_result
    761 {
    762 };
    763 
    764 template <class _Duration, class _Rep2,
    765     bool = is_convertible<_Rep2,
    766                           typename common_type<typename _Duration::rep, _Rep2>::type>::value>
    767 struct __duration_divide_imp
    768 {
    769 };
    770 
    771 template <class _Rep1, class _Period, class _Rep2>
    772 struct __duration_divide_imp<duration<_Rep1, _Period>, _Rep2, true>
    773 {
    774     typedef duration<typename common_type<_Rep1, _Rep2>::type, _Period> type;
    775 };
    776 
    777 template <class _Rep1, class _Period, class _Rep2>
    778 struct __duration_divide_result<duration<_Rep1, _Period>, _Rep2, false>
    779     : __duration_divide_imp<duration<_Rep1, _Period>, _Rep2>
    780 {
    781 };
    782 
    783 template <class _Rep1, class _Period, class _Rep2>
    784 inline _LIBCPP_INLINE_VISIBILITY
    785 _LIBCPP_CONSTEXPR
    786 typename __duration_divide_result<duration<_Rep1, _Period>, _Rep2>::type
    787 operator/(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
    788 {
    789     typedef typename common_type<_Rep1, _Rep2>::type _Cr;
    790     typedef duration<_Cr, _Period> _Cd;
    791     return _Cd(_Cd(__d).count() / static_cast<_Cr>(__s));
    792 }
    793 
    794 template <class _Rep1, class _Period1, class _Rep2, class _Period2>
    795 inline _LIBCPP_INLINE_VISIBILITY
    796 _LIBCPP_CONSTEXPR
    797 typename common_type<_Rep1, _Rep2>::type
    798 operator/(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
    799 {
    800     typedef typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type _Ct;
    801     return _Ct(__lhs).count() / _Ct(__rhs).count();
    802 }
    803 
    804 // Duration %
    805 
    806 template <class _Rep1, class _Period, class _Rep2>
    807 inline _LIBCPP_INLINE_VISIBILITY
    808 _LIBCPP_CONSTEXPR
    809 typename __duration_divide_result<duration<_Rep1, _Period>, _Rep2>::type
    810 operator%(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
    811 {
    812     typedef typename common_type<_Rep1, _Rep2>::type _Cr;
    813     typedef duration<_Cr, _Period> _Cd;
    814     return _Cd(_Cd(__d).count() % static_cast<_Cr>(__s));
    815 }
    816 
    817 template <class _Rep1, class _Period1, class _Rep2, class _Period2>
    818 inline _LIBCPP_INLINE_VISIBILITY
    819 _LIBCPP_CONSTEXPR
    820 typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type
    821 operator%(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
    822 {
    823     typedef typename common_type<_Rep1, _Rep2>::type _Cr;
    824     typedef typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type _Cd;
    825     return _Cd(static_cast<_Cr>(_Cd(__lhs).count()) % static_cast<_Cr>(_Cd(__rhs).count()));
    826 }
    827 
    828 //////////////////////////////////////////////////////////
    829 ///////////////////// time_point /////////////////////////
    830 //////////////////////////////////////////////////////////
    831 
    832 template <class _Clock, class _Duration = typename _Clock::duration>
    833 class _LIBCPP_TEMPLATE_VIS time_point
    834 {
    835     static_assert(__is_duration<_Duration>::value,
    836                   "Second template parameter of time_point must be a std::chrono::duration");
    837 public:
    838     typedef _Clock                    clock;
    839     typedef _Duration                 duration;
    840     typedef typename duration::rep    rep;
    841     typedef typename duration::period period;
    842 private:
    843     duration __d_;
    844 
    845 public:
    846     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 time_point() : __d_(duration::zero()) {}
    847     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 explicit time_point(const duration& __d) : __d_(__d) {}
    848 
    849     // conversions
    850     template <class _Duration2>
    851     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
    852     time_point(const time_point<clock, _Duration2>& t,
    853         typename enable_if
    854         <
    855             is_convertible<_Duration2, duration>::value
    856         >::type* = 0)
    857             : __d_(t.time_since_epoch()) {}
    858 
    859     // observer
    860 
    861     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 duration time_since_epoch() const {return __d_;}
    862 
    863     // arithmetic
    864 
    865     _LIBCPP_INLINE_VISIBILITY time_point& operator+=(const duration& __d) {__d_ += __d; return *this;}
    866     _LIBCPP_INLINE_VISIBILITY time_point& operator-=(const duration& __d) {__d_ -= __d; return *this;}
    867 
    868     // special values
    869 
    870     _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR time_point min() {return time_point(duration::min());}
    871     _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR time_point max() {return time_point(duration::max());}
    872 };
    873 
    874 } // chrono
    875 
    876 template <class _Clock, class _Duration1, class _Duration2>
    877 struct _LIBCPP_TEMPLATE_VIS common_type<chrono::time_point<_Clock, _Duration1>,
    878                                          chrono::time_point<_Clock, _Duration2> >
    879 {
    880     typedef chrono::time_point<_Clock, typename common_type<_Duration1, _Duration2>::type> type;
    881 };
    882 
    883 namespace chrono {
    884 
    885 template <class _ToDuration, class _Clock, class _Duration>
    886 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
    887 time_point<_Clock, _ToDuration>
    888 time_point_cast(const time_point<_Clock, _Duration>& __t)
    889 {
    890     return time_point<_Clock, _ToDuration>(_VSTD::chrono::duration_cast<_ToDuration>(__t.time_since_epoch()));
    891 }
    892 
    893 #if _LIBCPP_STD_VER > 14
    894 template <class _ToDuration, class _Clock, class _Duration>
    895 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
    896 typename enable_if
    897 <
    898     __is_duration<_ToDuration>::value,
    899     time_point<_Clock, _ToDuration>
    900 >::type
    901 floor(const time_point<_Clock, _Duration>& __t)
    902 {
    903     return time_point<_Clock, _ToDuration>{floor<_ToDuration>(__t.time_since_epoch())};
    904 }
    905 
    906 template <class _ToDuration, class _Clock, class _Duration>
    907 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
    908 typename enable_if
    909 <
    910     __is_duration<_ToDuration>::value,
    911     time_point<_Clock, _ToDuration>
    912 >::type
    913 ceil(const time_point<_Clock, _Duration>& __t)
    914 {
    915     return time_point<_Clock, _ToDuration>{ceil<_ToDuration>(__t.time_since_epoch())};
    916 }
    917 
    918 template <class _ToDuration, class _Clock, class _Duration>
    919 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
    920 typename enable_if
    921 <
    922     __is_duration<_ToDuration>::value,
    923     time_point<_Clock, _ToDuration>
    924 >::type
    925 round(const time_point<_Clock, _Duration>& __t)
    926 {
    927     return time_point<_Clock, _ToDuration>{round<_ToDuration>(__t.time_since_epoch())};
    928 }
    929 
    930 template <class _Rep, class _Period>
    931 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
    932 typename enable_if
    933 <
    934     numeric_limits<_Rep>::is_signed,
    935     duration<_Rep, _Period>
    936 >::type
    937 abs(duration<_Rep, _Period> __d)
    938 {
    939     return __d >= __d.zero() ? __d : -__d;
    940 }
    941 #endif
    942 
    943 // time_point ==
    944 
    945 template <class _Clock, class _Duration1, class _Duration2>
    946 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
    947 bool
    948 operator==(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
    949 {
    950     return __lhs.time_since_epoch() == __rhs.time_since_epoch();
    951 }
    952 
    953 // time_point !=
    954 
    955 template <class _Clock, class _Duration1, class _Duration2>
    956 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
    957 bool
    958 operator!=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
    959 {
    960     return !(__lhs == __rhs);
    961 }
    962 
    963 // time_point <
    964 
    965 template <class _Clock, class _Duration1, class _Duration2>
    966 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
    967 bool
    968 operator<(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
    969 {
    970     return __lhs.time_since_epoch() < __rhs.time_since_epoch();
    971 }
    972 
    973 // time_point >
    974 
    975 template <class _Clock, class _Duration1, class _Duration2>
    976 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
    977 bool
    978 operator>(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
    979 {
    980     return __rhs < __lhs;
    981 }
    982 
    983 // time_point <=
    984 
    985 template <class _Clock, class _Duration1, class _Duration2>
    986 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
    987 bool
    988 operator<=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
    989 {
    990     return !(__rhs < __lhs);
    991 }
    992 
    993 // time_point >=
    994 
    995 template <class _Clock, class _Duration1, class _Duration2>
    996 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
    997 bool
    998 operator>=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
    999 {
   1000     return !(__lhs < __rhs);
   1001 }
   1002 
   1003 // time_point operator+(time_point x, duration y);
   1004 
   1005 template <class _Clock, class _Duration1, class _Rep2, class _Period2>
   1006 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
   1007 time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type>
   1008 operator+(const time_point<_Clock, _Duration1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
   1009 {
   1010     typedef time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type> _Tr;
   1011     return _Tr (__lhs.time_since_epoch() + __rhs);
   1012 }
   1013 
   1014 // time_point operator+(duration x, time_point y);
   1015 
   1016 template <class _Rep1, class _Period1, class _Clock, class _Duration2>
   1017 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
   1018 time_point<_Clock, typename common_type<duration<_Rep1, _Period1>, _Duration2>::type>
   1019 operator+(const duration<_Rep1, _Period1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
   1020 {
   1021     return __rhs + __lhs;
   1022 }
   1023 
   1024 // time_point operator-(time_point x, duration y);
   1025 
   1026 template <class _Clock, class _Duration1, class _Rep2, class _Period2>
   1027 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
   1028 time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type>
   1029 operator-(const time_point<_Clock, _Duration1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
   1030 {
   1031     typedef time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type> _Ret;
   1032     return _Ret(__lhs.time_since_epoch() -__rhs);
   1033 }
   1034 
   1035 // duration operator-(time_point x, time_point y);
   1036 
   1037 template <class _Clock, class _Duration1, class _Duration2>
   1038 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
   1039 typename common_type<_Duration1, _Duration2>::type
   1040 operator-(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
   1041 {
   1042     return __lhs.time_since_epoch() - __rhs.time_since_epoch();
   1043 }
   1044 
   1045 //////////////////////////////////////////////////////////
   1046 /////////////////////// clocks ///////////////////////////
   1047 //////////////////////////////////////////////////////////
   1048 
   1049 class _LIBCPP_TYPE_VIS system_clock
   1050 {
   1051 public:
   1052     typedef microseconds                     duration;
   1053     typedef duration::rep                    rep;
   1054     typedef duration::period                 period;
   1055     typedef chrono::time_point<system_clock> time_point;
   1056     static _LIBCPP_CONSTEXPR_AFTER_CXX11 const bool is_steady = false;
   1057 
   1058     static time_point now() _NOEXCEPT;
   1059     static time_t     to_time_t  (const time_point& __t) _NOEXCEPT;
   1060     static time_point from_time_t(time_t __t) _NOEXCEPT;
   1061 };
   1062 
   1063 #ifndef _LIBCPP_HAS_NO_MONOTONIC_CLOCK
   1064 class _LIBCPP_TYPE_VIS steady_clock
   1065 {
   1066 public:
   1067     typedef nanoseconds                                   duration;
   1068     typedef duration::rep                                 rep;
   1069     typedef duration::period                              period;
   1070     typedef chrono::time_point<steady_clock, duration>    time_point;
   1071     static _LIBCPP_CONSTEXPR_AFTER_CXX11 const bool is_steady = true;
   1072 
   1073     static time_point now() _NOEXCEPT;
   1074 };
   1075 
   1076 typedef steady_clock high_resolution_clock;
   1077 #else
   1078 typedef system_clock high_resolution_clock;
   1079 #endif
   1080 
   1081 } // chrono
   1082 
   1083 #if _LIBCPP_STD_VER > 11
   1084 // Suffixes for duration literals [time.duration.literals]
   1085 inline namespace literals
   1086 { 
   1087   inline namespace chrono_literals
   1088   {
   1089 
   1090     constexpr chrono::hours operator"" h(unsigned long long __h)
   1091     {
   1092         return chrono::hours(static_cast<chrono::hours::rep>(__h));
   1093     }
   1094 
   1095     constexpr chrono::duration<long double, ratio<3600,1>> operator"" h(long double __h)
   1096     {
   1097         return chrono::duration<long double, ratio<3600,1>>(__h);
   1098     }
   1099 
   1100 
   1101     constexpr chrono::minutes operator"" min(unsigned long long __m)
   1102     {
   1103         return chrono::minutes(static_cast<chrono::minutes::rep>(__m));
   1104     }
   1105 
   1106     constexpr chrono::duration<long double, ratio<60,1>> operator"" min(long double __m)
   1107     {
   1108         return chrono::duration<long double, ratio<60,1>> (__m);
   1109     }
   1110 
   1111 
   1112     constexpr chrono::seconds operator"" s(unsigned long long __s)
   1113     {
   1114         return chrono::seconds(static_cast<chrono::seconds::rep>(__s));
   1115     }
   1116 
   1117     constexpr chrono::duration<long double> operator"" s(long double __s)
   1118     {
   1119         return chrono::duration<long double> (__s);
   1120     }
   1121 
   1122 
   1123     constexpr chrono::milliseconds operator"" ms(unsigned long long __ms)
   1124     {
   1125         return chrono::milliseconds(static_cast<chrono::milliseconds::rep>(__ms));
   1126     }
   1127 
   1128     constexpr chrono::duration<long double, milli> operator"" ms(long double __ms)
   1129     {
   1130         return chrono::duration<long double, milli>(__ms);
   1131     }
   1132 
   1133 
   1134     constexpr chrono::microseconds operator"" us(unsigned long long __us)
   1135     {
   1136         return chrono::microseconds(static_cast<chrono::microseconds::rep>(__us));
   1137     }
   1138 
   1139     constexpr chrono::duration<long double, micro> operator"" us(long double __us)
   1140     {
   1141         return chrono::duration<long double, micro> (__us);
   1142     }
   1143     
   1144 
   1145     constexpr chrono::nanoseconds operator"" ns(unsigned long long __ns)
   1146     {
   1147         return chrono::nanoseconds(static_cast<chrono::nanoseconds::rep>(__ns));
   1148     }
   1149 
   1150     constexpr chrono::duration<long double, nano> operator"" ns(long double __ns)
   1151     {
   1152         return chrono::duration<long double, nano> (__ns);
   1153     }
   1154 
   1155 }}
   1156 
   1157 namespace chrono { // hoist the literals into namespace std::chrono
   1158    using namespace literals::chrono_literals;
   1159 }
   1160 
   1161 #endif
   1162 
   1163 _LIBCPP_END_NAMESPACE_STD
   1164 
   1165 _LIBCPP_POP_MACROS
   1166 
   1167 #endif  // _LIBCPP_CHRONO
   1168