diff --git a/src/libraries/turtle/check.hpp b/src/libraries/turtle/check.hpp index 0314036..0299708 100644 --- a/src/libraries/turtle/check.hpp +++ b/src/libraries/turtle/check.hpp @@ -9,13 +9,20 @@ #ifndef MOCK_CHECK_HPP_INCLUDED #define MOCK_CHECK_HPP_INCLUDED +#include "config.hpp" #include "is_functor.hpp" #include "constraints.hpp" #include "operators.hpp" #include "format.hpp" -#include #include #include +#ifdef MOCK_USE_BOOST_BIND +#include +#else +#include +#include +#endif +#include #include #include @@ -30,8 +37,8 @@ namespace detail BOOST_CONCEPT_USAGE( FunctorCompatible ) { boost::require_boolean_expr( - // if an error is generated by the line below it means an argument - // passed to 'with' was of the wrong type. + // if an error is generated by the line below it means + // an argument passed to 'with' was of the wrong type. functor_accepts( actual_argument_type ) ); } @@ -48,8 +55,8 @@ namespace detail BOOST_CONCEPT_USAGE( EqualityComparable ) { boost::require_boolean_expr( - // if an error is generated by the line below it means an argument - // passed to 'with' was of the wrong type. + // if an error is generated by the line below it means + // an argument passed to 'with' was of the wrong type. actual_argument_type == expected_argument_type ); } @@ -59,6 +66,28 @@ namespace detail Actual actual_argument_type; }; + template< typename T > + void log( std::ostream& s, const T& t ) + { + s << mock::format( t ); + } + +#ifdef MOCK_USE_BOOST_BIND + template< typename T > + boost::function< void( std::ostream& ) > lazy_format( T t ) + { + return boost::bind( &log< T >, _1, t ); + } +#else + template< typename T > + boost::function< void( std::ostream& ) > lazy_format( T t ) + { + return boost::phoenix::bind( + &log< T >, + boost::phoenix::arg_names::_1, t ); + } +#endif + template< typename Actual > class check { @@ -68,7 +97,7 @@ namespace detail BOOST_DEDUCED_TYPENAME boost::enable_if< BOOST_DEDUCED_TYPENAME detail::is_functor< Functor > >::type* = 0 ) - : desc_( mock::format( f ) ) + : desc_( lazy_format( f ) ) { BOOST_CONCEPT_ASSERT(( FunctorCompatible< Functor, Actual > )); f_ = f; @@ -80,19 +109,19 @@ namespace detail BOOST_DEDUCED_TYPENAME boost::disable_if< BOOST_DEDUCED_TYPENAME detail::is_functor< Expected > >::type* = 0 ) - : desc_( mock::format( expected ) ) + : desc_( lazy_format( expected ) ) { BOOST_CONCEPT_ASSERT(( EqualityComparable< Expected, Actual > )); f_ = mock::equal( expected ).f_; if( ! f_ ) std::invalid_argument( "invalid constraint" ); } - template< typename Functor > - explicit check( const constraint< Functor >& ph ) - : desc_( mock::format( ph.f_ ) ) + template< typename Constraint > + explicit check( const constraint< Constraint >& c ) + : desc_( lazy_format( c.f_ ) ) { - BOOST_CONCEPT_ASSERT(( FunctorCompatible< Functor, Actual > )); - f_ = ph.f_; + BOOST_CONCEPT_ASSERT(( FunctorCompatible< Constraint, Actual > )); + f_ = c.f_; if( ! f_ ) std::invalid_argument( "invalid constraint" ); } @@ -104,12 +133,13 @@ namespace detail friend std::ostream& operator<<( std::ostream& s, const check& c ) { - return s << c.desc_; + c.desc_( s ); + return s; } private: boost::function< bool( Actual ) > f_; - std::string desc_; + boost::function< void( std::ostream& ) > desc_; }; } }