Boost logo

Boost :

From: Tobias Schwinger (tschwinger_at_[hidden])
Date: 2006-01-07 18:08:18


Arkadiy Vertleyb wrote:
>
> OK, but this means we have to change the syntax of REGISTER macros to do
> something like:
>
> #include BOOST_TYPEOF_REGISTER_...(...)
>
> I remember you suggested this during the review. I am still not quite
> comfortable with the idea...
>

No it's a different pair of shoes I'm talking about here (in fact, having used the
library some more I found several situations that require REGISTER_* to be macros,
so you can safely forget about my review suggestion).

What I'm talking about here is purely an implementation issue and doesn't affect
the interface at all (typeof/vector.hpp). I'll attach a patch that highlights the
changes needed to make things work for 118 <= LIMIT_SIZE <= 238.

>>
>>Here's my modifications:
^^^^^ BTW excuse my beautiful english... ;-)
>>
>> http://tinyurl.com/839s3
>
>
> How much faster is it?
>

Hard to say in general. It depends on the case:

    bjam run in ${BOOST}/libs/typeof/test
    =============================================
    without preprocessed files: about 2.5 minutes
    with preprocessed files: about 1.5 minutes
    original version: about 2.5 minutes *

    * slightly slower than the 1st

Now to the cases that hurt:

    Test with LIMIT_SIZE = 117
    ==========================
    without preprocessed files: 45 seconds
    with preprocessed files: 13 seconds
    original version: 52 seconds

    Test with LIMIT_SIZE = 238
    ==========================
    without preprocessed files: about 5.5 minutes
    with preprocessed files: about 0.5 minutes
    original version: <limit exceeded>

    Test with LIMIT_SIZE = 250
    ==========================
    without preprocessed files: <limit exceeded>
    with preprocessed files: about 0.5 minutes
    original version: <limit exceeded>

More benchmarks needed?

Just download the archive and copy the contents of the folder therein to
${BOOST}/boost/typeof. Setting the macro BOOST_TYPEOF_PREPROCESSING_MODE enforces
preprocessing, otherwise preprocessed files are used.

Boost.Typeof rocks...

Cheers,

Tobias

Index: boost/typeof/vector.hpp
===================================================================
RCS file: /cvsroot/boost/boost/boost/typeof/vector.hpp,v
retrieving revision 1.2
diff -u -r1.2 vector.hpp
--- boost/typeof/vector.hpp 9 Dec 2005 03:55:38 -0000 1.2
+++ boost/typeof/vector.hpp 6 Jan 2006 20:41:51 -0000
@@ -12,7 +12,9 @@
 #include <boost/preprocessor/repeat_from_to.hpp>
 #include <boost/preprocessor/cat.hpp>
 #include <boost/preprocessor/inc.hpp>
+#include <boost/preprocessor/dec.hpp>
 #include <boost/preprocessor/comma_if.hpp>
+#include <boost/preprocessor/iteration/local.hpp>
 
 #ifndef BOOST_TYPEOF_LIMIT_SIZE
 # define BOOST_TYPEOF_LIMIT_SIZE 50
@@ -20,7 +22,7 @@
 
 // iterator
 
-#define BOOST_TYPEOF_spec_iter(z, n, _)\
+#define BOOST_TYPEOF_spec_iter(n)\
     template<class V>\
     struct v_iter<V, mpl::int_<n> >\
     {\
@@ -31,7 +33,9 @@
 namespace boost { namespace type_of {
 
     template<class V, class Pos> struct v_iter; // not defined
- BOOST_PP_REPEAT(BOOST_TYPEOF_LIMIT_SIZE, BOOST_TYPEOF_spec_iter, ~)
+ #define BOOST_PP_LOCAL_MACRO BOOST_TYPEOF_spec_iter
+ #define BOOST_PP_LOCAL_LIMITS (0,BOOST_PP_DEC(BOOST_TYPEOF_LIMIT_SIZE))
+ #include BOOST_PP_LOCAL_ITERATE()
 }}
 
 #undef BOOST_TYPEOF_spec_iter
@@ -44,7 +48,7 @@
 #define BOOST_TYPEOF_typedef_fake_item(z, n, _)\
     typedef mpl::int_<1> item ## n;
 
-#define BOOST_TYPEOF_define_vector(z, n, _)\
+#define BOOST_TYPEOF_define_vector(n)\
     template<BOOST_PP_ENUM_PARAMS(n, class P) BOOST_PP_COMMA_IF(n) class T = void>\
     struct vector ## n\
     {\
@@ -55,7 +59,10 @@
 
 namespace boost { namespace type_of {
 
- BOOST_PP_REPEAT(BOOST_PP_INC(BOOST_TYPEOF_LIMIT_SIZE), BOOST_TYPEOF_define_vector, ~)
+ #define BOOST_PP_LOCAL_MACRO BOOST_TYPEOF_define_vector
+ #define BOOST_PP_LOCAL_LIMITS (0,BOOST_TYPEOF_LIMIT_SIZE)
+ #include BOOST_PP_LOCAL_ITERATE()
+
 }}
 
 #undef BOOST_TYPEOF_typedef_item
@@ -64,7 +71,7 @@
 
 // push_back
 
-#define BOOST_TYPEOF_spec_push_back(z, n, _)\
+#define BOOST_TYPEOF_spec_push_back(n)\
     template<BOOST_PP_ENUM_PARAMS(n, class P) BOOST_PP_COMMA_IF(n) class T>\
     struct push_back<BOOST_PP_CAT(boost::type_of::vector, n)<BOOST_PP_ENUM_PARAMS(n, P)>, T>\
     {\
@@ -76,7 +83,9 @@
 namespace boost { namespace type_of {
 
     template<class V, class T> struct push_back; // not defined
- BOOST_PP_REPEAT(BOOST_TYPEOF_LIMIT_SIZE, BOOST_TYPEOF_spec_push_back, ~)
+ #define BOOST_PP_LOCAL_MACRO BOOST_TYPEOF_spec_push_back
+ #define BOOST_PP_LOCAL_LIMITS (0,BOOST_PP_DEC(BOOST_TYPEOF_LIMIT_SIZE))
+ #include BOOST_PP_LOCAL_ITERATE()
 }}
 
 #undef BOOST_TYPEOF_spec_push_back


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk