forked from boostorg/smart_ptr
Add test for make_shared's move-emulation support
This tests the functionality added with PR boostorg/smart_ptr#24. Specifically this tests that passing moveable-only types to constructors is possible through make_shared. Note that real rvalue's still cannot be passed that way on C++03 unfortunately because there's no generic way of accomplishing that with current move emulation.
This commit is contained in:
@ -47,6 +47,7 @@ import testing ;
|
|||||||
[ run spinlock_try_test.cpp : : : <threading>multi : spinlock_try_test.mt ]
|
[ run spinlock_try_test.cpp : : : <threading>multi : spinlock_try_test.mt ]
|
||||||
[ run spinlock_pool_test.cpp ]
|
[ run spinlock_pool_test.cpp ]
|
||||||
[ run make_shared_test.cpp ]
|
[ run make_shared_test.cpp ]
|
||||||
|
[ run make_shared_move_emulation_test.cpp ]
|
||||||
[ run make_shared_perfect_forwarding_test.cpp ]
|
[ run make_shared_perfect_forwarding_test.cpp ]
|
||||||
[ run shared_ptr_convertible_test.cpp ]
|
[ run shared_ptr_convertible_test.cpp ]
|
||||||
[ run wp_convertible_test.cpp ]
|
[ run wp_convertible_test.cpp ]
|
||||||
|
81
test/make_shared_move_emulation_test.cpp
Normal file
81
test/make_shared_move_emulation_test.cpp
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
// make_shared_move_emulation_test.cpp - a test of make_shared
|
||||||
|
// semi-perfect forwarding of constructor arguments when using a C++03
|
||||||
|
// compiler with move emulation.
|
||||||
|
// Note the "semi": it means moving temporaries (real r-values) doesn't work.
|
||||||
|
//
|
||||||
|
// Copyright 2016 Giel van Schijndel
|
||||||
|
//
|
||||||
|
// Distributed under the Boost Software License, Version 1.0.
|
||||||
|
// See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
// http://www.boost.org/LICENSE_1_0.txt
|
||||||
|
|
||||||
|
#include <boost/detail/lightweight_test.hpp>
|
||||||
|
#include <boost/make_shared.hpp>
|
||||||
|
#include <boost/move/core.hpp>
|
||||||
|
#include <boost/move/utility_core.hpp>
|
||||||
|
#include <boost/shared_ptr.hpp>
|
||||||
|
|
||||||
|
class movearg
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
BOOST_MOVABLE_BUT_NOT_COPYABLE(movearg)
|
||||||
|
public:
|
||||||
|
movearg()
|
||||||
|
{}
|
||||||
|
movearg(BOOST_RV_REF(movearg))
|
||||||
|
{}
|
||||||
|
movearg& operator=(BOOST_RV_REF(movearg))
|
||||||
|
{
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class ByVal
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ByVal(movearg) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
class ByRef
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum constructor_id
|
||||||
|
{
|
||||||
|
move_constructor,
|
||||||
|
const_ref_constructor
|
||||||
|
};
|
||||||
|
|
||||||
|
ByRef(BOOST_RV_REF(movearg)): constructed_by_(move_constructor)
|
||||||
|
{}
|
||||||
|
ByRef(const movearg &arg): constructed_by_(const_ref_constructor)
|
||||||
|
{}
|
||||||
|
|
||||||
|
constructor_id constructed_by_;
|
||||||
|
};
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
{
|
||||||
|
movearg a;
|
||||||
|
boost::shared_ptr< ByVal > x = boost::make_shared< ByVal >(boost::move(a));
|
||||||
|
}
|
||||||
|
{
|
||||||
|
movearg a;
|
||||||
|
boost::shared_ptr< ByRef > x = boost::make_shared< ByRef >(boost::move(a));
|
||||||
|
BOOST_TEST( x->constructed_by_ == ByRef::move_constructor);
|
||||||
|
}
|
||||||
|
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
|
||||||
|
{
|
||||||
|
boost::shared_ptr< ByVal > x = boost::make_shared< ByVal >(movearg());
|
||||||
|
boost::shared_ptr< ByRef > y = boost::make_shared< ByRef >(movearg());
|
||||||
|
BOOST_TEST( y->constructed_by_ == ByRef::move_constructor);
|
||||||
|
}
|
||||||
|
#endif // !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
|
||||||
|
{
|
||||||
|
const movearg ca;
|
||||||
|
boost::shared_ptr< ByRef > x = boost::make_shared< ByRef >(ca);
|
||||||
|
BOOST_TEST( x->constructed_by_ == ByRef::const_ref_constructor);
|
||||||
|
}
|
||||||
|
|
||||||
|
return boost::report_errors();
|
||||||
|
}
|
Reference in New Issue
Block a user