blob: 4db70d08f7d541be321ab4f221336099f04ba2d5 [file] [log] [blame]
// 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