Chris@16: // boost/chrono/process_cpu_clocks.hpp -----------------------------------------------------------// Chris@16: Chris@16: // Copyright 2009-2011 Vicente J. Botet Escriba Chris@101: // Copyright (c) Microsoft Corporation 2014 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: // See http://www.boost.org/libs/system for documentation. Chris@16: Chris@16: #ifndef BOOST_CHRONO_PROCESS_CPU_CLOCKS_HPP Chris@16: #define BOOST_CHRONO_PROCESS_CPU_CLOCKS_HPP Chris@16: Chris@16: #include Chris@16: Chris@16: Chris@16: #if defined(BOOST_CHRONO_HAS_PROCESS_CLOCKS) Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #ifndef BOOST_CHRONO_HEADER_ONLY Chris@16: #include // must be the last #include Chris@16: #endif Chris@16: Chris@16: namespace boost { namespace chrono { Chris@16: Chris@16: class BOOST_CHRONO_DECL process_real_cpu_clock { Chris@16: public: Chris@16: typedef nanoseconds duration; Chris@16: typedef duration::rep rep; Chris@16: typedef duration::period period; Chris@16: typedef chrono::time_point time_point; Chris@16: BOOST_STATIC_CONSTEXPR bool is_steady = true; Chris@16: Chris@16: static BOOST_CHRONO_INLINE time_point now() BOOST_NOEXCEPT; Chris@16: #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING Chris@16: static BOOST_CHRONO_INLINE time_point now(system::error_code & ec ); Chris@16: #endif Chris@16: }; Chris@16: Chris@101: #if ! BOOST_OS_WINDOWS || BOOST_PLAT_WINDOWS_DESKTOP Chris@16: class BOOST_CHRONO_DECL process_user_cpu_clock { Chris@16: public: Chris@16: typedef nanoseconds duration; Chris@16: typedef duration::rep rep; Chris@16: typedef duration::period period; Chris@16: typedef chrono::time_point time_point; Chris@16: BOOST_STATIC_CONSTEXPR bool is_steady = true; Chris@16: Chris@16: static BOOST_CHRONO_INLINE time_point now() BOOST_NOEXCEPT; Chris@16: #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING Chris@16: static BOOST_CHRONO_INLINE time_point now(system::error_code & ec ); Chris@16: #endif Chris@16: }; Chris@16: Chris@16: class BOOST_CHRONO_DECL process_system_cpu_clock { Chris@16: public: Chris@16: typedef nanoseconds duration; Chris@16: typedef duration::rep rep; Chris@16: typedef duration::period period; Chris@16: typedef chrono::time_point time_point; Chris@16: BOOST_STATIC_CONSTEXPR bool is_steady = true; Chris@16: Chris@16: static BOOST_CHRONO_INLINE time_point now() BOOST_NOEXCEPT; Chris@16: #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING Chris@16: static BOOST_CHRONO_INLINE time_point now(system::error_code & ec ); Chris@16: #endif Chris@16: }; Chris@101: #endif Chris@16: Chris@16: template Chris@16: struct process_times Chris@16: : arithmetic, Chris@16: multiplicative, Rep, Chris@16: less_than_comparable > > > Chris@16: { Chris@16: //typedef process_real_cpu_clock::rep rep; Chris@16: typedef Rep rep; Chris@16: process_times() Chris@16: : real(0) Chris@16: , user(0) Chris@16: , system(0){} Chris@101: Chris@101: #if ! defined BOOST_CHRONO_DONT_PROVIDES_DEPRECATED_IO_SINCE_V2_0_0 Chris@16: template Chris@16: explicit process_times( Chris@16: Rep2 r) Chris@16: : real(r) Chris@16: , user(r) Chris@16: , system(r){} Chris@101: #endif Chris@16: template Chris@16: explicit process_times( Chris@16: process_times const& rhs) Chris@16: : real(rhs.real) Chris@16: , user(rhs.user) Chris@16: , system(rhs.system){} Chris@16: process_times( Chris@16: rep r, Chris@16: rep u, Chris@16: rep s) Chris@16: : real(r) Chris@16: , user(u) Chris@16: , system(s){} Chris@16: Chris@16: rep real; // real (i.e wall clock) time Chris@16: rep user; // user cpu time Chris@16: rep system; // system cpu time Chris@16: Chris@101: #if ! defined BOOST_CHRONO_DONT_PROVIDES_DEPRECATED_IO_SINCE_V2_0_0 Chris@16: operator rep() const Chris@16: { Chris@16: return real; Chris@16: } Chris@101: #endif Chris@16: template Chris@16: bool operator==(process_times const& rhs) { Chris@16: return (real==rhs.real && Chris@16: user==rhs.user && Chris@16: system==rhs.system); Chris@16: } Chris@16: Chris@16: process_times& operator+=( Chris@16: process_times const& rhs) Chris@16: { Chris@16: real+=rhs.real; Chris@16: user+=rhs.user; Chris@16: system+=rhs.system; Chris@16: return *this; Chris@16: } Chris@16: process_times& operator-=( Chris@16: process_times const& rhs) Chris@16: { Chris@16: real-=rhs.real; Chris@16: user-=rhs.user; Chris@16: system-=rhs.system; Chris@16: return *this; Chris@16: } Chris@16: process_times& operator*=( Chris@16: process_times const& rhs) Chris@16: { Chris@16: real*=rhs.real; Chris@16: user*=rhs.user; Chris@16: system*=rhs.system; Chris@16: return *this; Chris@16: } Chris@16: process_times& operator*=(rep const& rhs) Chris@16: { Chris@16: real*=rhs; Chris@16: user*=rhs; Chris@16: system*=rhs; Chris@16: return *this; Chris@16: } Chris@16: process_times& operator/=(process_times const& rhs) Chris@16: { Chris@16: real/=rhs.real; Chris@16: user/=rhs.user; Chris@16: system/=rhs.system; Chris@16: return *this; Chris@16: } Chris@16: process_times& operator/=(rep const& rhs) Chris@16: { Chris@16: real/=rhs; Chris@16: user/=rhs; Chris@16: system/=rhs; Chris@16: return *this; Chris@16: } Chris@16: bool operator<(process_times const & rhs) const Chris@16: { Chris@16: if (real < rhs.real) return true; Chris@16: if (real > rhs.real) return false; Chris@16: if (user < rhs.user) return true; Chris@16: if (user > rhs.user) return false; Chris@16: if (system < rhs.system) return true; Chris@16: else return false; Chris@16: } Chris@16: Chris@16: template Chris@16: void print(std::basic_ostream& os) const Chris@16: { Chris@16: os << "{"<< real <<";"<< user <<";"<< system << "}"; Chris@16: } Chris@16: Chris@16: template Chris@101: void read(std::basic_istream& is) Chris@16: { Chris@16: typedef std::istreambuf_iterator in_iterator; Chris@16: in_iterator i(is); Chris@16: in_iterator e; Chris@16: if (i == e || *i != '{') // mandatory '{' Chris@16: { Chris@16: is.setstate(is.failbit | is.eofbit); Chris@16: return; Chris@16: } Chris@16: CharT x,y,z; Chris@16: is >> real >> x >> user >> y >> system >> z; Chris@16: if (!is.good() || (x != ';')|| (y != ';')|| (z != '}')) Chris@16: { Chris@16: is.setstate(is.failbit); Chris@16: } Chris@16: } Chris@16: }; Chris@16: } Chris@16: template Chris@16: struct common_type< Chris@16: chrono::process_times, Chris@16: chrono::process_times Chris@16: > Chris@16: { Chris@16: typedef chrono::process_times::type> type; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct common_type< Chris@16: chrono::process_times, Chris@16: Rep2 Chris@16: > Chris@16: { Chris@16: typedef chrono::process_times::type> type; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct common_type< Chris@16: Rep1, Chris@16: chrono::process_times Chris@16: > Chris@16: { Chris@16: typedef chrono::process_times::type> type; Chris@16: }; Chris@16: Chris@16: Chris@16: namespace chrono Chris@16: { Chris@16: template Chris@16: inline BOOST_CONSTEXPR Chris@16: bool Chris@16: operator==(const duration, Period1>& lhs, Chris@16: const duration, Period2>& rhs) Chris@16: { Chris@16: return boost::chrono::detail::duration_eq< Chris@16: duration, Period1>, duration, Period2> >()(lhs, rhs); Chris@16: } Chris@16: Chris@16: template Chris@16: inline BOOST_CONSTEXPR Chris@16: bool Chris@16: operator==(const duration, Period1>& lhs, Chris@16: const duration& rhs) Chris@16: { Chris@16: return boost::chrono::detail::duration_eq< Chris@16: duration, duration >()(duration(lhs.count().real), rhs); Chris@16: } Chris@16: Chris@16: template Chris@16: inline BOOST_CONSTEXPR Chris@16: bool Chris@16: operator==(const duration& lhs, Chris@16: const duration, Period2>& rhs) Chris@16: { Chris@16: return rhs == lhs; Chris@16: } Chris@16: Chris@16: Chris@16: // Duration < Chris@16: Chris@16: template Chris@16: inline BOOST_CONSTEXPR Chris@16: bool Chris@16: operator< (const duration, Period1>& lhs, Chris@16: const duration& rhs) Chris@16: { Chris@16: return boost::chrono::detail::duration_lt< Chris@16: duration, duration >()(duration(lhs.count().real), rhs); Chris@16: } Chris@16: Chris@16: template Chris@16: inline BOOST_CONSTEXPR Chris@16: bool Chris@16: operator< (const duration& lhs, Chris@16: const duration, Period2>& rhs) Chris@16: { Chris@16: return rhs < lhs; Chris@16: } Chris@16: Chris@16: template Chris@16: inline BOOST_CONSTEXPR Chris@16: bool Chris@16: operator< (const duration, Period1>& lhs, Chris@16: const duration, Period2>& rhs) Chris@16: { Chris@16: return boost::chrono::detail::duration_lt< Chris@16: duration, duration >()(lhs, rhs); Chris@16: } Chris@16: Chris@16: Chris@16: typedef process_times process_cpu_clock_times; Chris@101: #if ! BOOST_OS_WINDOWS || BOOST_PLAT_WINDOWS_DESKTOP Chris@16: class BOOST_CHRONO_DECL process_cpu_clock Chris@16: { Chris@16: public: Chris@16: Chris@16: typedef process_cpu_clock_times times; Chris@16: typedef boost::chrono::duration duration; Chris@16: typedef duration::rep rep; Chris@16: typedef duration::period period; Chris@16: typedef chrono::time_point time_point; Chris@16: BOOST_STATIC_CONSTEXPR bool is_steady = true; Chris@16: Chris@16: static BOOST_CHRONO_INLINE time_point now() BOOST_NOEXCEPT; Chris@16: #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING Chris@16: static BOOST_CHRONO_INLINE time_point now(system::error_code & ec ); Chris@16: #endif Chris@16: }; Chris@101: #endif Chris@16: Chris@16: template Chris@16: std::basic_ostream& Chris@16: operator<<(std::basic_ostream& os, Chris@16: process_times const& rhs) Chris@16: { Chris@16: rhs.print(os); Chris@16: return os; Chris@16: } Chris@16: Chris@16: template Chris@16: std::basic_istream& Chris@16: operator>>(std::basic_istream& is, Chris@101: process_times& rhs) Chris@16: { Chris@16: rhs.read(is); Chris@16: return is; Chris@16: } Chris@16: Chris@16: template Chris@16: struct duration_values > Chris@16: { Chris@16: typedef process_times Res; Chris@16: public: Chris@16: static Res zero() Chris@16: { Chris@16: return Res(); Chris@16: } Chris@16: static Res max BOOST_PREVENT_MACRO_SUBSTITUTION () Chris@16: { Chris@16: return Res((std::numeric_limits::max)(), Chris@16: (std::numeric_limits::max)(), Chris@16: (std::numeric_limits::max)()); Chris@16: } Chris@16: static Res min BOOST_PREVENT_MACRO_SUBSTITUTION () Chris@16: { Chris@16: return Res((std::numeric_limits::min)(), Chris@16: (std::numeric_limits::min)(), Chris@16: (std::numeric_limits::min)()); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct clock_string Chris@16: { Chris@16: static std::basic_string name() Chris@16: { Chris@16: static const CharT Chris@16: u[] = Chris@16: { 'p', 'r', 'o', 'c', 'e', 's', 's', '_', 'r', 'e', 'a', 'l', '_', 'c', 'l', 'o', 'c', 'k' }; Chris@16: static const std::basic_string str(u, u + sizeof(u) Chris@16: / sizeof(u[0])); Chris@16: return str; Chris@16: } Chris@16: static std::basic_string since() Chris@16: { Chris@16: const CharT Chris@16: u[] = Chris@16: { ' ', 's', 'i', 'n', 'c', 'e', ' ', 'p', 'r', 'o', 'c', 'e', 's', 's', ' ', 's', 't', 'a', 'r', 't', '-', 'u', 'p' }; Chris@16: const std::basic_string str(u, u + sizeof(u) / sizeof(u[0])); Chris@16: return str; Chris@16: } Chris@16: }; Chris@16: Chris@101: #if ! BOOST_OS_WINDOWS || BOOST_PLAT_WINDOWS_DESKTOP Chris@16: template Chris@16: struct clock_string Chris@16: { Chris@16: static std::basic_string name() Chris@16: { Chris@16: static const CharT Chris@16: u[] = Chris@16: { 'p', 'r', 'o', 'c', 'e', 's', 's', '_', 'u', 's', 'e', 'r', '_', 'c', 'l', 'o', 'c', 'k' }; Chris@16: static const std::basic_string str(u, u + sizeof(u) Chris@16: / sizeof(u[0])); Chris@16: return str; Chris@16: } Chris@16: static std::basic_string since() Chris@16: { Chris@16: const CharT Chris@16: u[] = Chris@16: { ' ', 's', 'i', 'n', 'c', 'e', ' ', 'p', 'r', 'o', 'c', 'e', 's', 's', ' ', 's', 't', 'a', 'r', 't', '-', 'u', 'p' }; Chris@16: const std::basic_string str(u, u + sizeof(u) / sizeof(u[0])); Chris@16: return str; Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct clock_string Chris@16: { Chris@16: static std::basic_string name() Chris@16: { Chris@16: static const CharT Chris@16: u[] = Chris@16: { 'p', 'r', 'o', 'c', 'e', 's', 's', '_', 's', 'y', 's', 't', 't', 'e', 'm', '_', 'c', 'l', 'o', 'c', 'k' }; Chris@16: static const std::basic_string str(u, u + sizeof(u) Chris@16: / sizeof(u[0])); Chris@16: return str; Chris@16: } Chris@16: static std::basic_string since() Chris@16: { Chris@16: const CharT Chris@16: u[] = Chris@16: { ' ', 's', 'i', 'n', 'c', 'e', ' ', 'p', 'r', 'o', 'c', 'e', 's', 's', ' ', 's', 't', 'a', 'r', 't', '-', 'u', 'p' }; Chris@16: const std::basic_string str(u, u + sizeof(u) / sizeof(u[0])); Chris@16: return str; Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct clock_string Chris@16: { Chris@16: static std::basic_string name() Chris@16: { Chris@16: static const CharT u[] = Chris@16: { 'p', 'r', 'o', 'c', 'e', 's', 's', '_', 'c', 'l', 'o', 'c', 'k' }; Chris@16: static const std::basic_string str(u, u + sizeof(u) Chris@16: / sizeof(u[0])); Chris@16: return str; Chris@16: } Chris@16: static std::basic_string since() Chris@16: { Chris@16: const CharT Chris@16: u[] = Chris@16: { ' ', 's', 'i', 'n', 'c', 'e', ' ', 'p', 'r', 'o', 'c', 'e', 's', 's', ' ', 's', 't', 'a', 'r', 't', '-', 'u', 'p' }; Chris@16: const std::basic_string str(u, u + sizeof(u) / sizeof(u[0])); Chris@16: return str; Chris@16: } Chris@16: }; Chris@101: #endif Chris@16: Chris@16: } // namespace chrono Chris@16: } // namespace boost Chris@16: Chris@16: namespace std { Chris@16: Chris@16: template Chris@16: struct numeric_limits > Chris@16: { Chris@16: typedef boost::chrono::process_times Res; Chris@16: Chris@16: public: Chris@16: static const bool is_specialized = true; Chris@16: static Res min BOOST_PREVENT_MACRO_SUBSTITUTION () Chris@16: { Chris@16: return Res((std::numeric_limits::min)(), Chris@16: (std::numeric_limits::min)(), Chris@16: (std::numeric_limits::min)()); Chris@16: } Chris@16: static Res max BOOST_PREVENT_MACRO_SUBSTITUTION () Chris@16: { Chris@16: return Res((std::numeric_limits::max)(), Chris@16: (std::numeric_limits::max)(), Chris@16: (std::numeric_limits::max)()); Chris@16: } Chris@16: static Res lowest() throw() Chris@16: { Chris@16: return (min)(); Chris@16: } Chris@16: static const int digits = std::numeric_limits::digits+ Chris@16: std::numeric_limits::digits+ Chris@16: std::numeric_limits::digits; Chris@16: static const int digits10 = std::numeric_limits::digits10+ Chris@16: std::numeric_limits::digits10+ Chris@16: std::numeric_limits::digits10; Chris@16: static const bool is_signed = Rep::is_signed; Chris@16: static const bool is_integer = Rep::is_integer; Chris@16: static const bool is_exact = Rep::is_exact; Chris@16: static const int radix = 0; Chris@16: //~ static Res epsilon() throw() { return 0; } Chris@16: //~ static Res round_error() throw() { return 0; } Chris@16: //~ static const int min_exponent = 0; Chris@16: //~ static const int min_exponent10 = 0; Chris@16: //~ static const int max_exponent = 0; Chris@16: //~ static const int max_exponent10 = 0; Chris@16: //~ static const bool has_infinity = false; Chris@16: //~ static const bool has_quiet_NaN = false; Chris@16: //~ static const bool has_signaling_NaN = false; Chris@16: //~ static const float_denorm_style has_denorm = denorm_absent; Chris@16: //~ static const bool has_denorm_loss = false; Chris@16: //~ static Res infinity() throw() { return 0; } Chris@16: //~ static Res quiet_NaN() throw() { return 0; } Chris@16: //~ static Res signaling_NaN() throw() { return 0; } Chris@16: //~ static Res denorm_min() throw() { return 0; } Chris@16: //~ static const bool is_iec559 = false; Chris@16: //~ static const bool is_bounded = true; Chris@16: //~ static const bool is_modulo = false; Chris@16: //~ static const bool traps = false; Chris@16: //~ static const bool tinyness_before = false; Chris@16: //~ static const float_round_style round_style = round_toward_zero; Chris@16: Chris@16: }; Chris@16: } Chris@16: Chris@16: #ifndef BOOST_CHRONO_HEADER_ONLY Chris@16: #include // pops abi_prefix.hpp pragmas Chris@16: #else Chris@16: #include Chris@16: #endif Chris@16: #endif Chris@16: Chris@16: #endif // BOOST_CHRONO_PROCESS_CPU_CLOCKS_HPP