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