Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r74488 - trunk/boost/chrono
From: vicente.botet_at_[hidden]
Date: 2011-09-21 13:00:43


Author: viboes
Date: 2011-09-21 13:00:43 EDT (Wed, 21 Sep 2011)
New Revision: 74488
URL: http://svn.boost.org/trac/boost/changeset/74488

Log:
Chrono: refactor process_cpu_clock_times into a template class so we can cast changingthe representation
Text files modified:
   trunk/boost/chrono/process_cpu_clocks.hpp | 232 ++++++++++++++++++++++++++-------------
   1 files changed, 152 insertions(+), 80 deletions(-)

Modified: trunk/boost/chrono/process_cpu_clocks.hpp
==============================================================================
--- trunk/boost/chrono/process_cpu_clocks.hpp (original)
+++ trunk/boost/chrono/process_cpu_clocks.hpp 2011-09-21 13:00:43 EDT (Wed, 21 Sep 2011)
@@ -20,6 +20,7 @@
 #include <boost/operators.hpp>
 #include <boost/chrono/detail/system.hpp>
 #include <iostream>
+#include <boost/type_traits/common_type.hpp>
 
 
 #ifndef BOOST_CHRONO_HEADER_ONLY
@@ -64,89 +65,99 @@
         static BOOST_CHRONO_INLINE time_point now(system::error_code & ec );
     };
 
- struct process_cpu_clock_times
- : arithmetic<process_cpu_clock_times,
- multiplicative<process_cpu_clock_times, process_real_cpu_clock::rep,
- less_than_comparable<process_cpu_clock_times> > >
+ template <typename Rep>
+ struct process_times
+ : arithmetic<process_times<Rep>,
+ multiplicative<process_times<Rep>, Rep,
+ less_than_comparable<process_times<Rep> > > >
         {
- typedef process_real_cpu_clock::rep rep;
- process_cpu_clock_times()
+ //typedef process_real_cpu_clock::rep rep;
+ typedef Rep rep;
+ process_times()
                 : real(0)
                 , user(0)
                 , system(0){}
- explicit process_cpu_clock_times(
- process_real_cpu_clock::rep r)
+ template <typename Rep2>
+ explicit process_times(
+ Rep2 r)
                 : real(r)
- , user(0)
- , system(0){}
- process_cpu_clock_times(
- process_real_cpu_clock::rep r,
- process_user_cpu_clock::rep u,
- process_system_cpu_clock::rep s)
+ , user(r)
+ , system(r){}
+ template <typename Rep2>
+ explicit process_times(
+ process_times<Rep2> const& rhs)
+ : real(rhs.real)
+ , user(rhs.user)
+ , system(rhs.system){}
+ process_times(
+ rep r,
+ rep u,
+ rep s)
                 : real(r)
                 , user(u)
                 , system(s){}
 
- process_real_cpu_clock::rep real; // real (i.e wall clock) time
- process_user_cpu_clock::rep user; // user cpu time
- process_system_cpu_clock::rep system; // system cpu time
-
- operator process_real_cpu_clock::rep()
- {
- return real;
- }
- bool operator==(process_cpu_clock_times const& rhs) {
+ rep real; // real (i.e wall clock) time
+ rep user; // user cpu time
+ rep system; // system cpu time
+
+ // operator rep()
+ //{
+ // return real;
+ //}
+ template <typename Rep2>
+ bool operator==(process_times<Rep2> const& rhs) {
                 return (real==rhs.real &&
                         user==rhs.user &&
                         system==rhs.system);
             }
 
- process_cpu_clock_times operator+=(
- process_cpu_clock_times const& rhs)
+ process_times& operator+=(
+ process_times const& rhs)
             {
                 real+=rhs.real;
                 user+=rhs.user;
                 system+=rhs.system;
                 return *this;
             }
- process_cpu_clock_times operator-=(
- process_cpu_clock_times const& rhs)
+ process_times& operator-=(
+ process_times const& rhs)
             {
                 real-=rhs.real;
                 user-=rhs.user;
                 system-=rhs.system;
                 return *this;
             }
- process_cpu_clock_times operator*=(
- process_cpu_clock_times const& rhs)
+ process_times& operator*=(
+ process_times const& rhs)
             {
                 real*=rhs.real;
                 user*=rhs.user;
                 system*=rhs.system;
                 return *this;
             }
- process_cpu_clock_times operator*=(rep const& rhs)
+ process_times& operator*=(rep const& rhs)
             {
                 real*=rhs;
                 user*=rhs;
                 system*=rhs;
                 return *this;
             }
- process_cpu_clock_times operator/=(process_cpu_clock_times const& rhs)
+ process_times& operator/=(process_times const& rhs)
             {
                 real/=rhs.real;
                 user/=rhs.user;
                 system/=rhs.system;
                 return *this;
             }
- process_cpu_clock_times operator/=(rep const& rhs)
+ process_times& operator/=(rep const& rhs)
             {
                 real/=rhs;
                 user/=rhs;
                 system/=rhs;
                 return *this;
             }
- bool operator<(process_cpu_clock_times const & rhs) const
+ bool operator<(process_times const & rhs) const
             {
                 if (real < rhs.real) return true;
                 if (real > rhs.real) return false;
@@ -181,7 +192,71 @@
                 }
             }
         };
+}
+template <class Rep1, class Rep2>
+struct common_type<
+ chrono::process_times<Rep1>,
+ chrono::process_times<Rep2>
+>
+{
+ typedef chrono::process_times<typename common_type<Rep1, Rep2>::type> type;
+};
+
+template <class Rep1, class Rep2>
+struct common_type<
+ chrono::process_times<Rep1>,
+ Rep2
+>
+{
+ typedef chrono::process_times<typename common_type<Rep1, Rep2>::type> type;
+};
+
+
+namespace chrono
+{
+ template <class Rep1, class Period1, class Rep2, class Period2>
+ inline BOOST_CHRONO_CONSTEXPR
+ bool
+ operator==(const duration<process_times<Rep1>, Period1>& lhs,
+ const duration<Rep2, Period2>& rhs)
+ {
+ return boost::chrono::detail::duration_eq<
+ duration<Rep1, Period1>, duration<Rep2, Period2> >()(duration<Rep1, Period1>(lhs.count().real), rhs);
+ }
+
+ template <class Rep1, class Period1, class Rep2, class Period2>
+ inline BOOST_CHRONO_CONSTEXPR
+ bool
+ operator==(const duration<Rep1, Period1>& lhs,
+ const duration<process_times<Rep2>, Period2>& rhs)
+ {
+ return rhs == lhs;
+ }
+
+
+ // Duration <
+
+ template <class Rep1, class Period1, class Rep2, class Period2>
+ inline BOOST_CHRONO_CONSTEXPR
+ bool
+ operator< (const duration<process_times<Rep1>, Period1>& lhs,
+ const duration<Rep2, Period2>& rhs)
+ {
+ return boost::chrono::detail::duration_lt<
+ duration<Rep1, Period1>, duration<Rep2, Period2> >()(duration<Rep1, Period1>(lhs.count().real), rhs);
+ }
+
+ template <class Rep1, class Period1, class Rep2, class Period2>
+ inline BOOST_CHRONO_CONSTEXPR
+ bool
+ operator< (const duration<Rep1, Period1>& lhs,
+ const duration<process_times<Rep2>, Period2>& rhs)
+ {
+ return rhs < lhs;
+ }
+
 
+ typedef process_times<nanoseconds::rep> process_cpu_clock_times;
     class BOOST_CHRONO_DECL process_cpu_clock
     {
     public:
@@ -198,44 +273,44 @@
                     system::error_code & ec );
     };
 
- template <class CharT, class Traits>
+ template <class CharT, class Traits, typename Rep>
     std::basic_ostream<CharT, Traits>&
     operator<<(std::basic_ostream<CharT, Traits>& os,
- process_cpu_clock_times const& rhs)
+ process_times<Rep> const& rhs)
     {
         rhs.print(os);
         return os;
     }
 
- template <class CharT, class Traits>
+ template <class CharT, class Traits, typename Rep>
     std::basic_istream<CharT, Traits>&
     operator>>(std::basic_istream<CharT, Traits>& is,
- process_cpu_clock_times const& rhs)
+ process_times<Rep> const& rhs)
     {
         rhs.read(is);
         return is;
     }
 
- template <>
- struct duration_values<process_cpu_clock_times>
+ template <typename Rep>
+ struct duration_values<process_times<Rep> >
     {
- typedef process_cpu_clock_times Rep;
+ typedef process_times<Rep> Res;
     public:
- static Rep zero()
+ static Res zero()
         {
- return Rep();
+ return Res();
         }
- static Rep max BOOST_PREVENT_MACRO_SUBSTITUTION ()
+ static Res max BOOST_PREVENT_MACRO_SUBSTITUTION ()
         {
- return Rep((std::numeric_limits<process_real_cpu_clock::rep>::max)(),
- (std::numeric_limits<process_user_cpu_clock::rep>::max)(),
- (std::numeric_limits<process_system_cpu_clock::rep>::max)());
+ return Res((std::numeric_limits<Rep>::max)(),
+ (std::numeric_limits<Rep>::max)(),
+ (std::numeric_limits<Rep>::max)());
         }
- static Rep min BOOST_PREVENT_MACRO_SUBSTITUTION ()
+ static Res min BOOST_PREVENT_MACRO_SUBSTITUTION ()
         {
- return Rep((std::numeric_limits<process_real_cpu_clock::rep>::min)(),
- (std::numeric_limits<process_user_cpu_clock::rep>::min)(),
- (std::numeric_limits<process_system_cpu_clock::rep>::min)());
+ return Res((std::numeric_limits<Rep>::min)(),
+ (std::numeric_limits<Rep>::min)(),
+ (std::numeric_limits<Rep>::min)());
         }
     };
 
@@ -244,44 +319,41 @@
 
 namespace std {
 
- template <>
- class numeric_limits<boost::chrono::process_cpu_clock::times>
+ template <typename Rep>
+ struct numeric_limits<boost::chrono::process_times<Rep> >
     {
- typedef boost::chrono::process_cpu_clock::times Rep;
+ typedef boost::chrono::process_times<Rep> Res;
 
         public:
         static const bool is_specialized = true;
- static Rep min BOOST_PREVENT_MACRO_SUBSTITUTION ()
+ static Res min BOOST_PREVENT_MACRO_SUBSTITUTION ()
         {
- return Rep((std::numeric_limits<boost::chrono::process_real_cpu_clock::rep>::min)(),
- (std::numeric_limits<boost::chrono::process_user_cpu_clock::rep>::min)(),
- (std::numeric_limits<boost::chrono::process_system_cpu_clock::rep>::min)());
+ return Res((std::numeric_limits<Rep>::min)(),
+ (std::numeric_limits<Rep>::min)(),
+ (std::numeric_limits<Rep>::min)());
         }
- static Rep max BOOST_PREVENT_MACRO_SUBSTITUTION ()
+ static Res max BOOST_PREVENT_MACRO_SUBSTITUTION ()
         {
- return Rep((std::numeric_limits<boost::chrono::process_real_cpu_clock::rep>::max)(),
- (std::numeric_limits<boost::chrono::process_user_cpu_clock::rep>::max)(),
- (std::numeric_limits<boost::chrono::process_system_cpu_clock::rep>::max)());
+ return Res((std::numeric_limits<Rep>::max)(),
+ (std::numeric_limits<Rep>::max)(),
+ (std::numeric_limits<Rep>::max)());
         }
- static Rep lowest() throw()
+ static Res lowest() throw()
         {
             return (min)();
         }
- static const int digits = std::numeric_limits<boost::chrono::process_real_cpu_clock::rep>::digits+
- std::numeric_limits<boost::chrono::process_user_cpu_clock::rep>::digits+
- std::numeric_limits<boost::chrono::process_system_cpu_clock::rep>::digits;
- static const int digits10 = std::numeric_limits<boost::chrono::process_real_cpu_clock::rep>::digits10+
- std::numeric_limits<boost::chrono::process_user_cpu_clock::rep>::digits10+
- std::numeric_limits<boost::chrono::process_system_cpu_clock::rep>::digits10;
- //~ static const int max_digits10 = std::numeric_limits<boost::chrono::process_real_cpu_clock::rep>::max_digits10+
- //~ std::numeric_limits<boost::chrono::process_user_cpu_clock::rep>::max_digits10+
- //~ std::numeric_limits<boost::chrono::process_system_cpu_clock::rep>::max_digits10;
- static const bool is_signed = false;
- static const bool is_integer = true;
- static const bool is_exact = true;
+ static const int digits = std::numeric_limits<Rep>::digits+
+ std::numeric_limits<Rep>::digits+
+ std::numeric_limits<Rep>::digits;
+ static const int digits10 = std::numeric_limits<Rep>::digits10+
+ std::numeric_limits<Rep>::digits10+
+ std::numeric_limits<Rep>::digits10;
+ static const bool is_signed = Rep::is_signed;
+ static const bool is_integer = Rep::is_integer;
+ static const bool is_exact = Rep::is_exact;
         static const int radix = 0;
- //~ static Rep epsilon() throw() { return 0; }
- //~ static Rep round_error() throw() { return 0; }
+ //~ static Res epsilon() throw() { return 0; }
+ //~ static Res round_error() throw() { return 0; }
         //~ static const int min_exponent = 0;
         //~ static const int min_exponent10 = 0;
         //~ static const int max_exponent = 0;
@@ -291,10 +363,10 @@
         //~ static const bool has_signaling_NaN = false;
         //~ static const float_denorm_style has_denorm = denorm_absent;
         //~ static const bool has_denorm_loss = false;
- //~ static Rep infinity() throw() { return 0; }
- //~ static Rep quiet_NaN() throw() { return 0; }
- //~ static Rep signaling_NaN() throw() { return 0; }
- //~ static Rep denorm_min() throw() { return 0; }
+ //~ static Res infinity() throw() { return 0; }
+ //~ static Res quiet_NaN() throw() { return 0; }
+ //~ static Res signaling_NaN() throw() { return 0; }
+ //~ static Res denorm_min() throw() { return 0; }
         //~ static const bool is_iec559 = false;
         //~ static const bool is_bounded = true;
         //~ static const bool is_modulo = false;


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk