From 40bd3305fbeb0261550b82171cadde22cd2557b9 Mon Sep 17 00:00:00 2001 From: syntheticpp Date: Mon, 2 Jan 2006 08:36:51 +0000 Subject: [PATCH] speed optimization: pass by reference but store value in case of Functor parameters git-svn-id: svn://svn.code.sf.net/p/loki-lib/code/trunk@390 7ec92016-0320-0410-acc4-a06ded1c099a --- include/loki/Functor.h | 42 ++++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/include/loki/Functor.h b/include/loki/Functor.h index c3f0726..4ba1872 100644 --- a/include/loki/Functor.h +++ b/include/loki/Functor.h @@ -1332,12 +1332,6 @@ namespace Loki { template struct BinderFirstTraits; - template - struct BinderFirstTraits - { - typedef typename TypeTraits::ParameterType ByRefOrValue; - }; - template class ThreadingModel> struct BinderFirstTraits< Functor > { @@ -1353,10 +1347,27 @@ namespace Loki typedef typename BoundFunctorType::Impl Impl; - typedef typename TypeTraits::ReferredType ByRefOrValue; }; - } + + template + struct BinderFirstBoundTypeStorage; + + template + struct BinderFirstBoundTypeStorage + { + typedef typename TypeTraits::ParameterType RefOrValue; + }; + + template class ThreadingModel> + struct BinderFirstBoundTypeStorage< Functor > + { + typedef Functor OriginalFunctor; + typedef typename const TypeTraits::ReferredType RefOrValue; + }; + + + } // namespace Private //////////////////////////////////////////////////////////////////////////////// /// \class BinderFirst @@ -1372,11 +1383,13 @@ namespace Loki typedef typename Private::BinderFirstTraits::Impl Base; typedef typename OriginalFunctor::ResultType ResultType; - typedef typename Private::BinderFirstTraits< + typedef typename OriginalFunctor::Parm1 BoundType; + + typedef typename Private::BinderFirstBoundTypeStorage< typename Private::BinderFirstTraits ::OriginalParm1> - ::ByRefOrValue - BoundType; + ::RefOrValue + BoundTypeStorage; typedef typename OriginalFunctor::Parm2 Parm1; typedef typename OriginalFunctor::Parm3 Parm2; @@ -1466,7 +1479,7 @@ namespace Loki private: OriginalFunctor f_; - BoundType b_; + BoundTypeStorage b_; }; //////////////////////////////////////////////////////////////////////////////// @@ -1478,10 +1491,7 @@ namespace Loki typename Private::BinderFirstTraits::BoundFunctorType BindFirst( const Fctor& fun, - typename Private::BinderFirstTraits< - typename Private::BinderFirstTraits - ::OriginalParm1> - ::ByRefOrValue bound) + typename Fctor::Parm1 bound) { typedef typename Private::BinderFirstTraits::BoundFunctorType Outgoing;