diff --git a/src/libraries/turtle/constraints.hpp b/src/libraries/turtle/constraints.hpp index 0d322af..b08bcbf 100644 --- a/src/libraries/turtle/constraints.hpp +++ b/src/libraries/turtle/constraints.hpp @@ -57,8 +57,7 @@ namespace detail template< typename T > detail::placeholder< detail::same< T > > same( T& t ) { - return constraint( detail::same< T >( boost::ref( t ) ), - "same", &t ); + return constraint( detail::same< T >( t ), "same", &t ); } template< typename T > @@ -100,8 +99,7 @@ namespace detail template< typename T > detail::placeholder< detail::retrieve< T > > retrieve( T& t ) { - return constraint( detail::retrieve< T >( boost::ref( t ) ), - "retrieve", t ); + return constraint( detail::retrieve< T >( t ), "retrieve", t ); } template< typename T > diff --git a/src/libraries/turtle/functional.hpp b/src/libraries/turtle/functional.hpp index a227bcd..00901c9 100644 --- a/src/libraries/turtle/functional.hpp +++ b/src/libraries/turtle/functional.hpp @@ -9,7 +9,6 @@ #ifndef MOCK_FUNCTIONAL_HPP_INCLUDED #define MOCK_FUNCTIONAL_HPP_INCLUDED -#include #include #include #include @@ -68,16 +67,16 @@ namespace detail class same { public: - explicit same( const boost::reference_wrapper< Expected >& expected ) - : expected_( expected ) + explicit same( const Expected& expected ) + : expected_( &expected ) {} template< typename Actual > bool operator()( const Actual& actual ) const { - return &actual == expected_.get_pointer(); + return &actual == expected_; } private: - boost::reference_wrapper< Expected > expected_; + const Expected* expected_; }; template< typename Expected > @@ -119,12 +118,23 @@ namespace detail explicit assign( const Expected& expected ) : expected_( expected ) {} + template< typename Actual > - bool operator()( Actual& actual ) const + bool operator()( Actual& actual, + BOOST_DEDUCED_TYPENAME boost::disable_if< + boost::is_convertible< Expected*, Actual >, Actual >::type* = 0 ) const { actual = expected_; return true; } + template< typename Actual > + bool operator()( Actual* actual, + BOOST_DEDUCED_TYPENAME boost::enable_if< + boost::is_convertible< Expected, Actual >, Actual >::type* = 0 ) const + { + *actual = expected_; + return true; + } private: Expected expected_; }; @@ -133,15 +143,15 @@ namespace detail class retrieve { public: - explicit retrieve( const boost::reference_wrapper< Expected >& expected ) - : expected_( expected ) + explicit retrieve( Expected& expected ) + : expected_( &expected ) {} template< typename Actual > bool operator()( const Actual& actual, BOOST_DEDUCED_TYPENAME boost::disable_if< boost::is_convertible< const Actual*, Expected >, Actual >::type* = 0 ) const { - expected_.get() = actual; + *expected_ = actual; return true; } template< typename Actual > @@ -149,11 +159,11 @@ namespace detail BOOST_DEDUCED_TYPENAME boost::enable_if< boost::is_convertible< Actual*, Expected >, Actual >::type* = 0 ) const { - expected_.get() = &actual; + *expected_ = &actual; return true; } private: - boost::reference_wrapper< Expected > expected_; + Expected* expected_; }; template< typename Expected > diff --git a/src/tests/turtle_test/constraints_test.cpp b/src/tests/turtle_test/constraints_test.cpp index 2ee756d..bae8ca8 100644 --- a/src/tests/turtle_test/constraints_test.cpp +++ b/src/tests/turtle_test/constraints_test.cpp @@ -59,6 +59,11 @@ BOOST_AUTO_TEST_CASE( assign ) BOOST_CHECK( mock::assign( 3 ).f_( i ) ); BOOST_CHECK_EQUAL( 3, i ); } + { + int i = 0; + BOOST_CHECK( mock::assign( 3 ).f_( &i ) ); + BOOST_CHECK_EQUAL( 3, i ); + } { const int* i = 0; const int j = 1;