// boost/chrono/stopwatches/formatters/times_formatter.hpp ------------------------------------------------------------// // Copyright 2011 Vicente J. Botet Escriba // Distributed under the Boost Software License, Version 1.0. // See http://www.boost.org/LICENSE_1_0.txt // See http://www.boost.org/libs/chrono/stopwatches for documentation. #ifndef BOOST_CHRONO_STOPWATCHES_FORMATTERS_TIMES_HPP #define BOOST_CHRONO_STOPWATCHES_FORMATTERS_TIMES_HPP #include <boost/chrono/stopwatches/formatters/base_formatter.hpp> //#include <boost/chrono/detail/system.hpp> #include <boost/current_function.hpp> //#include <boost/chrono/stopwatches/detail/adaptive_string.hpp> #include <boost/format.hpp> #include <boost/format/group.hpp> #include <boost/cstdint.hpp> #include <boost/assert.hpp> #include <string> #include <iostream> #include <cassert> #include <iomanip> #define BOOST_CHRONO_STOPWATCHES_TIMES_FORMAT_DEFAULT "real %1%, cpu %4% (%5%%%), user %2%, system %3%\n" namespace boost { namespace chrono { template<typename Ratio = milli, typename CharT = char, typename Traits = std::char_traits<CharT>, class Alloc = std::allocator<CharT> > class basic_times_formatter: public base_formatter<CharT, Traits>, public basic_format<CharT, Traits> { public: typedef base_formatter<CharT, Traits> base_type; typedef basic_format<CharT, Traits> format_type; typedef std::basic_string<CharT, Traits, Alloc> string_type; typedef CharT char_type; typedef std::basic_ostream<CharT, Traits> ostream_type; basic_times_formatter() : base_type(), format_type(BOOST_CHRONO_STOPWATCHES_TIMES_FORMAT_DEFAULT) { } basic_times_formatter(ostream_type& os) : base_type(os), format_type(BOOST_CHRONO_STOPWATCHES_TIMES_FORMAT_DEFAULT) { } basic_times_formatter(const char* fmt, ostream_type& os = std::cout) : base_type(os), format_type(fmt) { } basic_times_formatter(string_type const& fmt, ostream_type& os = std::cout) : base_type(os), format_type(fmt) { } // static string_type format(const char* s) // { // string_type res(s); // res += boost::chrono::detail::adaptive_string(" : "); // res += BOOST_CHRONO_STOPWATCHES_TIMES_FORMAT_DEFAULT; // return res; // } template<class Stopwatch> void operator()(Stopwatch & stopwatch_ //, system::error_code & ec= BOOST_CHRONO_THROWS ) { typedef typename Stopwatch::duration::rep times_type; //times_type times = stopwatch_.elapsed(ec).count(); times_type times = stopwatch_.elapsed().count(); if (times.real < 0) return; double p; if (times.real > 0) p=double(times.user+times.system)*100/times.real; else p=0; duration_style_io_saver dsios(this->os_); this->os_ << static_cast<format_type&>(*this) % io::group(std::fixed, std::setprecision(this->precision_), duration_fmt(this->duration_style_), boost::chrono::duration<double, Ratio>(nanoseconds(times.real))) % io::group(std::fixed, std::setprecision(this->precision_), duration_fmt(this->duration_style_), boost::chrono::duration<double, Ratio>(nanoseconds(times.user))) % io::group(std::fixed, std::setprecision(this->precision_), duration_fmt(this->duration_style_), boost::chrono::duration<double, Ratio>(nanoseconds(times.system))) % io::group(std::fixed, std::setprecision(this->precision_), duration_fmt(this->duration_style_), boost::chrono::duration<double, Ratio>(nanoseconds(times.user+times.system))) % io::group(std::fixed, std::setprecision(2), p) ; } }; typedef basic_times_formatter<milli, char> times_formatter; typedef basic_times_formatter<milli, wchar_t> wtimes_formatter; } // namespace chrono } // namespace boost #if 0 #define BOOST_CHRONO_STOPWATCHES_TIMES_FORMAT(F) \ boost::chrono::detail::adaptive_string(F " : " BOOST_CHRONO_STOPWATCHES_TIMES_FORMAT_DEFAULT) #ifdef __GNUC__ #define BOOST_CHRONO_STOPWATCHES_TIMES_FUNCTION_FORMAT \ boost::chrono::times_formatter::format(BOOST_CURRENT_FUNCTION) #else #define BOOST_CHRONO_STOPWATCHES_TIMES_FUNCTION_FORMAT \ BOOST_CHRONO_STOPWATCHES_TIMES_FORMAT(BOOST_CURRENT_FUNCTION) #endif #endif #endif