1 // <chrono> -*- C++ -*-
 
    3 // Copyright (C) 2008-2014 Free Software Foundation, Inc.
 
    5 // This file is part of the GNU ISO C++ Library.  This library is free
 
    6 // software; you can redistribute it and/or modify it under the
 
    7 // terms of the GNU General Public License as published by the
 
    8 // Free Software Foundation; either version 3, or (at your option)
 
   11 // This library is distributed in the hope that it will be useful,
 
   12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
 
   13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
   14 // GNU General Public License for more details.
 
   16 // Under Section 7 of GPL version 3, you are granted additional
 
   17 // permissions described in the GCC Runtime Library Exception, version
 
   18 // 3.1, as published by the Free Software Foundation.
 
   20 // You should have received a copy of the GNU General Public License and
 
   21 // a copy of the GCC Runtime Library Exception along with this program;
 
   22 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 
   23 // <http://www.gnu.org/licenses/>.
 
   25 /** @file include/chrono
 
   26  *  This is a Standard C++ Library header.
 
   29 #ifndef _GLIBCXX_CHRONO
 
   30 #define _GLIBCXX_CHRONO 1
 
   32 #pragma GCC system_header
 
   34 #if __cplusplus < 201103L
 
   35 # include <bits/c++0x_warning.h>
 
   39 #include <type_traits>
 
   42 #include <bits/parse_numbers.h> // for literals support.
 
   44 #ifdef _GLIBCXX_USE_C99_STDINT_TR1
 
   46 namespace std _GLIBCXX_VISIBILITY(default)
 
   49    * @defgroup chrono Time
 
   52    * Classes and functions for time.
 
   56   /** @namespace std::chrono
 
   57    *  @brief ISO C++ 2011 entities sub-namespace for time and date.
 
   61   _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
   63     template<typename _Rep, typename _Period = ratio<1>>
 
   66     template<typename _Clock, typename _Dur = typename _Clock::duration>
 
   69   _GLIBCXX_END_NAMESPACE_VERSION
 
   72 _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
   74   // 20.11.4.3 specialization of common_type (for duration, sfinae-friendly)
 
   76   template<typename _CT, typename _Period1, typename _Period2>
 
   77     struct __duration_common_type_wrapper
 
   80       typedef __static_gcd<_Period1::num, _Period2::num> __gcd_num;
 
   81       typedef __static_gcd<_Period1::den, _Period2::den> __gcd_den;
 
   82       typedef typename _CT::type __cr;
 
   83       typedef ratio<__gcd_num::value,
 
   84         (_Period1::den / __gcd_den::value) * _Period2::den> __r;
 
   86       typedef __success_type<chrono::duration<__cr, __r>> type;
 
   89   template<typename _Period1, typename _Period2>
 
   90     struct __duration_common_type_wrapper<__failure_type, _Period1, _Period2>
 
   91     { typedef __failure_type type; };
 
   93   template<typename _Rep1, typename _Period1, typename _Rep2, typename _Period2>
 
   94     struct common_type<chrono::duration<_Rep1, _Period1>,
 
   95              chrono::duration<_Rep2, _Period2>>
 
   96     : public __duration_common_type_wrapper<typename __member_type_wrapper<
 
   97              common_type<_Rep1, _Rep2>>::type, _Period1, _Period2>::type
 
  100   // 20.11.4.3 specialization of common_type (for time_point, sfinae-friendly)
 
  102   template<typename _CT, typename _Clock>
 
  103     struct __timepoint_common_type_wrapper
 
  105       typedef __success_type<chrono::time_point<_Clock, typename _CT::type>>
 
  109   template<typename _Clock>
 
  110     struct __timepoint_common_type_wrapper<__failure_type, _Clock>
 
  111     { typedef __failure_type type; };
 
  113   template<typename _Clock, typename _Duration1, typename _Duration2>
 
  114     struct common_type<chrono::time_point<_Clock, _Duration1>,
 
  115              chrono::time_point<_Clock, _Duration2>>
 
  116     : public __timepoint_common_type_wrapper<typename __member_type_wrapper<
 
  117              common_type<_Duration1, _Duration2>>::type, _Clock>::type
 
  120 _GLIBCXX_END_NAMESPACE_VERSION
 
  124   _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
  126     // Primary template for duration_cast impl.
 
  127     template<typename _ToDur, typename _CF, typename _CR,
 
  128         bool _NumIsOne = false, bool _DenIsOne = false>
 
  129       struct __duration_cast_impl
 
  131    template<typename _Rep, typename _Period>
 
  132      static constexpr _ToDur
 
  133      __cast(const duration<_Rep, _Period>& __d)
 
  135        typedef typename _ToDur::rep            __to_rep;
 
  136        return _ToDur(static_cast<__to_rep>(static_cast<_CR>(__d.count())
 
  137          * static_cast<_CR>(_CF::num)
 
  138          / static_cast<_CR>(_CF::den)));
 
  142     template<typename _ToDur, typename _CF, typename _CR>
 
  143       struct __duration_cast_impl<_ToDur, _CF, _CR, true, true>
 
  145    template<typename _Rep, typename _Period>
 
  146      static constexpr _ToDur
 
  147      __cast(const duration<_Rep, _Period>& __d)
 
  149        typedef typename _ToDur::rep            __to_rep;
 
  150        return _ToDur(static_cast<__to_rep>(__d.count()));
 
  154     template<typename _ToDur, typename _CF, typename _CR>
 
  155       struct __duration_cast_impl<_ToDur, _CF, _CR, true, false>
 
  157    template<typename _Rep, typename _Period>
 
  158      static constexpr _ToDur
 
  159      __cast(const duration<_Rep, _Period>& __d)
 
  161        typedef typename _ToDur::rep            __to_rep;
 
  162        return _ToDur(static_cast<__to_rep>(
 
  163          static_cast<_CR>(__d.count()) / static_cast<_CR>(_CF::den)));
 
  167     template<typename _ToDur, typename _CF, typename _CR>
 
  168       struct __duration_cast_impl<_ToDur, _CF, _CR, false, true>
 
  170    template<typename _Rep, typename _Period>
 
  171      static constexpr _ToDur
 
  172      __cast(const duration<_Rep, _Period>& __d)
 
  174        typedef typename _ToDur::rep            __to_rep;
 
  175        return _ToDur(static_cast<__to_rep>(
 
  176          static_cast<_CR>(__d.count()) * static_cast<_CR>(_CF::num)));
 
  180     template<typename _Tp>
 
  185     template<typename _Rep, typename _Period>
 
  186       struct __is_duration<duration<_Rep, _Period>>
 
  191     template<typename _ToDur, typename _Rep, typename _Period>
 
  192       constexpr typename enable_if<__is_duration<_ToDur>::value,
 
  194       duration_cast(const duration<_Rep, _Period>& __d)
 
  196    typedef typename _ToDur::period             __to_period;
 
  197    typedef typename _ToDur::rep                __to_rep;
 
  198    typedef ratio_divide<_Period, __to_period>      __cf;
 
  199    typedef typename common_type<__to_rep, _Rep, intmax_t>::type
 
  201    typedef  __duration_cast_impl<_ToDur, __cf, __cr,
 
  202                      __cf::num == 1, __cf::den == 1> __dc;
 
  203    return __dc::__cast(__d);
 
  206     /// treat_as_floating_point
 
  207     template<typename _Rep>
 
  208       struct treat_as_floating_point
 
  209       : is_floating_point<_Rep>
 
  213     template<typename _Rep>
 
  214       struct duration_values
 
  216    static constexpr _Rep
 
  220    static constexpr _Rep
 
  222    { return numeric_limits<_Rep>::max(); }
 
  224    static constexpr _Rep
 
  226    { return numeric_limits<_Rep>::lowest(); }
 
  229     template<typename _Tp>
 
  234     template<intmax_t _Num, intmax_t _Den>
 
  235       struct __is_ratio<ratio<_Num, _Den>>
 
  240     template<typename _Rep, typename _Period>
 
  244    typedef _Period                     period;
 
  246    static_assert(!__is_duration<_Rep>::value, "rep cannot be a duration");
 
  247    static_assert(__is_ratio<_Period>::value,
 
  248              "period must be a specialization of ratio");
 
  249    static_assert(_Period::num > 0, "period must be positive");
 
  251    // 20.11.5.1 construction / copy / destroy
 
  252    constexpr duration() = default;
 
  254    // NB: Make constexpr implicit. This cannot be explicitly
 
  255    // constexpr, as any UDT that is not a literal type with a
 
  256    // constexpr copy constructor will be ill-formed.
 
  257    duration(const duration&) = default;
 
  259    template<typename _Rep2, typename = typename
 
  260           enable_if<is_convertible<_Rep2, rep>::value
 
  261             && (treat_as_floating_point<rep>::value
 
  262                 || !treat_as_floating_point<_Rep2>::value)>::type>
 
  263      constexpr explicit duration(const _Rep2& __rep)
 
  264      : __r(static_cast<rep>(__rep)) { }
 
  266    template<typename _Rep2, typename _Period2, typename = typename
 
  267           enable_if<treat_as_floating_point<rep>::value
 
  268             || (ratio_divide<_Period2, period>::den == 1
 
  269                 && !treat_as_floating_point<_Rep2>::value)>::type>
 
  270      constexpr duration(const duration<_Rep2, _Period2>& __d)
 
  271      : __r(duration_cast<duration>(__d).count()) { }
 
  273    ~duration() = default;
 
  274    duration& operator=(const duration&) = default;
 
  276    // 20.11.5.2 observer
 
  281    // 20.11.5.3 arithmetic
 
  288    { return duration(-__r); }
 
  299    { return duration(__r++); }
 
  310    { return duration(__r--); }
 
  313    operator+=(const duration& __d)
 
  320    operator-=(const duration& __d)
 
  327    operator*=(const rep& __rhs)
 
  334    operator/=(const rep& __rhs)
 
  341    template<typename _Rep2 = rep>
 
  342      typename enable_if<!treat_as_floating_point<_Rep2>::value,
 
  344      operator%=(const rep& __rhs)
 
  350    template<typename _Rep2 = rep>
 
  351      typename enable_if<!treat_as_floating_point<_Rep2>::value,
 
  353      operator%=(const duration& __d)
 
  359    // 20.11.5.4 special values
 
  360    static constexpr duration
 
  362    { return duration(duration_values<rep>::zero()); }
 
  364    static constexpr duration
 
  366    { return duration(duration_values<rep>::min()); }
 
  368    static constexpr duration
 
  370    { return duration(duration_values<rep>::max()); }
 
  376     template<typename _Rep1, typename _Period1,
 
  377         typename _Rep2, typename _Period2>
 
  378       constexpr typename common_type<duration<_Rep1, _Period1>,
 
  379                     duration<_Rep2, _Period2>>::type
 
  380       operator+(const duration<_Rep1, _Period1>& __lhs,
 
  381        const duration<_Rep2, _Period2>& __rhs)
 
  383    typedef duration<_Rep1, _Period1>           __dur1;
 
  384    typedef duration<_Rep2, _Period2>           __dur2;
 
  385    typedef typename common_type<__dur1,__dur2>::type   __cd;
 
  386    return __cd(__cd(__lhs).count() + __cd(__rhs).count());
 
  389     template<typename _Rep1, typename _Period1,
 
  390         typename _Rep2, typename _Period2>
 
  391       constexpr typename common_type<duration<_Rep1, _Period1>,
 
  392                     duration<_Rep2, _Period2>>::type
 
  393       operator-(const duration<_Rep1, _Period1>& __lhs,
 
  394        const duration<_Rep2, _Period2>& __rhs)
 
  396    typedef duration<_Rep1, _Period1>           __dur1;
 
  397    typedef duration<_Rep2, _Period2>           __dur2;
 
  398    typedef typename common_type<__dur1,__dur2>::type   __cd;
 
  399    return __cd(__cd(__lhs).count() - __cd(__rhs).count());
 
  402     template<typename _Rep1, typename _Rep2, bool =
 
  403         is_convertible<_Rep2,
 
  404                typename common_type<_Rep1, _Rep2>::type>::value>
 
  405       struct __common_rep_type { };
 
  407     template<typename _Rep1, typename _Rep2>
 
  408       struct __common_rep_type<_Rep1, _Rep2, true>
 
  409       { typedef typename common_type<_Rep1, _Rep2>::type type; };
 
  411     template<typename _Rep1, typename _Period, typename _Rep2>
 
  413       duration<typename __common_rep_type<_Rep1, _Rep2>::type, _Period>
 
  414       operator*(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
 
  416    typedef duration<typename common_type<_Rep1, _Rep2>::type, _Period>
 
  418    return __cd(__cd(__d).count() * __s);
 
  421     template<typename _Rep1, typename _Rep2, typename _Period>
 
  423       duration<typename __common_rep_type<_Rep2, _Rep1>::type, _Period>
 
  424       operator*(const _Rep1& __s, const duration<_Rep2, _Period>& __d)
 
  425       { return __d * __s; }
 
  427     template<typename _Rep1, typename _Period, typename _Rep2>
 
  428       constexpr duration<typename __common_rep_type<_Rep1, typename
 
  429    enable_if<!__is_duration<_Rep2>::value, _Rep2>::type>::type, _Period>
 
  430       operator/(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
 
  432    typedef duration<typename common_type<_Rep1, _Rep2>::type, _Period>
 
  434    return __cd(__cd(__d).count() / __s);
 
  437     template<typename _Rep1, typename _Period1,
 
  438         typename _Rep2, typename _Period2>
 
  439       constexpr typename common_type<_Rep1, _Rep2>::type
 
  440       operator/(const duration<_Rep1, _Period1>& __lhs,
 
  441        const duration<_Rep2, _Period2>& __rhs)
 
  443    typedef duration<_Rep1, _Period1>           __dur1;
 
  444    typedef duration<_Rep2, _Period2>           __dur2;
 
  445    typedef typename common_type<__dur1,__dur2>::type   __cd;
 
  446    return __cd(__lhs).count() / __cd(__rhs).count();
 
  450     template<typename _Rep1, typename _Period, typename _Rep2>
 
  451       constexpr duration<typename __common_rep_type<_Rep1, typename
 
  452    enable_if<!__is_duration<_Rep2>::value, _Rep2>::type>::type, _Period>
 
  453       operator%(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
 
  455    typedef duration<typename common_type<_Rep1, _Rep2>::type, _Period>
 
  457    return __cd(__cd(__d).count() % __s);
 
  460     template<typename _Rep1, typename _Period1,
 
  461         typename _Rep2, typename _Period2>
 
  462       constexpr typename common_type<duration<_Rep1, _Period1>,
 
  463                     duration<_Rep2, _Period2>>::type
 
  464       operator%(const duration<_Rep1, _Period1>& __lhs,
 
  465        const duration<_Rep2, _Period2>& __rhs)
 
  467    typedef duration<_Rep1, _Period1>           __dur1;
 
  468    typedef duration<_Rep2, _Period2>           __dur2;
 
  469    typedef typename common_type<__dur1,__dur2>::type   __cd;
 
  470    return __cd(__cd(__lhs).count() % __cd(__rhs).count());
 
  474     template<typename _Rep1, typename _Period1,
 
  475         typename _Rep2, typename _Period2>
 
  477       operator==(const duration<_Rep1, _Period1>& __lhs,
 
  478         const duration<_Rep2, _Period2>& __rhs)
 
  480    typedef duration<_Rep1, _Period1>           __dur1;
 
  481    typedef duration<_Rep2, _Period2>           __dur2;
 
  482    typedef typename common_type<__dur1,__dur2>::type   __ct;
 
  483    return __ct(__lhs).count() == __ct(__rhs).count();
 
  486     template<typename _Rep1, typename _Period1,
 
  487         typename _Rep2, typename _Period2>
 
  489       operator<(const duration<_Rep1, _Period1>& __lhs,
 
  490        const duration<_Rep2, _Period2>& __rhs)
 
  492    typedef duration<_Rep1, _Period1>           __dur1;
 
  493    typedef duration<_Rep2, _Period2>           __dur2;
 
  494    typedef typename common_type<__dur1,__dur2>::type   __ct;
 
  495    return __ct(__lhs).count() < __ct(__rhs).count();
 
  498     template<typename _Rep1, typename _Period1,
 
  499         typename _Rep2, typename _Period2>
 
  501       operator!=(const duration<_Rep1, _Period1>& __lhs,
 
  502         const duration<_Rep2, _Period2>& __rhs)
 
  503       { return !(__lhs == __rhs); }
 
  505     template<typename _Rep1, typename _Period1,
 
  506         typename _Rep2, typename _Period2>
 
  508       operator<=(const duration<_Rep1, _Period1>& __lhs,
 
  509         const duration<_Rep2, _Period2>& __rhs)
 
  510       { return !(__rhs < __lhs); }
 
  512     template<typename _Rep1, typename _Period1,
 
  513         typename _Rep2, typename _Period2>
 
  515       operator>(const duration<_Rep1, _Period1>& __lhs,
 
  516        const duration<_Rep2, _Period2>& __rhs)
 
  517       { return __rhs < __lhs; }
 
  519     template<typename _Rep1, typename _Period1,
 
  520         typename _Rep2, typename _Period2>
 
  522       operator>=(const duration<_Rep1, _Period1>& __lhs,
 
  523         const duration<_Rep2, _Period2>& __rhs)
 
  524       { return !(__lhs < __rhs); }
 
  527     typedef duration<int64_t, nano>        nanoseconds;
 
  530     typedef duration<int64_t, micro>       microseconds;
 
  533     typedef duration<int64_t, milli>       milliseconds;
 
  536     typedef duration<int64_t>          seconds;
 
  539     typedef duration<int64_t, ratio< 60>>   minutes;
 
  542     typedef duration<int64_t, ratio<3600>>  hours;
 
  545     template<typename _Clock, typename _Dur>
 
  548    typedef _Clock                      clock;
 
  549    typedef _Dur                        duration;
 
  550    typedef typename duration::rep              rep;
 
  551    typedef typename duration::period           period;
 
  553    constexpr time_point() : __d(duration::zero())
 
  556    constexpr explicit time_point(const duration& __dur)
 
  561    template<typename _Dur2>
 
  562      constexpr time_point(const time_point<clock, _Dur2>& __t)
 
  563      : __d(__t.time_since_epoch())
 
  568    time_since_epoch() const
 
  573    operator+=(const duration& __dur)
 
  580    operator-=(const duration& __dur)
 
  587    static constexpr time_point
 
  589    { return time_point(duration::min()); }
 
  591    static constexpr time_point
 
  593    { return time_point(duration::max()); }
 
  600     template<typename _ToDur, typename _Clock, typename _Dur>
 
  601       constexpr typename enable_if<__is_duration<_ToDur>::value,
 
  602                   time_point<_Clock, _ToDur>>::type
 
  603       time_point_cast(const time_point<_Clock, _Dur>& __t)
 
  605    typedef time_point<_Clock, _ToDur>          __time_point;
 
  606    return __time_point(duration_cast<_ToDur>(__t.time_since_epoch()));
 
  609     template<typename _Clock, typename _Dur1,
 
  610         typename _Rep2, typename _Period2>
 
  611       constexpr time_point<_Clock,
 
  612    typename common_type<_Dur1, duration<_Rep2, _Period2>>::type>
 
  613       operator+(const time_point<_Clock, _Dur1>& __lhs,
 
  614        const duration<_Rep2, _Period2>& __rhs)
 
  616    typedef duration<_Rep2, _Period2>           __dur2;
 
  617    typedef typename common_type<_Dur1,__dur2>::type    __ct;
 
  618    typedef time_point<_Clock, __ct>            __time_point;
 
  619    return __time_point(__lhs.time_since_epoch() + __rhs);
 
  622     template<typename _Rep1, typename _Period1,
 
  623         typename _Clock, typename _Dur2>
 
  624       constexpr time_point<_Clock,
 
  625    typename common_type<duration<_Rep1, _Period1>, _Dur2>::type>
 
  626       operator+(const duration<_Rep1, _Period1>& __lhs,
 
  627        const time_point<_Clock, _Dur2>& __rhs)
 
  629    typedef duration<_Rep1, _Period1>           __dur1;
 
  630    typedef typename common_type<__dur1,_Dur2>::type    __ct;
 
  631    typedef time_point<_Clock, __ct>            __time_point;
 
  632    return __time_point(__rhs.time_since_epoch() + __lhs); 
 
  635     template<typename _Clock, typename _Dur1,
 
  636         typename _Rep2, typename _Period2>
 
  637       constexpr time_point<_Clock,
 
  638    typename common_type<_Dur1, duration<_Rep2, _Period2>>::type>
 
  639       operator-(const time_point<_Clock, _Dur1>& __lhs,
 
  640        const duration<_Rep2, _Period2>& __rhs)
 
  642    typedef duration<_Rep2, _Period2>           __dur2;
 
  643    typedef typename common_type<_Dur1,__dur2>::type    __ct;
 
  644    typedef time_point<_Clock, __ct>            __time_point;
 
  645    return __time_point(__lhs.time_since_epoch() -__rhs); 
 
  648     template<typename _Clock, typename _Dur1, typename _Dur2>
 
  649       constexpr typename common_type<_Dur1, _Dur2>::type
 
  650       operator-(const time_point<_Clock, _Dur1>& __lhs,
 
  651        const time_point<_Clock, _Dur2>& __rhs)
 
  652       { return __lhs.time_since_epoch() - __rhs.time_since_epoch(); }
 
  654     template<typename _Clock, typename _Dur1, typename _Dur2>
 
  656       operator==(const time_point<_Clock, _Dur1>& __lhs,
 
  657         const time_point<_Clock, _Dur2>& __rhs)
 
  658       { return __lhs.time_since_epoch() == __rhs.time_since_epoch(); }
 
  660     template<typename _Clock, typename _Dur1, typename _Dur2>
 
  662       operator!=(const time_point<_Clock, _Dur1>& __lhs,
 
  663         const time_point<_Clock, _Dur2>& __rhs)
 
  664       { return !(__lhs == __rhs); }
 
  666     template<typename _Clock, typename _Dur1, typename _Dur2>
 
  668       operator<(const time_point<_Clock, _Dur1>& __lhs,
 
  669        const time_point<_Clock, _Dur2>& __rhs)
 
  670       { return  __lhs.time_since_epoch() < __rhs.time_since_epoch(); }
 
  672     template<typename _Clock, typename _Dur1, typename _Dur2>
 
  674       operator<=(const time_point<_Clock, _Dur1>& __lhs,
 
  675         const time_point<_Clock, _Dur2>& __rhs)
 
  676       { return !(__rhs < __lhs); }
 
  678     template<typename _Clock, typename _Dur1, typename _Dur2>
 
  680       operator>(const time_point<_Clock, _Dur1>& __lhs,
 
  681        const time_point<_Clock, _Dur2>& __rhs)
 
  682       { return __rhs < __lhs; }
 
  684     template<typename _Clock, typename _Dur1, typename _Dur2>
 
  686       operator>=(const time_point<_Clock, _Dur1>& __lhs,
 
  687         const time_point<_Clock, _Dur2>& __rhs)
 
  688       { return !(__lhs < __rhs); }
 
  693     // Why nanosecond resolution as the default?  
 
  694     // Why have std::system_clock always count in the higest
 
  695     // resolution (ie nanoseconds), even if on some OSes the low 3
 
  696     // or 9 decimal digits will be always zero? This allows later
 
  697     // implementations to change the system_clock::now()
 
  698     // implementation any time to provide better resolution without
 
  699     // changing function signature or units.
 
  701     // To support the (forward) evolution of the library's defined
 
  702     // clocks, wrap inside inline namespace so that the current
 
  703     // defintions of system_clock, steady_clock, and
 
  704     // high_resolution_clock types are uniquely mangled. This way, new
 
  705     // code can use the latests clocks, while the library can contain
 
  706     // compatibility definitions for previous versions.  At some
 
  707     // point, when these clocks settle down, the inlined namespaces
 
  708     // can be removed.  XXX GLIBCXX_ABI Deprecated
 
  709     inline namespace _V2 {
 
  712      *  @brief System clock.
 
  714      *  Time returned represents wall time from the system-wide clock.
 
  718       typedef chrono::nanoseconds                  duration;
 
  719       typedef duration::rep                        rep;
 
  720       typedef duration::period                     period;
 
  721       typedef chrono::time_point<system_clock, duration>   time_point;
 
  723       static_assert(system_clock::duration::min()
 
  724            < system_clock::duration::zero(),
 
  725            "a clock's minimum duration cannot be less than its epoch");
 
  727       static constexpr bool is_steady = false;
 
  734       to_time_t(const time_point& __t) noexcept
 
  736    return std::time_t(duration_cast<chrono::seconds>
 
  737               (__t.time_since_epoch()).count());
 
  741       from_time_t(std::time_t __t) noexcept
 
  743    typedef chrono::time_point<system_clock, seconds>   __from;
 
  744    return time_point_cast<system_clock::duration>
 
  745           (__from(chrono::seconds(__t)));
 
  751      *  @brief Monotonic clock
 
  753      *  Time returned has the property of only increasing at a uniform rate.
 
  757       typedef chrono::nanoseconds              duration;
 
  758       typedef duration::rep                    rep;
 
  759       typedef duration::period                 period;
 
  760       typedef chrono::time_point<steady_clock, duration>   time_point;
 
  762       static constexpr bool is_steady = true;
 
  770      *  @brief Highest-resolution clock
 
  772      *  This is the clock "with the shortest tick period." Alias to
 
  773      *  std::system_clock until higher-than-nanosecond definitions
 
  776     using high_resolution_clock = system_clock;
 
  778     } // end inline namespace _V2
 
  780   _GLIBCXX_END_NAMESPACE_VERSION
 
  781   } // namespace chrono
 
  783 #if __cplusplus > 201103L
 
  785 #define __cpp_lib_chrono_udls 201304
 
  787   inline namespace literals
 
  789   inline namespace chrono_literals
 
  792     namespace __select_type
 
  795       using namespace __parse_int;
 
  797       template<unsigned long long _Val, typename _Dur>
 
  800        _Val <= static_cast<unsigned long long>
 
  801              (numeric_limits<typename _Dur::rep>::max()),
 
  804      static constexpr typename _Select_type::type
 
  805        value{static_cast<typename _Select_type::type>(_Val)};
 
  808       template<unsigned long long _Val, typename _Dur>
 
  809    constexpr typename _Select_type<_Val, _Dur>::type
 
  810    _Select_type<_Val, _Dur>::value;
 
  814     constexpr chrono::duration<long double, ratio<3600,1>>
 
  815     operator""h(long double __hours)
 
  816     { return chrono::duration<long double, ratio<3600,1>>{__hours}; }
 
  818     template <char... _Digits>
 
  820       __select_type::_Select_type<__select_int::_Select_int<_Digits...>::value,
 
  824    return __select_type::_Select_type<
 
  825              __select_int::_Select_int<_Digits...>::value,
 
  826              chrono::hours>::value;
 
  829     constexpr chrono::duration<long double, ratio<60,1>>
 
  830     operator""min(long double __mins)
 
  831     { return chrono::duration<long double, ratio<60,1>>{__mins}; }
 
  833     template <char... _Digits>
 
  835       __select_type::_Select_type<__select_int::_Select_int<_Digits...>::value,
 
  836                 chrono::minutes>::type
 
  839    return __select_type::_Select_type<
 
  840              __select_int::_Select_int<_Digits...>::value,
 
  841              chrono::minutes>::value;
 
  844     constexpr chrono::duration<long double>
 
  845     operator""s(long double __secs)
 
  846     { return chrono::duration<long double>{__secs}; }
 
  848     template <char... _Digits>
 
  850       __select_type::_Select_type<__select_int::_Select_int<_Digits...>::value,
 
  851                 chrono::seconds>::type
 
  854    return __select_type::_Select_type<
 
  855              __select_int::_Select_int<_Digits...>::value,
 
  856              chrono::seconds>::value;
 
  859     constexpr chrono::duration<long double, milli>
 
  860     operator""ms(long double __msecs)
 
  861     { return chrono::duration<long double, milli>{__msecs}; }
 
  863     template <char... _Digits>
 
  865       __select_type::_Select_type<__select_int::_Select_int<_Digits...>::value,
 
  866                 chrono::milliseconds>::type
 
  869    return __select_type::_Select_type<
 
  870              __select_int::_Select_int<_Digits...>::value,
 
  871              chrono::milliseconds>::value;
 
  874     constexpr chrono::duration<long double, micro>
 
  875     operator""us(long double __usecs)
 
  876     { return chrono::duration<long double, micro>{__usecs}; }
 
  878     template <char... _Digits>
 
  880       __select_type::_Select_type<__select_int::_Select_int<_Digits...>::value,
 
  881                 chrono::microseconds>::type
 
  884    return __select_type::_Select_type<
 
  885              __select_int::_Select_int<_Digits...>::value,
 
  886              chrono::microseconds>::value;
 
  889     constexpr chrono::duration<long double, nano>
 
  890     operator""ns(long double __nsecs)
 
  891     { return chrono::duration<long double, nano>{__nsecs}; }
 
  893     template <char... _Digits>
 
  895       __select_type::_Select_type<__select_int::_Select_int<_Digits...>::value,
 
  896                 chrono::nanoseconds>::type
 
  899    return __select_type::_Select_type<
 
  900              __select_int::_Select_int<_Digits...>::value,
 
  901              chrono::nanoseconds>::value;
 
  904   } // inline namespace chrono_literals
 
  905   } // inline namespace literals
 
  907 #endif // __cplusplus > 201103L
 
  912 #endif //_GLIBCXX_USE_C99_STDINT_TR1
 
  916 #endif //_GLIBCXX_CHRONO