Boost logo

Boost-Commit :

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


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk