diff --git a/turtle/detail/action.hpp b/turtle/detail/action.hpp index 2f9af52..ff74d0c 100644 --- a/turtle/detail/action.hpp +++ b/turtle/detail/action.hpp @@ -73,18 +73,18 @@ namespace detail template< typename Value > void returns( const Value& v ) { - f_ = lambda_type::make_val( boost::ref( v_.store( v ) ) ); + f_ = lambda_type::make_ref( boost::ref( v_.store( v ) ) ); } template< typename Value > void returns( Value* v ) { - f_ = lambda_type::make_val( + f_ = lambda_type::make_ref( boost::ref( v_.store( result_type( v ) ) ) ); } template< typename Y > void returns( const boost::reference_wrapper< Y >& r ) { - f_ = lambda_type::make_val( r ); + f_ = lambda_type::make_ref( r ); } template< typename Value > @@ -132,7 +132,7 @@ namespace detail template< typename Y > void returns( const boost::reference_wrapper< Y >& r ) { - f_ = lambda_type::make_val( r ); + f_ = lambda_type::make_ref( r ); } void calls( const functor_type& f ) @@ -206,7 +206,7 @@ namespace detail action( const action& rhs ) : v_( const_cast< action& >( rhs ).v_.release() ) , f_( v_.get() - ? lambda_type::make_val( boost::ref( v_ ) ) + ? lambda_type::make_ref( boost::ref( v_ ) ) : rhs.f_ ) {} @@ -239,18 +239,18 @@ namespace detail void set( std::auto_ptr< Y > r ) { v_ = r; - f_ = lambda_type::make_val( boost::ref( v_ ) ); + f_ = lambda_type::make_ref( boost::ref( v_ ) ); } template< typename Y > void set( const boost::reference_wrapper< Y >& r ) { - f_ = lambda_type::make_val( r ); + f_ = lambda_type::make_ref( r ); } template< typename Y > void set( Y* r ) { v_.reset( r ); - f_ = lambda_type::make_val( boost::ref( v_ ) ); + f_ = lambda_type::make_ref( boost::ref( v_ ) ); } std::auto_ptr< Result > v_; diff --git a/turtle/detail/lambda.hpp b/turtle/detail/lambda.hpp index 32fc71d..19d62c0 100644 --- a/turtle/detail/lambda.hpp +++ b/turtle/detail/lambda.hpp @@ -37,18 +37,17 @@ namespace detail template< typename T > static functor_type make_val( T t ) { - return detail::bind( &do_identity< T >, t ); + return detail::bind( &do_val< T >, t ); } template< typename T > - static functor_type make_val( const boost::reference_wrapper< T >& t ) + static functor_type make_ref( const boost::reference_wrapper< T >& t ) { - return detail::bind( - &do_ref_identity< T >, t.get_pointer() ); + return detail::bind( &do_ref< T >, t.get_pointer() ); } template< typename T > static functor_type make_move( T& t ) { - return detail::bind( &do_move< T >, boost::ref( t ) ); + return detail::bind( &do_move< T >, &t ); } template< typename T > static functor_type make_throw( T t ) @@ -60,18 +59,19 @@ namespace detail return detail::bind( &do_nothing ); } + private: template< typename T > - static T do_identity( T t ) + static T do_val( T t ) { return t; } template< typename T > - static T do_move( T& t ) + static T do_move( T* t ) { - return boost::move( t ); + return boost::move( *t ); } template< typename T > - static T& do_ref_identity( T* t ) + static T& do_ref( T* t ) { return *t; }