
On Tue, 30 Nov 2004 23:28:48 -0600 "Aaron W. LaFramboise" <aaronrabiddog51@aaronwl.com> wrote:
This is very useful information!
I hope it is correct ;-) Can you verify similar performance characteristics?
The primary observation I make from this is how much slower by ratio Boost.Signals is. I'm going to look at your test 'lite' implementation later. Is there some additional feature Boost.Signals is offering that causes it to do all of this extra work?
Strictly guessing here... probably something to do with combining the return values On a different note,I have resisted looking at Boost.Preprocessor for a long time (since the first look made my head spin). However, after just reading a post on boostpp, relative to expanding parameters, I decided to wade into the shallows. Here is the result, in case you want to play with larger arity, or want to change the operator() code... I have to admit that a devilish grin started forming on my face as I was writing this little piece of code, which should be a good replacement in the Signals.hpp file. Replace the rest of the file starting with template <typename Signature> struct Signal; ------------------------------------ template <typename Signature> struct Signal; } // end signals namespace } // end lite namespace // Generate the code for all Signal<> specializations. #include "boost/preprocessor/repetition.hpp" #include "boost/preprocessor/arithmetic/add.hpp" #include "boost/preprocessor/punctuation/comma_if.hpp" #include "boost/preprocessor/comparison/less.hpp" #include "boost/preprocessor/facilities/empty.hpp" #ifndef LITE_SIGNAL_MAX_ARITY #define LITE_SIGNAL_MAX_ARITY 10 #endif #undef LITE_PP_DEF #define LITE_PP_DEF(z, n, lastn) \ template <typename R \ BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM_PARAMS(n, typename T)> \ struct Signal < R ( BOOST_PP_ENUM_PARAMS(n,T) ) > \ : public detail::Signal_Base<R (BOOST_PP_ENUM_PARAMS(n,T))> \ { \ R operator()( BOOST_PP_ENUM_BINARY_PARAMS(n, T, t) ) const \ { \ typename list::iterator i = list_.begin(); \ while (i != list_.end()) \ { \ if (i->function_) \ { \ (i++)->function_( BOOST_PP_ENUM_PARAMS(n,t) ); \ } \ else \ { \ i = list_.erase(i); \ } \ } \ } \ } BOOST_PP_IF(BOOST_PP_LESS(n, lastn), ;, BOOST_PP_EMPTY()) namespace lite { namespace signals { BOOST_PP_REPEAT( \ BOOST_PP_ADD(LITE_SIGNAL_MAX_ARITY, 1), \ LITE_PP_DEF, \ LITE_SIGNAL_MAX_ARITY); } // end signals namespace } // end lite namespace #undef LITE_PP_DEF #endif // lite__Signal__hpp_