// boost/chrono/stopwatches/formatters/elapsed_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_ELAPSED_HPP #define BOOST_CHRONO_STOPWATCHES_FORMATTERS_ELAPSED_HPP #include <boost/chrono/stopwatches/formatters/base_formatter.hpp> #include <boost/chrono/chrono_io.hpp> #include <boost/current_function.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_ELAPSED_FORMAT_DEFAULT "%1%\n" namespace boost { namespace chrono { template<typename Ratio, typename CharT, typename Traits = std::char_traits<CharT>, class Alloc = std::allocator<CharT> > class basic_elapsed_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_elapsed_formatter() : base_type(), format_type(BOOST_CHRONO_STOPWATCHES_ELAPSED_FORMAT_DEFAULT) { } basic_elapsed_formatter(ostream_type& os) : base_type(os), format_type(BOOST_CHRONO_STOPWATCHES_ELAPSED_FORMAT_DEFAULT) { } basic_elapsed_formatter(const char* fmt, ostream_type& os = std::cout) : base_type(os), format_type(fmt) { } basic_elapsed_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_ELAPSED_FORMAT_DEFAULT; // return res; // } template<class Stopwatch> void operator()(Stopwatch & stopwatch_ //, system::error_code & ec= BOOST_CHRONO_THROWS ) { typedef typename Stopwatch::duration duration_t; duration_t d = stopwatch_.elapsed(); //duration_t d = stopwatch_.elapsed(ec); if (d < duration_t::zero()) return; 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>(d)) ; } }; typedef basic_elapsed_formatter<milli, char> elapsed_formatter; typedef basic_elapsed_formatter<milli, wchar_t> welapsed_formatter; } // namespace chrono } // namespace boost #if 0 #define BOOST_CHRONO_STOPWATCHES_ELAPSED_FORMAT(F) \ boost::chrono::detail::adaptive_string(F " : " BOOST_CHRONO_STOPWATCHES_ELAPSED_FORMAT_DEFAULT) #ifdef __GNUC__ #define BOOST_CHRONO_STOPWATCHES_ELAPSED_FUNCTION_FORMAT \ boost::chrono::elapsed_formatter::format(BOOST_CURRENT_FUNCTION) #else #define BOOST_CHRONO_STOPWATCHES_ELAPSED_FUNCTION_FORMAT \ BOOST_CHRONO_STOPWATCHES_ELAPSED_FORMAT(BOOST_CURRENT_FUNCTION) #endif #endif #endif