/**
* This file is part of TelepathyQt
*
* @copyright Copyright (C) 2012 Collabora Ltd.
* @copyright Copyright (C) 2012 Nokia Corporation
* @license LGPL 2.1
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef _TelepathyQt_functors_h_HEADER_GUARD_
#define _TelepathyQt_functors_h_HEADER_GUARD_
#ifndef IN_TP_QT_HEADER
#error IN_TP_QT_HEADER
#endif
#include
namespace Tp
{
struct TP_QT_EXPORT BaseFunctor
{
};
template
struct PtrFunctor0 : public BaseFunctor
{
typedef R (*FunctionType)();
typedef R ResultType;
PtrFunctor0(FunctionType fn) : fn(fn) {}
ResultType operator()() const { return fn(); }
FunctionType fn;
};
template
struct MemberFunctor0 : public BaseFunctor
{
typedef R (T::*FunctionType)();
typedef R ResultType;
MemberFunctor0(T *object, FunctionType fn) : object(object), fn(fn) {}
ResultType operator()() const { return (object->*(fn))(); }
T *object;
FunctionType fn;
};
template
struct PtrFunctor1 : public BaseFunctor
{
typedef R (*FunctionType)(Arg1);
typedef R ResultType;
PtrFunctor1(FunctionType fn) : fn(fn) {}
ResultType operator()(Arg1 a1) const { return fn(a1); }
FunctionType fn;
};
template
struct MemberFunctor1 : public BaseFunctor
{
typedef R (T::*FunctionType)(Arg1);
typedef R ResultType;
MemberFunctor1(T *object, FunctionType fn) : object(object), fn(fn) {}
ResultType operator()(Arg1 a1) const { return (object->*(fn))(a1); }
T *object;
FunctionType fn;
};
template
struct PtrFunctor2 : public BaseFunctor
{
typedef R (*FunctionType)(Arg1, Arg2);
typedef R ResultType;
PtrFunctor2(FunctionType fn) : fn(fn) {}
ResultType operator()(Arg1 a1, Arg2 a2) const { return fn(a1, a2); }
FunctionType fn;
};
template
struct MemberFunctor2 : public BaseFunctor
{
typedef R (T::*FunctionType)(Arg1, Arg2);
typedef R ResultType;
MemberFunctor2(T *object, FunctionType fn) : object(object), fn(fn) {}
ResultType operator()(Arg1 a1, Arg2 a2) const { return (object->*(fn))(a1, a2); }
T *object;
FunctionType fn;
};
template
struct PtrFunctor3 : public BaseFunctor
{
typedef R (*FunctionType)(Arg1, Arg2, Arg3);
typedef R ResultType;
PtrFunctor3(FunctionType fn) : fn(fn) {}
ResultType operator()(Arg1 a1, Arg2 a2, Arg3 a3) const { return fn(a1, a2, a3); }
FunctionType fn;
};
template
struct MemberFunctor3 : public BaseFunctor
{
typedef R (T::*FunctionType)(Arg1, Arg2, Arg3);
typedef R ResultType;
MemberFunctor3(T *object, FunctionType fn) : object(object), fn(fn) {}
ResultType operator()(Arg1 a1, Arg2 a2, Arg3 a3) const { return (object->*(fn))(a1, a2, a3); }
T *object;
FunctionType fn;
};
template
struct PtrFunctor4 : public BaseFunctor
{
typedef R (*FunctionType)(Arg1, Arg2, Arg3, Arg4);
typedef R ResultType;
PtrFunctor4(FunctionType fn) : fn(fn) {}
ResultType operator()(Arg1 a1, Arg2 a2, Arg3 a3, Arg4 a4) const { return fn(a1, a2, a3, a4); }
FunctionType fn;
};
template
struct MemberFunctor4 : public BaseFunctor
{
typedef R (T::*FunctionType)(Arg1, Arg2, Arg3, Arg4);
typedef R ResultType;
MemberFunctor4(T *object, FunctionType fn) : object(object), fn(fn) {}
ResultType operator()(Arg1 a1, Arg2 a2, Arg3 a3, Arg4 a4) const { return (object->*(fn))(a1, a2, a3, a4); }
T *object;
FunctionType fn;
};
template
struct PtrFunctor5 : public BaseFunctor
{
typedef R (*FunctionType)(Arg1, Arg2, Arg3, Arg4, Arg5);
typedef R ResultType;
PtrFunctor5(FunctionType fn) : fn(fn) {}
ResultType operator()(Arg1 a1, Arg2 a2, Arg3 a3, Arg4 a4, Arg5 a5) const { return fn(a1, a2, a3, a4, a5); }
FunctionType fn;
};
template
struct MemberFunctor5 : public BaseFunctor
{
typedef R (T::*FunctionType)(Arg1, Arg2, Arg3, Arg4, Arg5);
typedef R ResultType;
MemberFunctor5(T *object, FunctionType fn) : object(object), fn(fn) {}
ResultType operator()(Arg1 a1, Arg2 a2, Arg3 a3, Arg4 a4, Arg5 a5) const { return (object->*(fn))(a1, a2, a3, a4, a5); }
T *object;
FunctionType fn;
};
template
struct PtrFunctor6 : public BaseFunctor
{
typedef R (*FunctionType)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6);
typedef R ResultType;
PtrFunctor6(FunctionType fn) : fn(fn) {}
ResultType operator()(Arg1 a1, Arg2 a2, Arg3 a3, Arg4 a4, Arg5 a5, Arg6 a6) const { return fn(a1, a2, a3, a4, a5, a6); }
FunctionType fn;
};
template
struct MemberFunctor6 : public BaseFunctor
{
typedef R (T::*FunctionType)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6);
typedef R ResultType;
MemberFunctor6(T *object, FunctionType fn) : object(object), fn(fn) {}
ResultType operator()(Arg1 a1, Arg2 a2, Arg3 a3, Arg4 a4, Arg5 a5, Arg6 a6) const { return (object->*(fn))(a1, a2, a3, a4, a5, a6); }
T *object;
FunctionType fn;
};
template
struct PtrFunctor7 : public BaseFunctor
{
typedef R (*FunctionType)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7);
typedef R ResultType;
PtrFunctor7(FunctionType fn) : fn(fn) {}
ResultType operator()(Arg1 a1, Arg2 a2, Arg3 a3, Arg4 a4, Arg5 a5, Arg6 a6, Arg7 a7) const { return fn(a1, a2, a3, a4, a5, a6, a7); }
FunctionType fn;
};
template
struct MemberFunctor7 : public BaseFunctor
{
typedef R (T::*FunctionType)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7);
typedef R ResultType;
MemberFunctor7(T *object, FunctionType fn) : object(object), fn(fn) {}
ResultType operator()(Arg1 a1, Arg2 a2, Arg3 a3, Arg4 a4, Arg5 a5, Arg6 a6, Arg7 a7) const { return (object->*(fn))(a1, a2, a3, a4, a5, a6, a7); }
T *object;
FunctionType fn;
};
// convenience methods
// ptrFun
template
inline PtrFunctor0
ptrFun(R (*fn)() )
{ return PtrFunctor0(fn); }
template
inline PtrFunctor1
ptrFun(R (*fn)(Arg1) )
{ return PtrFunctor1(fn); }
template
inline PtrFunctor2
ptrFun(R (*fn)(Arg1, Arg2) )
{ return PtrFunctor2(fn); }
template
inline PtrFunctor3
ptrFun(R (*fn)(Arg1, Arg2, Arg3) )
{ return PtrFunctor3(fn); }
template
inline PtrFunctor4
ptrFun(R (*fn)(Arg1, Arg2, Arg3, Arg4) )
{ return PtrFunctor4(fn); }
template
inline PtrFunctor5
ptrFun(R (*fn)(Arg1, Arg2, Arg3, Arg4, Arg5) )
{ return PtrFunctor5(fn); }
template
inline PtrFunctor6
ptrFun(R (*fn)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6) )
{ return PtrFunctor6(fn); }
template
inline PtrFunctor7
ptrFun(R (*fn)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7) )
{ return PtrFunctor7(fn); }
// memFun
template
inline MemberFunctor0
memFun(/**/ T *obj, R (T::*fn)() )
{ return MemberFunctor0(obj, fn); }
template
inline MemberFunctor1
memFun(/**/ T *obj, R (T::*fn)(Arg1) )
{ return MemberFunctor1(obj, fn); }
template
inline MemberFunctor2
memFun(/**/ T *obj, R (T::*fn)(Arg1, Arg2) )
{ return MemberFunctor2(obj, fn); }
template
inline MemberFunctor3
memFun(/**/ T *obj, R (T::*fn)(Arg1, Arg2, Arg3) )
{ return MemberFunctor3(obj, fn); }
template
inline MemberFunctor4
memFun(/**/ T *obj, R (T::*fn)(Arg1, Arg2, Arg3, Arg4) )
{ return MemberFunctor4(obj, fn); }
template
inline MemberFunctor5
memFun(/**/ T *obj, R (T::*fn)(Arg1, Arg2, Arg3, Arg4, Arg5) )
{ return MemberFunctor5(obj, fn); }
template
inline MemberFunctor6
memFun(/**/ T *obj, R (T::*fn)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6) )
{ return MemberFunctor6(obj, fn); }
template
inline MemberFunctor7
memFun(/**/ T *obj, R (T::*fn)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7) )
{ return MemberFunctor7(obj, fn); }
}
#endif