$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
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