$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r83253 - in sandbox/type_erasure: boost/type_erasure boost/type_erasure/detail libs/type_erasure/test
From: steven_at_[hidden]
Date: 2013-03-02 16:48:28
Author: steven_watanabe
Date: 2013-03-02 16:48:27 EST (Sat, 02 Mar 2013)
New Revision: 83253
URL: http://svn.boost.org/trac/boost/changeset/83253
Log:
Support rvalue anys as arguments to call.
Text files modified: 
   sandbox/type_erasure/boost/type_erasure/call.hpp                       |    28 ++++++++++++++++++++++++++++            
   sandbox/type_erasure/boost/type_erasure/detail/access.hpp              |    31 +++++++++++++++++++++++++++++++         
   sandbox/type_erasure/boost/type_erasure/detail/adapt_to_vtable.hpp     |    32 ++++++++++++++++++++++++++++++--        
   sandbox/type_erasure/boost/type_erasure/detail/check_call.hpp          |     6 +-----                                  
   sandbox/type_erasure/boost/type_erasure/detail/rebind_placeholders.hpp |    13 +++++++++++++                           
   sandbox/type_erasure/boost/type_erasure/detail/storage.hpp             |     2 +-                                      
   sandbox/type_erasure/libs/type_erasure/test/test_callable.cpp          |    20 ++++++++++++++++++--                    
   7 files changed, 122 insertions(+), 10 deletions(-)
Modified: sandbox/type_erasure/boost/type_erasure/call.hpp
==============================================================================
--- sandbox/type_erasure/boost/type_erasure/call.hpp	(original)
+++ sandbox/type_erasure/boost/type_erasure/call.hpp	2013-03-02 16:48:27 EST (Sat, 02 Mar 2013)
@@ -128,6 +128,34 @@
 
 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
 
+template<class Concept, class T>
+::boost::type_erasure::detail::storage&&
+convert_arg(any_base<any<Concept, T> >&& arg, boost::mpl::true_)
+{
+    return ::boost::type_erasure::detail::access::data(std::move(arg));
+}
+
+template<class Concept, class T>
+::boost::type_erasure::detail::storage&&
+convert_arg(any_base<any<Concept, T&&> >& arg, boost::mpl::true_)
+{
+    return ::boost::type_erasure::detail::access::data(arg);
+}
+
+template<class Concept, class T>
+::boost::type_erasure::detail::storage&&
+convert_arg(param<Concept, T>&& arg, boost::mpl::true_)
+{
+    return ::boost::type_erasure::detail::access::data(std::move(arg));
+}
+
+template<class Concept, class T>
+::boost::type_erasure::detail::storage&&
+convert_arg(param<Concept, T&&>& arg, boost::mpl::true_)
+{
+    return ::boost::type_erasure::detail::access::data(arg);
+}
+
 template<class T>
 T&& convert_arg(T&& arg, boost::mpl::false_) { return std::forward<T>(arg); }
 
Modified: sandbox/type_erasure/boost/type_erasure/detail/access.hpp
==============================================================================
--- sandbox/type_erasure/boost/type_erasure/detail/access.hpp	(original)
+++ sandbox/type_erasure/boost/type_erasure/detail/access.hpp	2013-03-02 16:48:27 EST (Sat, 02 Mar 2013)
@@ -87,6 +87,37 @@
     {
         return arg._impl.data;
     }
+
+#ifndef BOOST_NO_RVALUE_REFERENCES
+
+    template<class Derived>
+    static ::boost::type_erasure::detail::storage&&
+    data(::boost::type_erasure::any_base<Derived>&& arg)
+    {
+        return static_cast<Derived&&>(arg).data;
+    }
+    template<class Concept, class T>
+    static ::boost::type_erasure::detail::storage&&
+    data(::boost::type_erasure::any_base< ::boost::type_erasure::any<Concept, T&&> >& arg)
+    {
+        return static_cast< ::boost::type_erasure::any<Concept, T&&>&>(arg).data;
+    }
+
+    template<class Concept, class T>
+    static ::boost::type_erasure::detail::storage&&
+    data(::boost::type_erasure::param<Concept, T>&& arg)
+    {
+        return std::move(arg._impl.data);
+    }
+    template<class Concept, class T>
+    static ::boost::type_erasure::detail::storage&&
+    data(::boost::type_erasure::param<Concept, T&&>& arg)
+    {
+        return std::move(arg._impl.data);
+    }
+
+#endif
+
 };
 
 }
Modified: sandbox/type_erasure/boost/type_erasure/detail/adapt_to_vtable.hpp
==============================================================================
--- sandbox/type_erasure/boost/type_erasure/detail/adapt_to_vtable.hpp	(original)
+++ sandbox/type_erasure/boost/type_erasure/detail/adapt_to_vtable.hpp	2013-03-02 16:48:27 EST (Sat, 02 Mar 2013)
@@ -83,6 +83,20 @@
     >::type type;
 };
 
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+
+template<class T>
+struct replace_param_for_vtable<T&&>
+{
+    typedef typename ::boost::mpl::if_<
+        ::boost::type_erasure::is_placeholder<typename ::boost::remove_cv<T>::type>,
+        ::boost::type_erasure::detail::storage&&,
+        T&&
+    >::type type;
+};
+
+#endif
+
 template<class T>
 struct replace_result_for_vtable
 {
@@ -113,6 +127,20 @@
     >::type type;
 };
 
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+
+template<class T>
+struct replace_result_for_vtable<T&&>
+{
+    typedef typename ::boost::mpl::if_<
+        ::boost::type_erasure::is_placeholder<typename ::boost::remove_cv<T>::type>,
+        ::boost::type_erasure::detail::storage&&,
+        T&&
+    >::type type;
+};
+
+#endif
+
 template<class Sig>
 struct get_vtable_signature;
 
@@ -158,7 +186,7 @@
     static R value(T... arg)
     {
         return PrimitiveConcept::apply(
-            ::boost::type_erasure::detail::extract<U>(arg)...);
+            ::boost::type_erasure::detail::extract<U>(std::forward<T>(arg))...);
     }
 };
 
@@ -171,7 +199,7 @@
         ::boost::type_erasure::detail::storage result;
         typename ::boost::remove_reference<R2>::type* p =
             ::boost::addressof(
-                PrimitiveConcept::apply(::boost::type_erasure::detail::extract<U>(arg)...));
+                PrimitiveConcept::apply(::boost::type_erasure::detail::extract<U>(std::forward<T>(arg))...));
         result.data = const_cast<void*>(static_cast<const void*>(p));
         return result;
     }
Modified: sandbox/type_erasure/boost/type_erasure/detail/check_call.hpp
==============================================================================
--- sandbox/type_erasure/boost/type_erasure/detail/check_call.hpp	(original)
+++ sandbox/type_erasure/boost/type_erasure/detail/check_call.hpp	2013-03-02 16:48:27 EST (Sat, 02 Mar 2013)
@@ -63,11 +63,7 @@
 struct qualified_placeholder<T&&, typename T::_boost_type_erasure_is_any>
 {
     typedef typename ::boost::type_erasure::placeholder_of<T>::type placeholder;
-    typedef typename ::boost::remove_reference<placeholder>::type unref;
-    typedef typename ::boost::mpl::if_< ::boost::is_reference<placeholder>,
-        unref&,
-        unref&&
-    >::type type;
+    typedef placeholder&& type;
 };
 
 #endif
Modified: sandbox/type_erasure/boost/type_erasure/detail/rebind_placeholders.hpp
==============================================================================
--- sandbox/type_erasure/boost/type_erasure/detail/rebind_placeholders.hpp	(original)
+++ sandbox/type_erasure/boost/type_erasure/detail/rebind_placeholders.hpp	2013-03-02 16:48:27 EST (Sat, 02 Mar 2013)
@@ -70,6 +70,19 @@
     >::type& type;
 };
 
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+
+template<class T, class Bindings>
+struct rebind_placeholders_in_argument<T&&, Bindings>
+{
+    typedef typename ::boost::type_erasure::detail::rebind_placeholders_in_argument<
+        T,
+        Bindings
+    >::type&& type;
+};
+
+#endif
+
 template<class T, class Bindings>
 struct rebind_placeholders_in_argument<const T, Bindings>
 {
Modified: sandbox/type_erasure/boost/type_erasure/detail/storage.hpp
==============================================================================
--- sandbox/type_erasure/boost/type_erasure/detail/storage.hpp	(original)
+++ sandbox/type_erasure/boost/type_erasure/detail/storage.hpp	2013-03-02 16:48:27 EST (Sat, 02 Mar 2013)
@@ -55,7 +55,7 @@
 template<class T>
 T extract(storage&& arg)
 {
-    return static_cast<T>(*static_cast<typename ::boost::remove_reference<T>::type*>(arg.data));
+    return std::move(*static_cast<typename ::boost::remove_reference<T>::type*>(arg.data));
 }
 
 #endif
Modified: sandbox/type_erasure/libs/type_erasure/test/test_callable.cpp
==============================================================================
--- sandbox/type_erasure/libs/type_erasure/test/test_callable.cpp	(original)
+++ sandbox/type_erasure/libs/type_erasure/test/test_callable.cpp	2013-03-02 16:48:27 EST (Sat, 02 Mar 2013)
@@ -388,9 +388,25 @@
         callable<void(int&&)>
     > test_concept;
     any<test_concept> f(&f_rv);
-
+    
+    f_rv_value = 1;
     f(2);
-    BOOST_CHECK_EQUAL(f_rv_value, 2);
+    BOOST_CHECK_EQUAL(f_rv_value, 3);
+}
+
+BOOST_AUTO_TEST_CASE(test_rvalue_any)
+{
+    typedef ::boost::mpl::vector<
+        common<>,
+        common<_a>,
+        callable<void(_a&&)>
+    > test_concept;
+    
+    tuple<test_concept, _self, _a> t1(&f_rv, 3);
+    any<test_concept> x1(get<0>(t1));
+    f_rv_value = 1;
+    x1(std::move(get<1>(t1)));
+    BOOST_CHECK_EQUAL(f_rv_value, 4);
 }
 
 #endif