381 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			381 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
//  duration.hpp  --------------------------------------------------------------//
 | 
						|
 | 
						|
//  Copyright 2008 Howard Hinnant
 | 
						|
//  Copyright 2008 Beman Dawes
 | 
						|
//  Copyright 2009-2012 Vicente J. Botet Escriba
 | 
						|
 | 
						|
//  Distributed under the Boost Software License, Version 1.0.
 | 
						|
//  See http://www.boost.org/LICENSE_1_0.txt
 | 
						|
 | 
						|
/*
 | 
						|
 | 
						|
This code was derived by Beman Dawes from Howard Hinnant's time2_demo prototype.
 | 
						|
Many thanks to Howard for making his code available under the Boost license.
 | 
						|
The original code was modified to conform to Boost conventions and to section
 | 
						|
20.9 Time utilities [time] of the C++ committee's working paper N2798.
 | 
						|
See http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2798.pdf.
 | 
						|
 | 
						|
time2_demo contained this comment:
 | 
						|
 | 
						|
    Much thanks to Andrei Alexandrescu,
 | 
						|
                   Walter Brown,
 | 
						|
                   Peter Dimov,
 | 
						|
                   Jeff Garland,
 | 
						|
                   Terry Golubiewski,
 | 
						|
                   Daniel Krugler,
 | 
						|
                   Anthony Williams.
 | 
						|
*/
 | 
						|
 | 
						|
 | 
						|
#ifndef BOOST_CHRONO_TIME_POINT_HPP
 | 
						|
#define BOOST_CHRONO_TIME_POINT_HPP
 | 
						|
 | 
						|
#include <boost/chrono/duration.hpp>
 | 
						|
#include <iostream>
 | 
						|
 | 
						|
#ifndef BOOST_CHRONO_HEADER_ONLY
 | 
						|
// this must occur after all of the includes and before any code appears:
 | 
						|
#include <boost/config/abi_prefix.hpp> // must be the last #include
 | 
						|
#endif
 | 
						|
 | 
						|
//----------------------------------------------------------------------------//
 | 
						|
//                                                                            //
 | 
						|
//                        20.9 Time utilities [time]                          //
 | 
						|
//                                 synopsis                                   //
 | 
						|
//                                                                            //
 | 
						|
//----------------------------------------------------------------------------//
 | 
						|
 | 
						|
namespace boost {
 | 
						|
namespace chrono {
 | 
						|
 | 
						|
  template <class Clock, class Duration = typename Clock::duration>
 | 
						|
    class time_point;
 | 
						|
 | 
						|
 | 
						|
} // namespace chrono
 | 
						|
 | 
						|
 | 
						|
// common_type trait specializations
 | 
						|
 | 
						|
template <class Clock, class Duration1, class Duration2>
 | 
						|
  struct common_type<chrono::time_point<Clock, Duration1>,
 | 
						|
                     chrono::time_point<Clock, Duration2> >;
 | 
						|
 | 
						|
 | 
						|
//----------------------------------------------------------------------------//
 | 
						|
//      20.9.2.3 Specializations of common_type [time.traits.specializations] //
 | 
						|
//----------------------------------------------------------------------------//
 | 
						|
 | 
						|
 | 
						|
template <class Clock, class Duration1, class Duration2>
 | 
						|
struct common_type<chrono::time_point<Clock, Duration1>,
 | 
						|
                   chrono::time_point<Clock, Duration2> >
 | 
						|
{
 | 
						|
  typedef chrono::time_point<Clock,
 | 
						|
    typename common_type<Duration1, Duration2>::type> type;
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
 | 
						|
namespace chrono {
 | 
						|
 | 
						|
    // time_point arithmetic
 | 
						|
    template <class Clock, class Duration1, class Rep2, class Period2>
 | 
						|
    inline BOOST_CONSTEXPR
 | 
						|
    time_point<Clock,
 | 
						|
        typename common_type<Duration1, duration<Rep2, Period2> >::type>
 | 
						|
    operator+(
 | 
						|
            const time_point<Clock, Duration1>& lhs,
 | 
						|
            const duration<Rep2, Period2>& rhs);
 | 
						|
    template <class Rep1, class Period1, class Clock, class Duration2>
 | 
						|
    inline BOOST_CONSTEXPR
 | 
						|
    time_point<Clock,
 | 
						|
        typename common_type<duration<Rep1, Period1>, Duration2>::type>
 | 
						|
    operator+(
 | 
						|
            const duration<Rep1, Period1>& lhs,
 | 
						|
            const time_point<Clock, Duration2>& rhs);
 | 
						|
    template <class Clock, class Duration1, class Rep2, class Period2>
 | 
						|
    inline BOOST_CONSTEXPR
 | 
						|
    time_point<Clock,
 | 
						|
        typename common_type<Duration1, duration<Rep2, Period2> >::type>
 | 
						|
    operator-(
 | 
						|
            const time_point<Clock, Duration1>& lhs,
 | 
						|
            const duration<Rep2, Period2>& rhs);
 | 
						|
    template <class Clock, class Duration1, class Duration2>
 | 
						|
    inline BOOST_CONSTEXPR
 | 
						|
    typename common_type<Duration1, Duration2>::type
 | 
						|
    operator-(
 | 
						|
            const time_point<Clock, Duration1>& lhs,
 | 
						|
            const time_point<Clock,
 | 
						|
            Duration2>& rhs);
 | 
						|
 | 
						|
    // time_point comparisons
 | 
						|
    template <class Clock, class Duration1, class Duration2>
 | 
						|
    inline BOOST_CONSTEXPR
 | 
						|
    bool operator==(
 | 
						|
          const time_point<Clock, Duration1>& lhs,
 | 
						|
          const time_point<Clock, Duration2>& rhs);
 | 
						|
    template <class Clock, class Duration1, class Duration2>
 | 
						|
    inline BOOST_CONSTEXPR
 | 
						|
    bool operator!=(
 | 
						|
          const time_point<Clock, Duration1>& lhs,
 | 
						|
          const time_point<Clock, Duration2>& rhs);
 | 
						|
    template <class Clock, class Duration1, class Duration2>
 | 
						|
    inline BOOST_CONSTEXPR
 | 
						|
    bool operator< (
 | 
						|
          const time_point<Clock, Duration1>& lhs,
 | 
						|
          const time_point<Clock, Duration2>& rhs);
 | 
						|
    template <class Clock, class Duration1, class Duration2>
 | 
						|
    inline BOOST_CONSTEXPR
 | 
						|
    bool operator<=(
 | 
						|
          const time_point<Clock, Duration1>& lhs,
 | 
						|
          const time_point<Clock, Duration2>& rhs);
 | 
						|
    template <class Clock, class Duration1, class Duration2>
 | 
						|
    inline BOOST_CONSTEXPR
 | 
						|
    bool operator> (
 | 
						|
          const time_point<Clock, Duration1>& lhs,
 | 
						|
          const time_point<Clock, Duration2>& rhs);
 | 
						|
    template <class Clock, class Duration1, class Duration2>
 | 
						|
    inline BOOST_CONSTEXPR
 | 
						|
    bool operator>=(
 | 
						|
          const time_point<Clock, Duration1>& lhs,
 | 
						|
          const time_point<Clock, Duration2>& rhs);
 | 
						|
 | 
						|
    // time_point_cast
 | 
						|
    template <class ToDuration, class Clock, class Duration>
 | 
						|
    inline BOOST_CONSTEXPR
 | 
						|
    time_point<Clock, ToDuration> time_point_cast(const time_point<Clock, Duration>& t);
 | 
						|
 | 
						|
//----------------------------------------------------------------------------//
 | 
						|
//                                                                            //
 | 
						|
//      20.9.4 Class template time_point [time.point]                         //
 | 
						|
//                                                                            //
 | 
						|
//----------------------------------------------------------------------------//
 | 
						|
 | 
						|
    template <class Clock, class Duration>
 | 
						|
    class time_point
 | 
						|
    {
 | 
						|
        BOOST_CHRONO_STATIC_ASSERT(boost::chrono::detail::is_duration<Duration>::value,
 | 
						|
                BOOST_CHRONO_SECOND_TEMPLATE_PARAMETER_OF_TIME_POINT_MUST_BE_A_BOOST_CHRONO_DURATION, (Duration));
 | 
						|
    public:
 | 
						|
        typedef Clock                     clock;
 | 
						|
        typedef Duration                  duration;
 | 
						|
        typedef typename duration::rep    rep;
 | 
						|
        typedef typename duration::period period;
 | 
						|
        typedef Duration                  difference_type;
 | 
						|
 | 
						|
    private:
 | 
						|
        duration d_;
 | 
						|
 | 
						|
    public:
 | 
						|
        BOOST_FORCEINLINE BOOST_CONSTEXPR
 | 
						|
        time_point() : d_(duration::zero())
 | 
						|
        {}
 | 
						|
        BOOST_FORCEINLINE BOOST_CONSTEXPR
 | 
						|
        explicit time_point(const duration& d)
 | 
						|
            : d_(d)
 | 
						|
        {}
 | 
						|
 | 
						|
        // conversions
 | 
						|
        template <class Duration2>
 | 
						|
        BOOST_FORCEINLINE BOOST_CONSTEXPR
 | 
						|
        time_point(const time_point<clock, Duration2>& t
 | 
						|
                , typename boost::enable_if
 | 
						|
                <
 | 
						|
                    boost::is_convertible<Duration2, duration>
 | 
						|
                >::type* = 0
 | 
						|
        )
 | 
						|
            : d_(t.time_since_epoch())
 | 
						|
        {
 | 
						|
        }
 | 
						|
        // observer
 | 
						|
 | 
						|
        BOOST_CONSTEXPR
 | 
						|
        duration time_since_epoch() const
 | 
						|
        {
 | 
						|
            return d_;
 | 
						|
        }
 | 
						|
 | 
						|
        // arithmetic
 | 
						|
 | 
						|
#ifdef BOOST_CHRONO_EXTENSIONS
 | 
						|
        BOOST_CONSTEXPR
 | 
						|
        time_point  operator+() const {return *this;}
 | 
						|
        BOOST_CONSTEXPR
 | 
						|
        time_point  operator-() const {return time_point(-d_);}
 | 
						|
        time_point& operator++()      {++d_; return *this;}
 | 
						|
        time_point  operator++(int)   {return time_point(d_++);}
 | 
						|
        time_point& operator--()      {--d_; return *this;}
 | 
						|
        time_point  operator--(int)   {return time_point(d_--);}
 | 
						|
 | 
						|
        time_point& operator+=(const rep& r) {d_ += duration(r); return *this;}
 | 
						|
        time_point& operator-=(const rep& r) {d_ -= duration(r); return *this;}
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
        time_point& operator+=(const duration& d) {d_ += d; return *this;}
 | 
						|
        time_point& operator-=(const duration& d) {d_ -= d; return *this;}
 | 
						|
 | 
						|
        // special values
 | 
						|
 | 
						|
        static BOOST_CHRONO_LIB_CONSTEXPR time_point
 | 
						|
        min BOOST_PREVENT_MACRO_SUBSTITUTION ()
 | 
						|
        {
 | 
						|
            return time_point((duration::min)());
 | 
						|
        }
 | 
						|
        static BOOST_CHRONO_LIB_CONSTEXPR time_point
 | 
						|
        max BOOST_PREVENT_MACRO_SUBSTITUTION ()
 | 
						|
        {
 | 
						|
            return time_point((duration::max)());
 | 
						|
        }
 | 
						|
    };
 | 
						|
 | 
						|
//----------------------------------------------------------------------------//
 | 
						|
//      20.9.4.5 time_point non-member arithmetic [time.point.nonmember]      //
 | 
						|
//----------------------------------------------------------------------------//
 | 
						|
 | 
						|
    // time_point operator+(time_point x, duration y);
 | 
						|
 | 
						|
    template <class Clock, class Duration1, class Rep2, class Period2>
 | 
						|
    inline BOOST_CONSTEXPR
 | 
						|
    time_point<Clock,
 | 
						|
        typename common_type<Duration1, duration<Rep2, Period2> >::type>
 | 
						|
    operator+(const time_point<Clock, Duration1>& lhs,
 | 
						|
            const duration<Rep2, Period2>& rhs)
 | 
						|
    {
 | 
						|
      typedef typename common_type<Duration1, duration<Rep2, Period2> >::type CDuration;
 | 
						|
      typedef time_point<
 | 
						|
          Clock,
 | 
						|
          CDuration
 | 
						|
      > TimeResult;
 | 
						|
        return TimeResult(lhs.time_since_epoch() + CDuration(rhs));
 | 
						|
    }
 | 
						|
 | 
						|
    // time_point operator+(duration x, time_point y);
 | 
						|
 | 
						|
    template <class Rep1, class Period1, class Clock, class Duration2>
 | 
						|
    inline BOOST_CONSTEXPR
 | 
						|
    time_point<Clock,
 | 
						|
        typename common_type<duration<Rep1, Period1>, Duration2>::type>
 | 
						|
    operator+(const duration<Rep1, Period1>& lhs,
 | 
						|
            const time_point<Clock, Duration2>& rhs)
 | 
						|
    {
 | 
						|
        return rhs + lhs;
 | 
						|
    }
 | 
						|
 | 
						|
    // time_point operator-(time_point x, duration y);
 | 
						|
 | 
						|
    template <class Clock, class Duration1, class Rep2, class Period2>
 | 
						|
    inline BOOST_CONSTEXPR
 | 
						|
    time_point<Clock,
 | 
						|
        typename common_type<Duration1, duration<Rep2, Period2> >::type>
 | 
						|
    operator-(const time_point<Clock, Duration1>& lhs,
 | 
						|
            const duration<Rep2, Period2>& rhs)
 | 
						|
    {
 | 
						|
        return lhs + (-rhs);
 | 
						|
    }
 | 
						|
 | 
						|
    // duration operator-(time_point x, time_point y);
 | 
						|
 | 
						|
    template <class Clock, class Duration1, class Duration2>
 | 
						|
    inline BOOST_CONSTEXPR
 | 
						|
    typename common_type<Duration1, Duration2>::type
 | 
						|
    operator-(const time_point<Clock, Duration1>& lhs,
 | 
						|
            const time_point<Clock, Duration2>& rhs)
 | 
						|
    {
 | 
						|
        return lhs.time_since_epoch() - rhs.time_since_epoch();
 | 
						|
    }
 | 
						|
 | 
						|
//----------------------------------------------------------------------------//
 | 
						|
//      20.9.4.6 time_point comparisons [time.point.comparisons]              //
 | 
						|
//----------------------------------------------------------------------------//
 | 
						|
 | 
						|
    // time_point ==
 | 
						|
 | 
						|
    template <class Clock, class Duration1, class Duration2>
 | 
						|
    inline BOOST_CONSTEXPR
 | 
						|
    bool
 | 
						|
    operator==(const time_point<Clock, Duration1>& lhs,
 | 
						|
             const time_point<Clock, Duration2>& rhs)
 | 
						|
    {
 | 
						|
        return lhs.time_since_epoch() == rhs.time_since_epoch();
 | 
						|
    }
 | 
						|
 | 
						|
    // time_point !=
 | 
						|
 | 
						|
    template <class Clock, class Duration1, class Duration2>
 | 
						|
    inline BOOST_CONSTEXPR
 | 
						|
    bool
 | 
						|
    operator!=(const time_point<Clock, Duration1>& lhs,
 | 
						|
             const time_point<Clock, Duration2>& rhs)
 | 
						|
    {
 | 
						|
        return !(lhs == rhs);
 | 
						|
    }
 | 
						|
 | 
						|
    // time_point <
 | 
						|
 | 
						|
    template <class Clock, class Duration1, class Duration2>
 | 
						|
    inline BOOST_CONSTEXPR
 | 
						|
    bool
 | 
						|
    operator<(const time_point<Clock, Duration1>& lhs,
 | 
						|
            const time_point<Clock, Duration2>& rhs)
 | 
						|
    {
 | 
						|
        return lhs.time_since_epoch() < rhs.time_since_epoch();
 | 
						|
    }
 | 
						|
 | 
						|
    // time_point >
 | 
						|
 | 
						|
    template <class Clock, class Duration1, class Duration2>
 | 
						|
    inline BOOST_CONSTEXPR
 | 
						|
    bool
 | 
						|
    operator>(const time_point<Clock, Duration1>& lhs,
 | 
						|
            const time_point<Clock, Duration2>& rhs)
 | 
						|
    {
 | 
						|
        return rhs < lhs;
 | 
						|
    }
 | 
						|
 | 
						|
    // time_point <=
 | 
						|
 | 
						|
    template <class Clock, class Duration1, class Duration2>
 | 
						|
    inline BOOST_CONSTEXPR
 | 
						|
    bool
 | 
						|
    operator<=(const time_point<Clock, Duration1>& lhs,
 | 
						|
             const time_point<Clock, Duration2>& rhs)
 | 
						|
    {
 | 
						|
        return !(rhs < lhs);
 | 
						|
    }
 | 
						|
 | 
						|
    // time_point >=
 | 
						|
 | 
						|
    template <class Clock, class Duration1, class Duration2>
 | 
						|
    inline BOOST_CONSTEXPR
 | 
						|
    bool
 | 
						|
    operator>=(const time_point<Clock, Duration1>& lhs,
 | 
						|
             const time_point<Clock, Duration2>& rhs)
 | 
						|
    {
 | 
						|
        return !(lhs < rhs);
 | 
						|
    }
 | 
						|
 | 
						|
//----------------------------------------------------------------------------//
 | 
						|
//      20.9.4.7 time_point_cast [time.point.cast]                            //
 | 
						|
//----------------------------------------------------------------------------//
 | 
						|
 | 
						|
    template <class ToDuration, class Clock, class Duration>
 | 
						|
    inline BOOST_CONSTEXPR
 | 
						|
    time_point<Clock, ToDuration>
 | 
						|
    time_point_cast(const time_point<Clock, Duration>& t)
 | 
						|
    {
 | 
						|
        return time_point<Clock, ToDuration>(
 | 
						|
                duration_cast<ToDuration>(t.time_since_epoch()));
 | 
						|
    }
 | 
						|
 | 
						|
} // namespace chrono
 | 
						|
} // namespace boost
 | 
						|
 | 
						|
#ifndef BOOST_CHRONO_HEADER_ONLY
 | 
						|
// the suffix header occurs after all of our code:
 | 
						|
#include <boost/config/abi_suffix.hpp> // pops abi_prefix.hpp pragmas
 | 
						|
#endif
 | 
						|
 | 
						|
#endif // BOOST_CHRONO_TIME_POINT_HPP
 |