=== boost/test/lazy_output.hpp ================================================================== --- boost/test/lazy_output.hpp (revision 4821) +++ boost/test/lazy_output.hpp (revision 4822) @@ -0,0 +1,74 @@ +#ifndef BOOST_TEST_LAZY_OUTPUT_HPP +#define BOOST_TEST_LAZY_OUTPUT_HPP + +#include + +namespace boost { + namespace unit_test { + + class lazy_output + { + virtual void output(std::ostream& o) const=0; + public: + friend std::ostream& operator <<(std::ostream& o, const lazy_output& lo) { + lo.output(o); + return o; + } + }; + + class lazy_output_0 : public lazy_output + { + void output(std::ostream&) const {} + }; + + template + class lazy_output_1 : public lazy_output + { + const T& t_; + void output(std::ostream& o) const; + public: + lazy_output_1(const T& t) : t_(t) {} + }; + + template + class lazy_output_2 : public lazy_output + { + const T& t_; + Prev p_; + void output(std::ostream& o) const; + public: + lazy_output_2(const T& t, const Prev& p) : t_(t), p_(p) {} + }; + + template + void lazy_output_1::output(std::ostream& o) const { + o << t_; + } + + template + void lazy_output_2::output(std::ostream& o) const { + o << p_; + o << t_; + } + + lazy_output_0 make_lazy_output() { return lazy_output_0(); } + + template + lazy_output_1 operator<<(lazy_output_0, const T& t) { + return lazy_output_1(t); + } + + template + lazy_output_2 > operator<<(const lazy_output_1& l, const T& t) { + return lazy_output_2 >(t, l); + } + + template + lazy_output_2 > operator<<(const lazy_output_2& l, const T& t) { + return lazy_output_2 >(t, l); + } + + } +} + +#endif === boost/test/impl/test_tools.ipp ================================================================== --- boost/test/impl/test_tools.ipp (revision 4821) +++ boost/test/impl/test_tools.ipp (revision 4822) @@ -62,7 +62,7 @@ // ************************************************************************** // void -check_impl( predicate_result const& pr, wrap_stringstream& check_descr, +check_impl( predicate_result const& pr, const lazy_output& check_descr, const_string file_name, std::size_t line_num, tool_level tl, check_type ct, std::size_t num_of_args, ... ) @@ -107,7 +107,7 @@ switch( ct ) { case CHECK_PRED: unit_test_log << unit_test::log::begin( file_name, line_num ) - << ll << prefix << check_descr.str() << suffix; + << ll << prefix << check_descr << suffix; if( !pr.has_empty_message() ) unit_test_log << ". " << pr.message(); @@ -119,9 +119,9 @@ unit_test_log << unit_test::log::begin( file_name, line_num ) << ll; if( tl == PASS ) - unit_test_log << prefix << "'" << check_descr.str() << "'" << suffix; + unit_test_log << prefix << "'" << check_descr << "'" << suffix; else - unit_test_log << check_descr.str(); + unit_test_log << check_descr; if( !pr.has_empty_message() ) unit_test_log << ". " << pr.message(); @@ -216,7 +216,7 @@ case CHECK_PRED_WITH_ARGS: { unit_test_log << unit_test::log::begin( file_name, line_num ) - << ll << prefix << check_descr.str(); + << ll << prefix << check_descr; // print predicate call description { === boost/test/impl/unit_test_log.ipp ================================================================== --- boost/test/impl/unit_test_log.ipp (revision 4821) +++ boost/test/impl/unit_test_log.ipp (revision 4822) @@ -352,6 +352,16 @@ return *this; } +unit_test_log_t& +unit_test_log_t::operator<<( const lazy_output& value ) +{ + if( s_log_impl().m_entry_data.m_level >= s_log_impl().m_threshold_level) { + return (*this) << (wrap_stringstream().ref() << value).str(); + } + + return *this; +} + //____________________________________________________________________________// void === boost/test/unit_test_log.hpp ================================================================== --- boost/test/unit_test_log.hpp (revision 4821) +++ boost/test/unit_test_log.hpp (revision 4822) @@ -27,6 +27,7 @@ #include #include +#include // Boost #include @@ -119,6 +120,7 @@ unit_test_log_t& operator<<( log::end const& ); // end entry unit_test_log_t& operator<<( log_level ); // set entry level unit_test_log_t& operator<<( const_string ); // log entry value + unit_test_log_t& operator<<( const lazy_output& ); // log entry value ut_detail::entry_value_collector operator()( log_level ); // initiate entry collection === boost/test/test_tools.hpp ================================================================== --- boost/test/test_tools.hpp (revision 4821) +++ boost/test/test_tools.hpp (revision 4822) @@ -49,6 +49,8 @@ #include +#include + //____________________________________________________________________________// // ************************************************************************** // @@ -69,7 +71,7 @@ #define BOOST_TEST_TOOL_IMPL( func, P, check_descr, TL, CT ) \ ::boost::test_tools::tt_detail::func( \ P, \ - ::boost::wrap_stringstream().ref() << check_descr, \ + make_lazy_output() << check_descr, \ BOOST_TEST_L(__FILE__), \ (std::size_t)__LINE__, \ ::boost::test_tools::tt_detail::TL, \ @@ -460,7 +462,7 @@ // ************************************************************************** // BOOST_TEST_DECL -void check_impl( predicate_result const& pr, wrap_stringstream& check_descr, +void check_impl( predicate_result const& pr, const boost::unit_test::lazy_output& check_descr, const_string file_name, std::size_t line_num, tool_level tl, check_type ct, std::size_t num_args, ... ); @@ -486,7 +488,7 @@ template \ inline void \ -check_frwd( Pred P, wrap_stringstream& check_descr, \ + check_frwd( Pred P, const boost::unit_test::lazy_output& check_descr, \ const_string file_name, std::size_t line_num, \ tool_level tl, check_type ct \ BOOST_PP_REPEAT_ ## z( BOOST_PP_ADD( n, 1 ), FUNC_PARAMS, _ ) \