$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r53566 - in trunk/boost/fusion: container/vector/detail support/detail
From: eric_at_[hidden]
Date: 2009-06-02 01:46:22
Author: eric_niebler
Date: 2009-06-02 01:46:21 EDT (Tue, 02 Jun 2009)
New Revision: 53566
URL: http://svn.boost.org/trac/boost/changeset/53566
Log:
reduce number of template instantiations
Text files modified: 
   trunk/boost/fusion/container/vector/detail/at_impl.hpp          |    21 ++++++++++-----                         
   trunk/boost/fusion/container/vector/detail/vector_n_chooser.hpp |    52 +++++++++++++-------------------------- 
   trunk/boost/fusion/support/detail/access.hpp                    |    37 +++++++++++++++++----------             
   3 files changed, 54 insertions(+), 56 deletions(-)
Modified: trunk/boost/fusion/container/vector/detail/at_impl.hpp
==============================================================================
--- trunk/boost/fusion/container/vector/detail/at_impl.hpp	(original)
+++ trunk/boost/fusion/container/vector/detail/at_impl.hpp	2009-06-02 01:46:21 EDT (Tue, 02 Jun 2009)
@@ -28,13 +28,7 @@
             struct apply 
             {
                 typedef mpl::at<typename Sequence::types, N> element;
-                typedef typename
-                    mpl::eval_if<
-                        is_const<Sequence>
-                      , detail::cref_result<element>
-                      , detail::ref_result<element>
-                    >::type
-                type;
+                typedef typename detail::ref_result<element>::type type;
     
                 static type
                 call(Sequence& v)
@@ -42,6 +36,19 @@
                     return v.at_impl(N());
                 }
             };
+
+            template <typename Sequence, typename N>
+            struct apply <Sequence const, N>
+            {
+                typedef mpl::at<typename Sequence::types, N> element;
+                typedef typename detail::cref_result<element>::type type;
+    
+                static type
+                call(Sequence const& v)
+                {
+                    return v.at_impl(N());
+                }
+            };
         };
     }
 }}
Modified: trunk/boost/fusion/container/vector/detail/vector_n_chooser.hpp
==============================================================================
--- trunk/boost/fusion/container/vector/detail/vector_n_chooser.hpp	(original)
+++ trunk/boost/fusion/container/vector/detail/vector_n_chooser.hpp	2009-06-02 01:46:21 EDT (Tue, 02 Jun 2009)
@@ -25,11 +25,12 @@
 #include <boost/fusion/container/vector/vector50.hpp>
 #endif
 
-#include <boost/mpl/distance.hpp>
-#include <boost/mpl/find.hpp>
-#include <boost/mpl/begin_end.hpp>
 #include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/arithmetic/dec.hpp>
+#include <boost/preprocessor/arithmetic/sub.hpp>
+#include <boost/preprocessor/facilities/intercept.hpp>
 #include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_trailing_params.hpp>
 
 namespace boost { namespace fusion
 {
@@ -38,40 +39,23 @@
 
 namespace boost { namespace fusion { namespace detail
 {
-    template <int N>
-    struct get_vector_n;
+    template <BOOST_PP_ENUM_PARAMS(FUSION_MAX_VECTOR_SIZE, typename T)>
+    struct vector_n_chooser
+    {
+        typedef BOOST_PP_CAT(vector, FUSION_MAX_VECTOR_SIZE)<BOOST_PP_ENUM_PARAMS(FUSION_MAX_VECTOR_SIZE, T)> type;
+    };
 
     template <>
-    struct get_vector_n<0>
+    struct vector_n_chooser<BOOST_PP_ENUM_PARAMS(FUSION_MAX_VECTOR_SIZE, void_ BOOST_PP_INTERCEPT)>
     {
-        template <BOOST_PP_ENUM_PARAMS(FUSION_MAX_VECTOR_SIZE, typename T)>
-        struct call
-        {
-            typedef vector0 type;
-        };
+        typedef vector0 type;
     };
 
 #define BOOST_PP_FILENAME_1 \
     <boost/fusion/container/vector/detail/vector_n_chooser.hpp>
-#define BOOST_PP_ITERATION_LIMITS (1, FUSION_MAX_VECTOR_SIZE)
+#define BOOST_PP_ITERATION_LIMITS (1, BOOST_PP_DEC(FUSION_MAX_VECTOR_SIZE))
 #include BOOST_PP_ITERATE()
 
-    template <BOOST_PP_ENUM_PARAMS(FUSION_MAX_VECTOR_SIZE, typename T)>
-    struct vector_n_chooser
-    {
-        typedef
-            mpl::BOOST_PP_CAT(vector, FUSION_MAX_VECTOR_SIZE)
-                <BOOST_PP_ENUM_PARAMS(FUSION_MAX_VECTOR_SIZE, T)>
-        input;
-
-        typedef typename mpl::begin<input>::type begin;
-        typedef typename mpl::find<input, void_>::type end;
-        typedef typename mpl::distance<begin, end>::type size;
-
-        typedef typename get_vector_n<size::value>::template
-            call<BOOST_PP_ENUM_PARAMS(FUSION_MAX_VECTOR_SIZE, T)>::type
-        type;
-    };
 }}}
 
 #endif
@@ -85,14 +69,12 @@
 
 #define N BOOST_PP_ITERATION()
 
-    template <>
-    struct get_vector_n<N>
+    template <BOOST_PP_ENUM_PARAMS(N, typename T)>
+    struct vector_n_chooser<
+        BOOST_PP_ENUM_PARAMS(N, T)
+        BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_SUB(FUSION_MAX_VECTOR_SIZE, N), void_ BOOST_PP_INTERCEPT)>
     {
-        template <BOOST_PP_ENUM_PARAMS(FUSION_MAX_VECTOR_SIZE, typename T)>
-        struct call
-        {
-            typedef BOOST_PP_CAT(vector, N)<BOOST_PP_ENUM_PARAMS(N, T)> type;
-        };
+        typedef BOOST_PP_CAT(vector, N)<BOOST_PP_ENUM_PARAMS(N, T)> type;
     };
 
 #undef N
Modified: trunk/boost/fusion/support/detail/access.hpp
==============================================================================
--- trunk/boost/fusion/support/detail/access.hpp	(original)
+++ trunk/boost/fusion/support/detail/access.hpp	2009-06-02 01:46:21 EDT (Tue, 02 Jun 2009)
@@ -7,12 +7,8 @@
 #if !defined(FUSION_ACCESS_04182005_0737)
 #define FUSION_ACCESS_04182005_0737
 
-#include <boost/mpl/eval_if.hpp>
-#include <boost/mpl/identity.hpp>
 #include <boost/type_traits/add_const.hpp>
 #include <boost/type_traits/add_reference.hpp>
-#include <boost/type_traits/is_reference.hpp>
-#include <boost/type_traits/remove_cv.hpp>
 
 namespace boost { namespace fusion { namespace detail
 {
@@ -33,22 +29,35 @@
     };
 
     template <typename T>
-    struct non_ref_parameter
+    struct call_param
     {
-        typedef typename boost::remove_cv<T>::type const& type;
+        typedef T const& type;
     };
 
     template <typename T>
-    struct call_param
+    struct call_param<T &>
     {
-        typedef typename 
-            mpl::eval_if<
-                is_reference<T>
-              , mpl::identity<T>
-              , non_ref_parameter<T>
-            >::type
-        type;
+        typedef T& type;
     };
+
+    template <typename T>
+    struct call_param<T const>
+    {
+        typedef T const& type;
+    };
+
+    template <typename T>
+    struct call_param<T volatile>
+    {
+        typedef T const& type;
+    };
+
+    template <typename T>
+    struct call_param<T const volatile>
+    {
+        typedef T const& type;
+    };
+
 }}}
 
 #endif