$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r55779 - in sandbox/SOC/2009/fusion: . boost/fusion/algorithm/iteration/detail boost/fusion/functional/invocation/detail/0x boost/fusion/support boost/fusion/support/internal boost/fusion/view/detail libs/fusion/test/compile_time
From: mr.chr.schmidt_at_[hidden]
Date: 2009-08-25 16:52:52
Author: cschmidt
Date: 2009-08-25 16:52:51 EDT (Tue, 25 Aug 2009)
New Revision: 55779
URL: http://svn.boost.org/trac/boost/changeset/55779
Log:
optimizations
Text files modified: 
   sandbox/SOC/2009/fusion/boost/fusion/algorithm/iteration/detail/fold.hpp                    |   142 +++++++++++++++++++++++---------------- 
   sandbox/SOC/2009/fusion/boost/fusion/algorithm/iteration/detail/for_each.hpp                |    13 +--                                     
   sandbox/SOC/2009/fusion/boost/fusion/functional/invocation/detail/0x/invoke_impl_detail.hpp |    20 +++-                                    
   sandbox/SOC/2009/fusion/boost/fusion/support/deduce.hpp                                     |     2                                         
   sandbox/SOC/2009/fusion/boost/fusion/support/internal/ref.hpp                               |     2                                         
   sandbox/SOC/2009/fusion/boost/fusion/support/internal/result_of.hpp                         |   114 +++++++++++++++++++------------         
   sandbox/SOC/2009/fusion/boost/fusion/view/detail/view_storage.hpp                           |    14 +-                                      
   sandbox/SOC/2009/fusion/libs/fusion/test/compile_time/fold.cpp                              |    11 +++                                     
   sandbox/SOC/2009/fusion/project-root.jam                                                    |     6                                         
   9 files changed, 191 insertions(+), 133 deletions(-)
Modified: sandbox/SOC/2009/fusion/boost/fusion/algorithm/iteration/detail/fold.hpp
==============================================================================
--- sandbox/SOC/2009/fusion/boost/fusion/algorithm/iteration/detail/fold.hpp	(original)
+++ sandbox/SOC/2009/fusion/boost/fusion/algorithm/iteration/detail/fold.hpp	2009-08-25 16:52:51 EDT (Tue, 25 Aug 2009)
@@ -22,9 +22,9 @@
 #include <boost/mpl/eval_if.hpp>
 #include <boost/mpl/if.hpp>
 #include <boost/mpl/bool.hpp>
-#include <boost/mpl/apply.hpp>
-#include <boost/mpl/identity.hpp>
-#include <boost/type_traits/add_const.hpp>
+#ifdef BOOST_NO_RVALUE_REFERENCES
+#   include <boost/type_traits/add_const.hpp>
+#endif
 
 namespace boost { namespace fusion { namespace detail
 {
@@ -124,105 +124,127 @@
         }
     };
 
-    template <typename It, typename StateRef, typename FRef>
+    template <typename It, typename StateRef, typename F>
     struct fold_apply
     {
-        typedef typename result_of::deref<It>::type deref_type;
-
-#ifdef BOOST_NO_RVALUE_REFERENCES
-        typedef typename
-            boost::result_of<
-                typename get_func_base<FRef>::type(deref_type, StateRef)
-            >::type
-        type;
-#else
         typedef typename
             boost::result_of<
-                typename get_func_base<FRef>::type(
-                typename mpl::if_<
-                    is_lrref<deref_type>
-                  , deref_type
-                  , deref_type&&
+                F(
+#ifdef BOOST_NO_RVALUE_REFERENCES
+                typename add_lref<
+                    typename add_const<
+                        typename result_of::deref<It>::type
+                    >::type
                 >::type
-              , StateRef
-                )
+#else
+                typename result_of::deref<It>::type&&
+#endif
+              , StateRef)
             >::type
         type;
-#endif
     };
 
-    template <typename It, typename State, typename FRef>
-    struct fold_apply_r_else_clref
-#ifdef BOOST_NO_RVALUE_REFERENCES
+    template <typename It, typename State, typename F>
+    struct fold_apply_rvalue_state
       : fold_apply<
             It
+#ifdef BOOST_NO_RVALUE_REFERENCES
           , typename add_lref<typename add_const<State>::type>::type
-          , FRef
-        >
 #else
-      : fold_apply<It,State&&,FRef>
+          , State&&
 #endif
+          , F
+        >
     {};
 
-    template<typename It0, typename StateRef, typename FRef, int N>
+    template<typename It0, typename StateRef, typename F, int N>
     struct result_of_unrolled_fold
     {
-        typedef typename fold_apply<It0, StateRef, FRef>::type rest1;
+        typedef typename fold_apply_rvalue_state<It0, StateRef, F>::type rest1;
         typedef typename result_of::next<It0>::type it1;
-        typedef typename fold_apply_r_else_clref<it1, rest1, FRef>::type rest2;
+        typedef typename fold_apply_rvalue_state<it1, rest1, F>::type rest2;
         typedef typename result_of::next<it1>::type it2;
-        typedef typename fold_apply_r_else_clref<it2, rest2, FRef>::type rest3;
+        typedef typename fold_apply_rvalue_state<it2, rest2, F>::type rest3;
         typedef typename result_of::next<it2>::type it3;
-        typedef typename fold_apply_r_else_clref<it3, rest3, FRef>::type rest4;
-        typedef typename result_of::next<it3>::type it4;
 
         typedef typename
-            mpl::eval_if_c<
-                !(N-4)
-              , mpl::identity<rest4>
-              , result_of_unrolled_fold<
-                    it4
-                  , BOOST_FUSION_R_ELSE_CLREF(rest4)
-                  , FRef
-                  , N-4
-                >
+            result_of_unrolled_fold<
+                typename result_of::next<it3>::type
+              , typename fold_apply_rvalue_state<it3, rest3, F>::type
+              , F
+              , N-4
             >::type
         type;
     };
 
-    template<typename It0, typename StateRef, typename FRef>
-    struct result_of_unrolled_fold<It0, StateRef, FRef, 3>
+    template<typename It0, typename StateRef, typename F>
+    struct result_of_unrolled_fold<It0, StateRef, F, 3>
     {
-        typedef typename fold_apply<It0, StateRef, FRef>::type rest1;
+        typedef typename fold_apply_rvalue_state<It0, StateRef, F>::type rest1;
         typedef typename result_of::next<It0>::type it1;
-        typedef typename fold_apply_r_else_clref<it1, rest1, FRef>::type rest2;
-        typedef typename result_of::next<it1>::type it2;
 
-        typedef typename fold_apply_r_else_clref<it2, rest2, FRef>::type type;
+        typedef typename
+            fold_apply_rvalue_state<
+            typename result_of::next<it1>::type
+              , typename fold_apply_rvalue_state<it1, rest1, F>::type
+              , F
+            >::type
+        type;
     };
 
-    template<typename It0, typename StateRef, typename FRef>
-    struct result_of_unrolled_fold<It0, StateRef, FRef, 2>
+    template<typename It0, typename StateRef, typename F>
+    struct result_of_unrolled_fold<It0, StateRef, F, 2>
     {
-        typedef typename fold_apply<It0, StateRef, FRef>::type rest;
-        typedef typename result_of::next<It0>::type it1;
-
-        typedef typename fold_apply_r_else_clref<it1, rest, FRef>::type type;
+        typedef typename
+            fold_apply_rvalue_state<
+                typename result_of::next<It0>::type
+              , typename fold_apply_rvalue_state<It0, StateRef, F>::type
+              , F
+            >::type
+        type;
     };
 
-    template<typename It0, typename StateRef, typename FRef>
-    struct result_of_unrolled_fold<It0, StateRef, FRef, 1>
-      : fold_apply_r_else_clref<It0, StateRef, FRef>
+    template<typename It0, typename StateRef, typename F>
+    struct result_of_unrolled_fold<It0, StateRef, F, 1>
+      : fold_apply_rvalue_state<It0, StateRef, F>
     {};
 
+    template<typename It0, typename StateRef, typename F>
+    struct result_of_unrolled_fold<It0, StateRef, F, 0>
+    {
+        typedef StateRef type;
+    };
+
+    template<typename It0, typename StateRef, typename FRef, int SeqSize>
+    struct result_of_unrolled_fold_first
+    {
+        typedef typename get_func_base<FRef>::type f;
+
+        typedef typename
+            result_of_unrolled_fold<
+                typename result_of::next<It0>::type
+              , typename fold_apply<It0, StateRef, f>::type
+              , f
+              , SeqSize-1
+            >::type
+        type;
+    };
+
     template<int SeqSize, typename It0, typename StateRef, typename FRef>
     struct fold_impl
     {
+        typedef preevaluate<FRef> preevaluater;
+
         typedef typename
             mpl::eval_if<
-                typename is_preevaluable<FRef>::type
-              , preevaluate<FRef>
-              , result_of_unrolled_fold<It0, StateRef, FRef, SeqSize>
+                typename preevaluater::is_preevaluable
+              , preevaluater
+              , result_of_unrolled_fold_first<
+                    It0
+                  , StateRef
+                  , FRef
+                  , SeqSize
+                >
             >::type
         type;
 
Modified: sandbox/SOC/2009/fusion/boost/fusion/algorithm/iteration/detail/for_each.hpp
==============================================================================
--- sandbox/SOC/2009/fusion/boost/fusion/algorithm/iteration/detail/for_each.hpp	(original)
+++ sandbox/SOC/2009/fusion/boost/fusion/algorithm/iteration/detail/for_each.hpp	2009-08-25 16:52:51 EDT (Tue, 25 Aug 2009)
@@ -39,8 +39,8 @@
             f(fusion::deref(it3));
 
             for_each_unrolled<N-4>::call(
-                    fusion::next(it3)
-                  , BOOST_FUSION_FORWARD(F,f));
+                    fusion::next(it3),
+                    BOOST_FUSION_FORWARD(F,f));
         }
     };
 
@@ -52,12 +52,10 @@
         {
             typedef typename result_of::next<It0 const&>::type It1;
             It1 it1(fusion::next(it0));
-            typedef typename result_of::next<It1&>::type It2;
-            It2 it2(fusion::next(it1));
 
             f(fusion::deref(it0));
             f(fusion::deref(it1));
-            f(fusion::deref(it2));
+            f(fusion::deref(fusion::next(it1)));
         }
     };
 
@@ -67,11 +65,8 @@
         template<typename It0, typename F>
         static void call(It0 const& it0, BOOST_FUSION_R_ELSE_CLREF(F) f)
         {
-            typedef typename result_of::next<It0 const&>::type It1;
-            It1 it1(fusion::next(it0));
-
             f(fusion::deref(it0));
-            f(fusion::deref(it1));
+            f(fusion::deref(fusion::next(it0)));
         }
     };
 
Modified: sandbox/SOC/2009/fusion/boost/fusion/functional/invocation/detail/0x/invoke_impl_detail.hpp
==============================================================================
--- sandbox/SOC/2009/fusion/boost/fusion/functional/invocation/detail/0x/invoke_impl_detail.hpp	(original)
+++ sandbox/SOC/2009/fusion/boost/fusion/functional/invocation/detail/0x/invoke_impl_detail.hpp	2009-08-25 16:52:51 EDT (Tue, 25 Aug 2009)
@@ -70,9 +70,13 @@
         >::type
     invoke_impl_call(F&& f, ClassInstance&& instance,Args&&... args)
     {
-        return (that_ptr<typename detail::preevaluate<F>::class_type>::
+        typedef typename
+            detail::preevaluate<F>::gen::class_type
+        class_type;
+
+        return (that_ptr<class_type>::
                     get(std::forward<ClassInstance>(instance))->*f)(
-                            std::forward<Args>(args)...);
+                        std::forward<Args>(args)...);
     }
 
     namespace bidirectional_traversal
@@ -106,10 +110,12 @@
         template<typename FRef,typename SeqRef>
         struct invoke_impl
         {
+            typedef detail::preevaluate<FRef> preevaluater;
+
             typedef typename
                 mpl::eval_if<
-                    typename detail::is_preevaluable<FRef>::type
-                  , detail::preevaluate<FRef>
+                    typename preevaluater::is_preevaluable
+                  , preevaluater
                   , invoke_impl_result<
                         FRef
                       , SeqRef
@@ -185,10 +191,12 @@
         template<typename FRef,typename SeqRef>
         struct invoke_impl
         {
+            typedef detail::preevaluate<FRef> preevaluater;
+
             typedef typename
                 mpl::eval_if<
-                    typename detail::is_preevaluable<FRef>::type
-                  , detail::preevaluate<FRef>
+                    typename preevaluater::is_preevaluable
+                  , preevaluater
                   , invoke_impl_result<
                         FRef
                       , SeqRef
Modified: sandbox/SOC/2009/fusion/boost/fusion/support/deduce.hpp
==============================================================================
--- sandbox/SOC/2009/fusion/boost/fusion/support/deduce.hpp	(original)
+++ sandbox/SOC/2009/fusion/boost/fusion/support/deduce.hpp	2009-08-25 16:52:51 EDT (Tue, 25 Aug 2009)
@@ -44,7 +44,7 @@
             \
             typedef typename\
                 mpl::eval_if<\
-                    is_po_callable\
+                    typename is_po_callable::type\
                   , mpl::if_<\
                         typename is_po_callable::is_pointer\
                       , T\
Modified: sandbox/SOC/2009/fusion/boost/fusion/support/internal/ref.hpp
==============================================================================
--- sandbox/SOC/2009/fusion/boost/fusion/support/internal/ref.hpp	(original)
+++ sandbox/SOC/2009/fusion/boost/fusion/support/internal/ref.hpp	2009-08-25 16:52:51 EDT (Tue, 25 Aug 2009)
@@ -182,7 +182,7 @@
                 mpl::eval_if<
                     is_rref<TestType>
                   , mpl::identity<cv_type&&>
-                  , detail::add_lref<cv_type>
+                  , add_lref<cv_type>
                 >,
                 mpl::identity<cv_type>
             >::type
Modified: sandbox/SOC/2009/fusion/boost/fusion/support/internal/result_of.hpp
==============================================================================
--- sandbox/SOC/2009/fusion/boost/fusion/support/internal/result_of.hpp	(original)
+++ sandbox/SOC/2009/fusion/boost/fusion/support/internal/result_of.hpp	2009-08-25 16:52:51 EDT (Tue, 25 Aug 2009)
@@ -12,8 +12,20 @@
 //Therefore we emulate the old behavior if (and only if) the boost
 //implementation falls back to decltype by default.
 
+#include <boost/config.hpp>
 #include <boost/fusion/support/internal/ref.hpp>
 
+#if defined(BOOST_NO_DECLTYPE) || !defined(BOOST_NO_VARIADIC_TEMPLATES)
+#   include <boost/mpl/bool.hpp>
+#endif
+#ifdef BOOST_NO_DECLTYPE
+#   include <boost/mpl/has_xxx.hpp>
+#   include <boost/mpl/eval_if.hpp>
+#   include <boost/mpl/identity.hpp>
+#endif
+#ifndef BOOST_NO_VARIADIC_TEMPLATES
+#   include <boost/mpl/identity.hpp>
+#endif
 #include <boost/mpl/if.hpp>
 #include <boost/mpl/or.hpp>
 #include <boost/type_traits/is_pointer.hpp>
@@ -24,7 +36,7 @@
 
 namespace boost { namespace fusion { namespace detail
 {
-    //cschmidt: These metafunction needs to handle
+    //cschmidt: This metafunction needs to handle
     //T()
     //T(&)()
     //T(cv&)()
@@ -46,47 +58,56 @@
     //& -> &&
 
     template<typename FRef>
-    struct is_po_callable_impl
+    struct is_po_callable
     {
-        typedef typename detail::identity<FRef>::type f;
-        typedef typename is_pointer<f>::type is_pointer;
+        typedef typename identity<FRef>::type identity_f;
+        typedef typename is_pointer<identity_f>::type is_pointer;
+        typedef typename remove_pointer<identity_f>::type f;
 
         typedef
             mpl::or_<
-                is_function<typename remove_pointer<f>::type>
+                is_function<f>
               , is_member_function_pointer<f>
             >
         type;
     };
 
-    template<typename FRef>
-    struct is_po_callable
-      : is_po_callable_impl<FRef>::type
+#ifdef BOOST_NO_DECLTYPE
+    BOOST_MPL_HAS_XXX_TRAIT_DEF(result_type);
+
+    template<typename F>
+    struct get_result_type
     {
-        typedef typename is_po_callable_impl<FRef>::is_pointer is_pointer;
+        typedef typename F::result_type type;
     };
 
-//cschmidt: a pp implementation won't be worth the effort
-#ifdef BOOST_NO_VARIADIC_TEMPLATES
-    template<typename FRef>
-    struct is_preevaluable
-      : mpl::false_
-    {};
-
-    template<typename FRef>
-    struct preevaluate;
+    template<typename F>
+    struct preevaluate_impl
+    {
+        typedef typename has_result_type<F>::type is_preevaluable;
+        typedef typename
+            mpl::eval_if<
+                is_preevaluable
+              , get_result_type<F>
+              , mpl::identity<void>
+            >::type
+        type;
+    };
 #else
-    template<typename FRef>
-    struct is_preevaluable
-      : is_po_callable<FRef>
-    {};
-
-    template<typename FRef>
-    struct preevaluate_impl;
+    template<typename F>
+    struct preevaluate_impl
+    {
+        typedef mpl::false_ is_preevaluable;
+        typedef void type;
+    };
+#endif
 
+    //cschmidt: a pp implementation won't be worth the effort
+#ifndef BOOST_NO_VARIADIC_TEMPLATES
     template<typename Result,typename... Args>
     struct preevaluate_impl<Result (Args...)>
     {
+        typedef mpl::true_ is_preevaluable;
         typedef Result type;
     };
 
@@ -95,6 +116,7 @@
     {
         typedef Class& class_type;
 
+        typedef mpl::true_ is_preevaluable;
         typedef Result type;
     };
 
@@ -105,7 +127,7 @@
     struct preevaluate_impl<Result(Class::*)(Args...) const>
     {
         typedef Class const& class_type;
-
+        typedef mpl::true_ is_preevaluable;
         typedef Result type;
     };
 
@@ -113,7 +135,7 @@
     struct preevaluate_impl<Result(Class::*)(Args...) const volatile>
     {
         typedef Class const volatile& class_type;
-
+        typedef mpl::true_ is_preevaluable;
         typedef Result type;
     };
 
@@ -121,39 +143,39 @@
     struct preevaluate_impl<Result(Class::*)(Args...) volatile>
     {
         typedef Class volatile& class_type;
-
+        typedef mpl::true_ is_preevaluable;
         typedef Result type;
     };
+#endif
 
     template<typename FRef>
     struct preevaluate
-      : preevaluate_impl<
-            typename remove_pointer<
-                typename detail::identity<FRef>::type
-            >::type
-        >
-    {};
+    {
+#if defined(BOOST_NO_VARIADIC_TEMPLATES) && !defined(BOOST_NO_DECLTYPE)
+        typedef mpl::false_ is_preevaluable;
+#else
+        typedef
+            preevaluate_impl<
+                typename remove_pointer<typename identity<FRef>::type>::type
+            >
+        impl;
+
+        typedef impl gen;
+        typedef typename impl::type type;
+        typedef typename impl::is_preevaluable is_preevaluable;
 #endif
+    };
 
-    //cschmidt: The non-decltype result_of does not like ref-qualified
+    //cschmidt: Result_of does not like ref-qualified
     //'class type' functions
     template<typename FRef>
     struct get_func_base
     {
         typedef typename
-            remove_pointer<
-                typename detail::identity<FRef>::type
-            >::type
-        f;
-
-        typedef typename
             mpl::if_<
-                mpl::or_<
-                   typename is_function<f>::type
-                 , typename is_member_function_pointer<f>::type
-                >
+                typename is_po_callable<FRef>::type
               , FRef
-              , f
+              , typename is_po_callable<FRef>::f
             >::type
         type;
     };
Modified: sandbox/SOC/2009/fusion/boost/fusion/view/detail/view_storage.hpp
==============================================================================
--- sandbox/SOC/2009/fusion/boost/fusion/view/detail/view_storage.hpp	(original)
+++ sandbox/SOC/2009/fusion/boost/fusion/view/detail/view_storage.hpp	2009-08-25 16:52:51 EDT (Tue, 25 Aug 2009)
@@ -31,7 +31,7 @@
         }
 
         template<typename OtherT>
-        static typename detail::remove_reference<OtherT>::type*
+        static typename remove_reference<OtherT>::type*
         get_init_type(BOOST_FUSION_R_ELSE_LREF(OtherT) other_t, mpl::false_)
         {
             return &other_t;
@@ -41,8 +41,8 @@
         typedef typename
             mpl::if_<
                 traits::is_view<T>
-              , typename detail::remove_reference<T>::type
-              , typename detail::add_lref<T>::type
+              , typename remove_reference<T>::type
+              , typename add_lref<T>::type
             >::type
         type;
 
@@ -50,7 +50,7 @@
         typedef typename
             mpl::if_<
                 traits::is_view<T>
-              , typename detail::add_lref<typename add_const<T>::type>::type
+              , typename add_lref<typename add_const<T>::type>::type
               , type
             >::type
         call_param;
@@ -89,7 +89,7 @@
 
         typename mpl::if_<
             traits::is_view<T>
-          , typename detail::add_lref<type>::type
+          , typename add_lref<type>::type
           , type
         >::type
         get() const
@@ -98,7 +98,7 @@
         }
 
     private:
-        typename detail::add_lref<type>::type
+        typename add_lref<type>::type
         get(mpl::true_ /*is_view*/)const
         {
             return t;
@@ -110,7 +110,7 @@
             return *t;
         }
 
-        typedef typename detail::remove_reference<T>::type non_ref_t;
+        typedef typename remove_reference<T>::type non_ref_t;
         mutable typename
             mpl::if_<
                 traits::is_view<T>
Modified: sandbox/SOC/2009/fusion/libs/fusion/test/compile_time/fold.cpp
==============================================================================
--- sandbox/SOC/2009/fusion/libs/fusion/test/compile_time/fold.cpp	(original)
+++ sandbox/SOC/2009/fusion/libs/fusion/test/compile_time/fold.cpp	2009-08-25 16:52:51 EDT (Tue, 25 Aug 2009)
@@ -19,7 +19,18 @@
 
   struct f
   {
+#ifdef NO_PREEVALUATE
+    template<typename Sig>
+    struct result;
+
+    template<typename Self, typename D, typename State>
+    struct result<Self(D,State)>
+    {
+        typedef int type;
+    };
+#else
     typedef int result_type;
+#endif
 
     template<int n, int batch>
     int operator()(distinct<n, batch> const& d, int state) const
Modified: sandbox/SOC/2009/fusion/project-root.jam
==============================================================================
--- sandbox/SOC/2009/fusion/project-root.jam	(original)
+++ sandbox/SOC/2009/fusion/project-root.jam	2009-08-25 16:52:51 EDT (Tue, 25 Aug 2009)
@@ -14,14 +14,14 @@
                    <include>$(BOOST_INCLUDES_PATH)
                    <define>BOOST_FUSION_ENABLE_STATIC_ASSERTS
                    <define>BOOST_FUSION_PREFER_MPL
-                   <toolset>gcc:<cxxflags>-std=c++0x
+#                   <toolset>gcc:<cxxflags>-std=c++0x
     : build-dir ../bin
     : default-build debug <link>shared <runtime-link>shared <threading>multi
     ;
 
 build-project libs/fusion/example/test ;
 
-build-project libs/fusion/doc ;
+#build-project libs/fusion/doc ;
 #build-project libs/fusion/example/extension ;
-build-project libs/fusion/example/performance ;
+#build-project libs/fusion/example/performance ;
 build-project libs/fusion/test ;
\ No newline at end of file