Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r57520 - in trunk: boost/smart_ptr libs/smart_ptr/test
From: fmhess_at_[hidden]
Date: 2009-11-09 13:12:36


Author: fmhess
Date: 2009-11-09 13:12:35 EST (Mon, 09 Nov 2009)
New Revision: 57520
URL: http://svn.boost.org/trac/boost/changeset/57520

Log:
Fixed perfect forwarding for make_shared() in trunk, and added
corresponding test. Refs #2962.

Added:
   trunk/libs/smart_ptr/test/make_shared_perfect_forwarding_test.cpp (contents, props changed)
Text files modified:
   trunk/boost/smart_ptr/make_shared.hpp | 4 +++-
   trunk/libs/smart_ptr/test/Jamfile.v2 | 1 +
   2 files changed, 4 insertions(+), 1 deletions(-)

Modified: trunk/boost/smart_ptr/make_shared.hpp
==============================================================================
--- trunk/boost/smart_ptr/make_shared.hpp (original)
+++ trunk/boost/smart_ptr/make_shared.hpp 2009-11-09 13:12:35 EST (Mon, 09 Nov 2009)
@@ -86,10 +86,12 @@
     }
 };
 
-template< class T > T forward( T t )
+#if defined( BOOST_HAS_RVALUE_REFS )
+template< class T > T&& forward( T &&t )
 {
     return t;
 }
+#endif
 
 } // namespace detail
 

Modified: trunk/libs/smart_ptr/test/Jamfile.v2
==============================================================================
--- trunk/libs/smart_ptr/test/Jamfile.v2 (original)
+++ trunk/libs/smart_ptr/test/Jamfile.v2 2009-11-09 13:12:35 EST (Mon, 09 Nov 2009)
@@ -45,6 +45,7 @@
           [ run spinlock_try_test.cpp : : : <threading>multi : spinlock_try_test.mt ]
           [ run spinlock_pool_test.cpp ]
           [ run make_shared_test.cpp ]
+ [ run make_shared_perfect_forwarding_test.cpp ]
           [ run sp_convertible_test.cpp ]
           [ run wp_convertible_test.cpp ]
           [ run ip_convertible_test.cpp ]

Added: trunk/libs/smart_ptr/test/make_shared_perfect_forwarding_test.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/smart_ptr/test/make_shared_perfect_forwarding_test.cpp 2009-11-09 13:12:35 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,98 @@
+// make_shared_perfect_forwarding_test.cpp - a test of make_shared
+// perfect forwarding of constructor arguments when using a C++0x
+// compiler.
+//
+// Copyright 2009 Frank Mori Hess
+//
+// 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/shared_ptr.hpp>
+
+#ifndef BOOST_HAS_RVALUE_REFS
+
+int main()
+{
+ return 0;
+}
+
+#else // BOOST_HAS_RVALUE_REFS
+
+class myarg
+{
+public:
+ myarg()
+ {}
+private:
+ myarg(myarg && other)
+ {}
+ myarg& operator=(myarg && other)
+ {
+ return *this;
+ }
+ myarg(const myarg & other)
+ {}
+ myarg& operator=(const myarg & other)
+ {
+ return *this;
+ }
+};
+
+class X
+{
+public:
+ enum constructor_id
+ {
+ move_constructor,
+ const_ref_constructor,
+ ref_constructor
+ };
+
+ X(myarg &&arg): constructed_by_(move_constructor)
+ {}
+ X(const myarg &arg): constructed_by_(const_ref_constructor)
+ {}
+ X(myarg &arg): constructed_by_(ref_constructor)
+ {}
+
+ constructor_id constructed_by_;
+};
+
+struct Y
+{
+ Y(int &value): ref(value)
+ {}
+ int &ref;
+};
+
+int main()
+{
+ {
+ myarg a;
+ boost::shared_ptr< X > x = boost::make_shared< X >(a);
+ BOOST_TEST( x->constructed_by_ == X::ref_constructor);
+ }
+ {
+ const myarg ca;
+ boost::shared_ptr< X > x = boost::make_shared< X >(ca);
+ BOOST_TEST( x->constructed_by_ == X::const_ref_constructor);
+ }
+ {
+ boost::shared_ptr< X > x = boost::make_shared< X >(myarg());
+ BOOST_TEST( x->constructed_by_ == X::move_constructor);
+ }
+ {
+ int value = 1;
+ boost::shared_ptr< Y > y = boost::make_shared< Y >(value);
+ BOOST_TEST( y->ref == 1 && value == y->ref );
+ ++y->ref;
+ BOOST_TEST( value == y->ref );
+ }
+
+ return boost::report_errors();
+}
+
+#endif // BOOST_HAS_RVALUE_REFS


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk