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
This commit is contained in:
syntheticpp 2006-01-02 08:36:51 +00:00
parent a24fd38f7a
commit 40bd3305fb

View file

@ -1332,12 +1332,6 @@ namespace Loki
{ {
template <class Fctor> struct BinderFirstTraits; template <class Fctor> struct BinderFirstTraits;
template<class T>
struct BinderFirstTraits
{
typedef typename TypeTraits<T>::ParameterType ByRefOrValue;
};
template <typename R, class TList, template <class> class ThreadingModel> template <typename R, class TList, template <class> class ThreadingModel>
struct BinderFirstTraits< Functor<R, TList, ThreadingModel> > struct BinderFirstTraits< Functor<R, TList, ThreadingModel> >
{ {
@ -1353,10 +1347,27 @@ namespace Loki
typedef typename BoundFunctorType::Impl Impl; typedef typename BoundFunctorType::Impl Impl;
typedef typename TypeTraits<OriginalFunctor>::ReferredType ByRefOrValue;
}; };
}
template<class T>
struct BinderFirstBoundTypeStorage;
template<class T>
struct BinderFirstBoundTypeStorage
{
typedef typename TypeTraits<T>::ParameterType RefOrValue;
};
template <typename R, class TList, template <class> class ThreadingModel>
struct BinderFirstBoundTypeStorage< Functor<R, TList, ThreadingModel> >
{
typedef Functor<R, TList, ThreadingModel> OriginalFunctor;
typedef typename const TypeTraits<OriginalFunctor>::ReferredType RefOrValue;
};
} // namespace Private
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// \class BinderFirst /// \class BinderFirst
@ -1372,11 +1383,13 @@ namespace Loki
typedef typename Private::BinderFirstTraits<OriginalFunctor>::Impl Base; typedef typename Private::BinderFirstTraits<OriginalFunctor>::Impl Base;
typedef typename OriginalFunctor::ResultType ResultType; typedef typename OriginalFunctor::ResultType ResultType;
typedef typename Private::BinderFirstTraits< typedef typename OriginalFunctor::Parm1 BoundType;
typedef typename Private::BinderFirstBoundTypeStorage<
typename Private::BinderFirstTraits<OriginalFunctor> typename Private::BinderFirstTraits<OriginalFunctor>
::OriginalParm1> ::OriginalParm1>
::ByRefOrValue ::RefOrValue
BoundType; BoundTypeStorage;
typedef typename OriginalFunctor::Parm2 Parm1; typedef typename OriginalFunctor::Parm2 Parm1;
typedef typename OriginalFunctor::Parm3 Parm2; typedef typename OriginalFunctor::Parm3 Parm2;
@ -1466,7 +1479,7 @@ namespace Loki
private: private:
OriginalFunctor f_; OriginalFunctor f_;
BoundType b_; BoundTypeStorage b_;
}; };
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -1478,10 +1491,7 @@ namespace Loki
typename Private::BinderFirstTraits<Fctor>::BoundFunctorType typename Private::BinderFirstTraits<Fctor>::BoundFunctorType
BindFirst( BindFirst(
const Fctor& fun, const Fctor& fun,
typename Private::BinderFirstTraits< typename Fctor::Parm1 bound)
typename Private::BinderFirstTraits<Fctor>
::OriginalParm1>
::ByRefOrValue bound)
{ {
typedef typename Private::BinderFirstTraits<Fctor>::BoundFunctorType typedef typename Private::BinderFirstTraits<Fctor>::BoundFunctorType
Outgoing; Outgoing;