526 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			526 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| //  boost/chrono/process_cpu_clocks.hpp  -----------------------------------------------------------//
 | |
| 
 | |
| //  Copyright 2009-2011 Vicente J. Botet Escriba
 | |
| //  Copyright (c) Microsoft Corporation 2014
 | |
| 
 | |
| //  Distributed under the Boost Software License, Version 1.0.
 | |
| //  See http://www.boost.org/LICENSE_1_0.txt
 | |
| 
 | |
| //  See http://www.boost.org/libs/system for documentation.
 | |
| 
 | |
| #ifndef BOOST_CHRONO_PROCESS_CPU_CLOCKS_HPP
 | |
| #define BOOST_CHRONO_PROCESS_CPU_CLOCKS_HPP
 | |
| 
 | |
| #include <boost/chrono/config.hpp>
 | |
| 
 | |
| 
 | |
| #if defined(BOOST_CHRONO_HAS_PROCESS_CLOCKS)
 | |
| 
 | |
| #include <boost/chrono/duration.hpp>
 | |
| #include <boost/chrono/time_point.hpp>
 | |
| #include <boost/operators.hpp>
 | |
| #include <boost/chrono/detail/system.hpp>
 | |
| #include <iostream>
 | |
| #include <boost/type_traits/common_type.hpp>
 | |
| #include <boost/chrono/clock_string.hpp>
 | |
| 
 | |
| #ifndef BOOST_CHRONO_HEADER_ONLY
 | |
| #include <boost/config/abi_prefix.hpp> // must be the last #include
 | |
| #endif
 | |
| 
 | |
| namespace boost { namespace chrono {
 | |
| 
 | |
|     class BOOST_CHRONO_DECL process_real_cpu_clock {
 | |
|     public:
 | |
|         typedef nanoseconds                          duration;
 | |
|         typedef duration::rep                        rep;
 | |
|         typedef duration::period                     period;
 | |
|         typedef chrono::time_point<process_real_cpu_clock>    time_point;
 | |
|         BOOST_STATIC_CONSTEXPR bool is_steady =             true;
 | |
| 
 | |
|         static BOOST_CHRONO_INLINE time_point now() BOOST_NOEXCEPT;
 | |
| #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
 | |
|         static BOOST_CHRONO_INLINE time_point now(system::error_code & ec );
 | |
| #endif
 | |
|     };
 | |
| 
 | |
| #if ! BOOST_OS_WINDOWS || BOOST_PLAT_WINDOWS_DESKTOP
 | |
|     class BOOST_CHRONO_DECL process_user_cpu_clock {
 | |
|     public:
 | |
|         typedef nanoseconds                          duration;
 | |
|         typedef duration::rep                        rep;
 | |
|         typedef duration::period                     period;
 | |
|         typedef chrono::time_point<process_user_cpu_clock>    time_point;
 | |
|         BOOST_STATIC_CONSTEXPR bool is_steady =             true;
 | |
| 
 | |
|         static BOOST_CHRONO_INLINE time_point now() BOOST_NOEXCEPT;
 | |
| #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
 | |
|         static BOOST_CHRONO_INLINE time_point now(system::error_code & ec );
 | |
| #endif
 | |
|     };
 | |
| 
 | |
|     class BOOST_CHRONO_DECL process_system_cpu_clock {
 | |
|     public:
 | |
|         typedef nanoseconds                          duration;
 | |
|         typedef duration::rep                        rep;
 | |
|         typedef duration::period                     period;
 | |
|         typedef chrono::time_point<process_system_cpu_clock>    time_point;
 | |
|         BOOST_STATIC_CONSTEXPR bool is_steady =             true;
 | |
| 
 | |
|         static BOOST_CHRONO_INLINE time_point now() BOOST_NOEXCEPT;
 | |
| #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
 | |
|         static BOOST_CHRONO_INLINE time_point now(system::error_code & ec );
 | |
| #endif
 | |
|     };
 | |
| #endif
 | |
| 
 | |
|         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;
 | |
|               typedef Rep rep;
 | |
|             process_times()
 | |
|                 : real(0)
 | |
|                 , user(0)
 | |
|                 , system(0){}
 | |
| 
 | |
| #if ! defined BOOST_CHRONO_DONT_PROVIDES_DEPRECATED_IO_SINCE_V2_0_0
 | |
|             template <typename Rep2>
 | |
|             explicit process_times(
 | |
|                 Rep2 r)
 | |
|                 : real(r)
 | |
|                 , user(r)
 | |
|                 , system(r){}
 | |
| #endif
 | |
|             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){}
 | |
| 
 | |
|             rep   real;    // real (i.e wall clock) time
 | |
|             rep   user;    // user cpu time
 | |
|             rep system;  // system cpu time
 | |
| 
 | |
| #if ! defined BOOST_CHRONO_DONT_PROVIDES_DEPRECATED_IO_SINCE_V2_0_0
 | |
|             operator rep() const
 | |
|             {
 | |
|               return real;
 | |
|             }
 | |
| #endif
 | |
|             template <typename Rep2>
 | |
|             bool operator==(process_times<Rep2> const& rhs) {
 | |
|                 return (real==rhs.real &&
 | |
|                         user==rhs.user &&
 | |
|                         system==rhs.system);
 | |
|             }
 | |
| 
 | |
|             process_times& operator+=(
 | |
|                 process_times const& rhs)
 | |
|             {
 | |
|                 real+=rhs.real;
 | |
|                 user+=rhs.user;
 | |
|                 system+=rhs.system;
 | |
|                 return *this;
 | |
|             }
 | |
|             process_times& operator-=(
 | |
|                 process_times const& rhs)
 | |
|             {
 | |
|                 real-=rhs.real;
 | |
|                 user-=rhs.user;
 | |
|                 system-=rhs.system;
 | |
|                 return *this;
 | |
|             }
 | |
|             process_times& operator*=(
 | |
|                 process_times const& rhs)
 | |
|             {
 | |
|                 real*=rhs.real;
 | |
|                 user*=rhs.user;
 | |
|                 system*=rhs.system;
 | |
|                 return *this;
 | |
|             }
 | |
|             process_times& operator*=(rep const& rhs)
 | |
|             {
 | |
|                 real*=rhs;
 | |
|                 user*=rhs;
 | |
|                 system*=rhs;
 | |
|                 return *this;
 | |
|             }
 | |
|             process_times& operator/=(process_times const& rhs)
 | |
|             {
 | |
|                 real/=rhs.real;
 | |
|                 user/=rhs.user;
 | |
|                 system/=rhs.system;
 | |
|                 return *this;
 | |
|             }
 | |
|             process_times& operator/=(rep const& rhs)
 | |
|             {
 | |
|                 real/=rhs;
 | |
|                 user/=rhs;
 | |
|                 system/=rhs;
 | |
|                 return *this;
 | |
|             }
 | |
|             bool operator<(process_times const & rhs) const
 | |
|             {
 | |
|                 if (real < rhs.real) return true;
 | |
|                 if (real > rhs.real) return false;
 | |
|                 if (user < rhs.user) return true;
 | |
|                 if (user > rhs.user) return false;
 | |
|                 if (system < rhs.system) return true;
 | |
|                 else return false;
 | |
|             }
 | |
| 
 | |
|             template <class CharT, class Traits>
 | |
|             void print(std::basic_ostream<CharT, Traits>& os) const
 | |
|             {
 | |
|                 os <<  "{"<< real <<";"<< user <<";"<< system << "}";
 | |
|             }
 | |
| 
 | |
|             template <class CharT, class Traits>
 | |
|             void read(std::basic_istream<CharT, Traits>& is)
 | |
|             {
 | |
|                 typedef std::istreambuf_iterator<CharT, Traits> in_iterator;
 | |
|                 in_iterator i(is);
 | |
|                 in_iterator e;
 | |
|                 if (i == e || *i++ != '{')  // mandatory '{'
 | |
|                 {
 | |
|                     is.setstate(is.failbit | is.eofbit);
 | |
|                     return;
 | |
|                 }
 | |
|                 CharT x,y,z;
 | |
|                 is >> real >> x >> user >> y >> system >> z;
 | |
|                 if (!is.good() || (x != ';')|| (y != ';')|| (z != '}'))
 | |
|                 {
 | |
|                     is.setstate(is.failbit);
 | |
|                 }
 | |
|             }
 | |
|         };
 | |
| }
 | |
| 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;
 | |
| };
 | |
| 
 | |
| template <class Rep1, class Rep2>
 | |
| struct common_type<
 | |
|   Rep1,
 | |
|   chrono::process_times<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_CONSTEXPR
 | |
|   bool
 | |
|   operator==(const duration<process_times<Rep1>, Period1>& lhs,
 | |
|         const duration<process_times<Rep2>, Period2>& rhs)
 | |
|   {
 | |
|       return boost::chrono::detail::duration_eq<
 | |
|           duration<Rep1, Period1>, duration<Rep2, Period2>
 | |
|         >()(duration<Rep1, Period1>(lhs.count().real), duration<Rep2, Period2>(rhs.count().real));
 | |
|   }
 | |
| 
 | |
|   template <class Rep1, class Period1, class Rep2, class Period2>
 | |
|   inline BOOST_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_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_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_CONSTEXPR
 | |
|   bool
 | |
|   operator< (const duration<Rep1, Period1>& lhs,
 | |
|         const duration<process_times<Rep2>, Period2>& rhs)
 | |
|   {
 | |
|       return boost::chrono::detail::duration_lt<
 | |
|         duration<Rep1, Period1>, duration<Rep2, Period2> >()(lhs, duration<Rep2, Period2>(rhs.count().real));
 | |
|   }
 | |
| 
 | |
|   template <class Rep1, class Period1, class Rep2, class Period2>
 | |
|   inline BOOST_CONSTEXPR
 | |
|   bool
 | |
|   operator< (const duration<process_times<Rep1>, Period1>& lhs,
 | |
|         const duration<process_times<Rep2>, Period2>& rhs)
 | |
|   {
 | |
|     return boost::chrono::detail::duration_lt<
 | |
|         duration<Rep1, Period1>, duration<Rep2, Period2>
 | |
|       >()(duration<Rep1, Period1>(lhs.count().real), duration<Rep2, Period2>(rhs.count().real));
 | |
|   }
 | |
| 
 | |
| 
 | |
|   typedef process_times<nanoseconds::rep> process_cpu_clock_times;
 | |
| #if ! BOOST_OS_WINDOWS || BOOST_PLAT_WINDOWS_DESKTOP
 | |
|     class BOOST_CHRONO_DECL process_cpu_clock
 | |
|     {
 | |
|     public:
 | |
| 
 | |
|         typedef process_cpu_clock_times times;
 | |
|         typedef boost::chrono::duration<times,  nano>                duration;
 | |
|         typedef duration::rep                       rep;
 | |
|         typedef duration::period                    period;
 | |
|         typedef chrono::time_point<process_cpu_clock>  time_point;
 | |
|         BOOST_STATIC_CONSTEXPR bool is_steady =           true;
 | |
| 
 | |
|         static BOOST_CHRONO_INLINE time_point now() BOOST_NOEXCEPT;
 | |
| #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
 | |
|         static BOOST_CHRONO_INLINE time_point now(system::error_code & ec );
 | |
| #endif
 | |
|     };
 | |
| #endif
 | |
| 
 | |
|     template <class CharT, class Traits, typename Rep>
 | |
|     std::basic_ostream<CharT, Traits>&
 | |
|     operator<<(std::basic_ostream<CharT, Traits>& os,
 | |
|         process_times<Rep> const& rhs)
 | |
|     {
 | |
|         rhs.print(os);
 | |
|         return os;
 | |
|     }
 | |
| 
 | |
|     template <class CharT, class Traits, typename Rep>
 | |
|     std::basic_istream<CharT, Traits>&
 | |
|     operator>>(std::basic_istream<CharT, Traits>& is,
 | |
|         process_times<Rep>& rhs)
 | |
|     {
 | |
|         rhs.read(is);
 | |
|         return is;
 | |
|     }
 | |
| 
 | |
|     template <typename Rep>
 | |
|     struct duration_values<process_times<Rep> >
 | |
|     {
 | |
|         typedef process_times<Rep> Res;
 | |
|     public:
 | |
|         static Res zero()
 | |
|         {
 | |
|             return Res();
 | |
|         }
 | |
|         static Res max BOOST_PREVENT_MACRO_SUBSTITUTION ()
 | |
|         {
 | |
|           return Res((std::numeric_limits<Rep>::max)(),
 | |
|                       (std::numeric_limits<Rep>::max)(),
 | |
|                       (std::numeric_limits<Rep>::max)());
 | |
|         }
 | |
|         static Res min BOOST_PREVENT_MACRO_SUBSTITUTION ()
 | |
|         {
 | |
|           return Res((std::numeric_limits<Rep>::min)(),
 | |
|                       (std::numeric_limits<Rep>::min)(),
 | |
|                       (std::numeric_limits<Rep>::min)());
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     template<class CharT>
 | |
|     struct clock_string<process_real_cpu_clock, CharT>
 | |
|     {
 | |
|       static std::basic_string<CharT> name()
 | |
|       {
 | |
|         static const CharT
 | |
|             u[] =
 | |
|                 { 'p', 'r', 'o', 'c', 'e', 's', 's', '_', 'r', 'e', 'a', 'l', '_', 'c', 'l', 'o', 'c', 'k' };
 | |
|         static const std::basic_string<CharT> str(u, u + sizeof(u)
 | |
|             / sizeof(u[0]));
 | |
|         return str;
 | |
|       }
 | |
|       static std::basic_string<CharT> since()
 | |
|       {
 | |
|         const CharT
 | |
|             u[] =
 | |
|                 { ' ', 's', 'i', 'n', 'c', 'e', ' ', 'p', 'r', 'o', 'c', 'e', 's', 's', ' ', 's', 't', 'a', 'r', 't', '-', 'u', 'p' };
 | |
|         const std::basic_string<CharT> str(u, u + sizeof(u) / sizeof(u[0]));
 | |
|         return str;
 | |
|       }
 | |
|     };
 | |
| 
 | |
| #if ! BOOST_OS_WINDOWS || BOOST_PLAT_WINDOWS_DESKTOP
 | |
|     template<class CharT>
 | |
|     struct clock_string<process_user_cpu_clock, CharT>
 | |
|     {
 | |
|       static std::basic_string<CharT> name()
 | |
|       {
 | |
|         static const CharT
 | |
|             u[] =
 | |
|                 { 'p', 'r', 'o', 'c', 'e', 's', 's', '_', 'u', 's', 'e', 'r', '_', 'c', 'l', 'o', 'c', 'k' };
 | |
|         static const std::basic_string<CharT> str(u, u + sizeof(u)
 | |
|             / sizeof(u[0]));
 | |
|         return str;
 | |
|       }
 | |
|       static std::basic_string<CharT> since()
 | |
|       {
 | |
|         const CharT
 | |
|             u[] =
 | |
|                 { ' ', 's', 'i', 'n', 'c', 'e', ' ', 'p', 'r', 'o', 'c', 'e', 's', 's', ' ', 's', 't', 'a', 'r', 't', '-', 'u', 'p' };
 | |
|         const std::basic_string<CharT> str(u, u + sizeof(u) / sizeof(u[0]));
 | |
|         return str;
 | |
|       }
 | |
|     };
 | |
| 
 | |
|     template<class CharT>
 | |
|     struct clock_string<process_system_cpu_clock, CharT>
 | |
|     {
 | |
|       static std::basic_string<CharT> name()
 | |
|       {
 | |
|         static const CharT
 | |
|             u[] =
 | |
|                 { 'p', 'r', 'o', 'c', 'e', 's', 's', '_', 's', 'y', 's', 't', 'e', 'm', '_', 'c', 'l', 'o', 'c', 'k' };
 | |
|         static const std::basic_string<CharT> str(u, u + sizeof(u)
 | |
|             / sizeof(u[0]));
 | |
|         return str;
 | |
|       }
 | |
|       static std::basic_string<CharT> since()
 | |
|       {
 | |
|         const CharT
 | |
|             u[] =
 | |
|                 { ' ', 's', 'i', 'n', 'c', 'e', ' ', 'p', 'r', 'o', 'c', 'e', 's', 's', ' ', 's', 't', 'a', 'r', 't', '-', 'u', 'p' };
 | |
|         const std::basic_string<CharT> str(u, u + sizeof(u) / sizeof(u[0]));
 | |
|         return str;
 | |
|       }
 | |
|     };
 | |
| 
 | |
|     template<class CharT>
 | |
|     struct clock_string<process_cpu_clock, CharT>
 | |
|     {
 | |
|       static std::basic_string<CharT> name()
 | |
|       {
 | |
|         static const CharT u[] =
 | |
|         { 'p', 'r', 'o', 'c', 'e', 's', 's', '_', 'c', 'l', 'o', 'c', 'k' };
 | |
|         static const std::basic_string<CharT> str(u, u + sizeof(u)
 | |
|             / sizeof(u[0]));
 | |
|         return str;
 | |
|       }
 | |
|       static std::basic_string<CharT> since()
 | |
|       {
 | |
|         const CharT
 | |
|             u[] =
 | |
|                 { ' ', 's', 'i', 'n', 'c', 'e', ' ', 'p', 'r', 'o', 'c', 'e', 's', 's', ' ', 's', 't', 'a', 'r', 't', '-', 'u', 'p' };
 | |
|         const std::basic_string<CharT> str(u, u + sizeof(u) / sizeof(u[0]));
 | |
|         return str;
 | |
|       }
 | |
|     };
 | |
| #endif
 | |
| 
 | |
| } // namespace chrono
 | |
| } // namespace boost
 | |
| 
 | |
| namespace std {
 | |
| 
 | |
|     template <typename Rep>
 | |
|     struct numeric_limits<boost::chrono::process_times<Rep> >
 | |
|     {
 | |
|         typedef boost::chrono::process_times<Rep> Res;
 | |
| 
 | |
|         public:
 | |
|         static const bool is_specialized = true;
 | |
|         static Res min BOOST_PREVENT_MACRO_SUBSTITUTION ()
 | |
|         {
 | |
|           return Res((std::numeric_limits<Rep>::min)(),
 | |
|                       (std::numeric_limits<Rep>::min)(),
 | |
|                       (std::numeric_limits<Rep>::min)());
 | |
|         }
 | |
|         static Res max BOOST_PREVENT_MACRO_SUBSTITUTION ()
 | |
|         {
 | |
|           return Res((std::numeric_limits<Rep>::max)(),
 | |
|                       (std::numeric_limits<Rep>::max)(),
 | |
|                       (std::numeric_limits<Rep>::max)());
 | |
|         }
 | |
|         static Res lowest() throw()
 | |
|         {
 | |
|             return (min)();
 | |
|         }
 | |
|         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 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;
 | |
|         //~ static const int max_exponent10 = 0;
 | |
|         //~ static const bool has_infinity = false;
 | |
|         //~ static const bool has_quiet_NaN = false;
 | |
|         //~ static const bool has_signaling_NaN = false;
 | |
|         //~ static const float_denorm_style has_denorm = denorm_absent;
 | |
|         //~ static const bool has_denorm_loss = false;
 | |
|         //~ 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;
 | |
|         //~ static const bool traps = false;
 | |
|         //~ static const bool tinyness_before = false;
 | |
|         //~ static const float_round_style round_style = round_toward_zero;
 | |
| 
 | |
|     };
 | |
| }
 | |
| 
 | |
| #ifndef BOOST_CHRONO_HEADER_ONLY
 | |
| #include <boost/config/abi_suffix.hpp> // pops abi_prefix.hpp pragmas
 | |
| #else
 | |
| #include <boost/chrono/detail/inlined/process_cpu_clocks.hpp>
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| #endif  // BOOST_CHRONO_PROCESS_CPU_CLOCKS_HPP
 | 
