$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r53182 - trunk/boost/proto/detail
From: eric_at_[hidden]
Date: 2009-05-22 13:44:22
Author: eric_niebler
Date: 2009-05-22 13:44:21 EDT (Fri, 22 May 2009)
New Revision: 53182
URL: http://svn.boost.org/trac/boost/changeset/53182
Log:
fix handling of ptr-to-members in default transforms
Text files modified: 
   trunk/boost/proto/detail/decltype.hpp |    50 ++++++++++++++++++++++++++++----------- 
   1 files changed, 36 insertions(+), 14 deletions(-)
Modified: trunk/boost/proto/detail/decltype.hpp
==============================================================================
--- trunk/boost/proto/detail/decltype.hpp	(original)
+++ trunk/boost/proto/detail/decltype.hpp	2009-05-22 13:44:21 EDT (Fri, 22 May 2009)
@@ -18,6 +18,7 @@
 #include <boost/preprocessor/repetition/enum_binary_params.hpp>
 #include <boost/preprocessor/repetition/repeat_from_to.hpp>
 #include <boost/mpl/if.hpp>
+#include <boost/mpl/and.hpp>
 #include <boost/type_traits/is_class.hpp>
 #include <boost/type_traits/remove_cv.hpp>
 #include <boost/type_traits/remove_reference.hpp>
@@ -262,6 +263,20 @@
                 return boost::addressof(t);
             }
             
+            template<typename U>
+            char test_ptr_to_const(U *);
+
+            template<typename U>
+            char (&test_ptr_to_const(U const *))[2];
+
+            template<typename T>
+            struct is_ref_to_const
+            {
+                static T t;
+                BOOST_STATIC_CONSTANT(bool, value = 2 == sizeof(test_ptr_to_const(get_pointer(t))));
+                typedef mpl::bool_<value> type;
+            };
+
             ////////////////////////////////////////////////////////////////////////////////////////////
             template<
                 typename T
@@ -346,31 +361,38 @@
         struct result_of_
           : boost::result_of<T>
         {};
-        
-        template<typename T, typename U>
-        struct result_of_<T(U), typename enable_if<is_member_object_pointer<T> >::type>
-        {
-            typedef
-                typename result_of_member<T>::type
-            type;
-        };
 
         template<typename T, typename U>
-        struct result_of_<T(U &), typename enable_if<is_member_object_pointer<T> >::type>
+        struct result_of_<T(U), typename enable_if_c<is_member_object_pointer<T>::value>::type>
         {
             typedef
-                typename add_reference<
-                    typename result_of_member<T>::type
+                typename mpl::if_c<
+                    mpl::and_<
+                        has_get_pointer<U>
+                      , get_pointer_::is_ref_to_const<U const &>
+                    >::value
+                  , typename add_reference<
+                        typename add_const<
+                            typename result_of_member<T>::type
+                        >::type
+                    >::type
+                  , typename result_of_member<T>::type
                 >::type
             type;
         };
 
         template<typename T, typename U>
-        struct result_of_<T(U const &), typename enable_if<is_member_object_pointer<T> >::type>
+        struct result_of_<T(U &), typename enable_if_c<is_member_object_pointer<T>::value>::type>
         {
             typedef
-                typename add_reference<
-                    typename add_const<
+                typename mpl::if_c<
+                    get_pointer_::is_ref_to_const<U &>::value
+                  , typename add_reference<
+                        typename add_const<
+                            typename result_of_member<T>::type
+                        >::type
+                    >::type
+                  , typename add_reference<
                         typename result_of_member<T>::type
                     >::type
                 >::type