gtkradiant/libs/generic/functional.h
spog 31af7f484e fixed illegal template usage
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/trunk@47 8a3a26a2-13c4-0310-b231-cf6edde360e5
2006-04-10 10:35:59 +00:00

313 lines
8 KiB
C++

#if !defined(INCLUDED_FUNCTIONAL_H)
#define INCLUDED_FUNCTIONAL_H
template<typename Object, typename R, R (Object::*member)()>
class Member
{
public:
typedef Object& first_argument_type;
typedef R result_type;
static result_type call(first_argument_type object)
{
return (object.*member)();
}
};
template<typename Object, typename R, R (Object::*member)() const>
class ConstMember
{
public:
typedef const Object& first_argument_type;
typedef R result_type;
static result_type call(first_argument_type object)
{
return (object.*member)();
}
};
template<typename Object, typename A1, typename R, R (Object::*member)(A1)>
class Member1
{
public:
typedef Object& first_argument_type;
typedef A1 second_argument_type;
typedef R result_type;
static result_type call(first_argument_type object, second_argument_type a1)
{
return (object.*member)(a1);
}
};
template<typename Object, typename A1, typename R, R (Object::*member)(A1) const>
class ConstMember1
{
public:
typedef const Object& first_argument_type;
typedef A1 second_argument_type;
typedef R result_type;
static result_type call(first_argument_type object, second_argument_type a1)
{
return (object.*member)(a1);
}
};
template<typename Object, typename A2, typename A3, typename R, R (Object::*member)(A2, A3)>
class Member2
{
public:
typedef Object& first_argument_type;
typedef A2 second_argument_type;
typedef A3 third_argument_type;
typedef R result_type;
static result_type call(first_argument_type object, second_argument_type a2, third_argument_type a3)
{
return (object.*member)(a2, a3);
}
};
template<typename Object, typename A2, typename A3, typename R, R (Object::*member)(A2, A3) const>
class ConstMember2
{
public:
typedef const Object& first_argument_type;
typedef A2 second_argument_type;
typedef A3 third_argument_type;
typedef R result_type;
static result_type call(first_argument_type object, second_argument_type a2, third_argument_type a3)
{
return (object.*member)(a2, a3);
}
};
template<typename Object, typename A2, typename A3, typename A4, typename R, R (Object::*member)(A2, A3, A4)>
class Member3
{
public:
typedef Object& first_argument_type;
typedef A2 second_argument_type;
typedef A3 third_argument_type;
typedef A4 fourth_argument_type;
typedef R result_type;
static result_type call(first_argument_type object, second_argument_type a2, third_argument_type a3, fourth_argument_type a4)
{
return (object.*member)(a2, a3, a4);
}
};
template<typename Object, typename A2, typename A3, typename A4, typename R, R (Object::*member)(A2, A3, A4) const>
class ConstMember3
{
public:
typedef const Object& first_argument_type;
typedef A2 second_argument_type;
typedef A3 third_argument_type;
typedef A4 fourth_argument_type;
typedef R result_type;
static result_type call(first_argument_type object, second_argument_type a2, third_argument_type a3, fourth_argument_type a4)
{
return (object.*member)(a2, a3, a4);
}
};
template<typename R, R (*func)()>
class Function0
{
public:
typedef R result_type;
static result_type call()
{
return (func)();
}
};
template<typename A1, typename R, R (*func)(A1)>
class Function1
{
public:
typedef A1 first_argument_type;
typedef R result_type;
static result_type call(first_argument_type a1)
{
return (func)(a1);
}
};
template<typename A1, typename A2, typename R, R (*func)(A1, A2)>
class Function2
{
public:
typedef A1 first_argument_type;
typedef A2 second_argument_type;
typedef R result_type;
static result_type call(first_argument_type a1, second_argument_type a2)
{
return (func)(a1, a2);
}
};
template<typename A1, typename A2, typename A3, typename R, R (*func)(A1, A2, A3)>
class Function3
{
public:
typedef A1 first_argument_type;
typedef A2 second_argument_type;
typedef A3 third_argument_type;
typedef R result_type;
static result_type call(first_argument_type a1, second_argument_type a2, third_argument_type a3)
{
return (func)(a1, a2, a3);
}
};
template<typename A1, typename A2, typename A3, typename A4, typename R, R (*func)(A1, A2, A3, A4)>
class Function4
{
public:
typedef A1 first_argument_type;
typedef A2 second_argument_type;
typedef A3 third_argument_type;
typedef A4 fourth_argument_type;
typedef R result_type;
static result_type call(first_argument_type a1, second_argument_type a2, third_argument_type a3, fourth_argument_type a4)
{
return (func)(a1, a2, a3, a4);
}
};
template<typename Caller, typename FirstArgument = void*>
class Caller0To1
{
public:
typedef FirstArgument first_argument_type;
typedef typename Caller::result_type result_type;
static result_type call(first_argument_type)
{
return Caller::call();
}
};
template<typename Caller, typename FirstArgument = void*>
class Caller1To2
{
public:
typedef FirstArgument first_argument_type;
typedef typename Caller::first_argument_type second_argument_type;
typedef typename Caller::result_type result_type;
static result_type call(first_argument_type, second_argument_type a2)
{
return Caller::call(a2);
}
};
template<typename Caller, typename FirstArgument = void*>
class Caller2To3
{
public:
typedef FirstArgument first_argument_type;
typedef typename Caller::first_argument_type second_argument_type;
typedef typename Caller::second_argument_type third_argument_type;
typedef typename Caller::result_type result_type;
static result_type call(first_argument_type, second_argument_type a2, third_argument_type a3)
{
return Caller::call(a2, a3);
}
};
template<typename Caller, typename FirstArgument = void*>
class Caller3To4
{
public:
typedef FirstArgument first_argument_type;
typedef typename Caller::first_argument_type second_argument_type;
typedef typename Caller::second_argument_type third_argument_type;
typedef typename Caller::third_argument_type fourth_argument_type;
typedef typename Caller::result_type result_type;
static result_type call(first_argument_type, second_argument_type a2, third_argument_type a3, fourth_argument_type a4)
{
return Caller::call(a2, a3, a4);
}
};
template<typename Functor>
class FunctorInvoke
{
public:
typedef typename Functor::result_type result_type;
inline result_type operator()(Functor functor)
{
return functor();
}
};
template<typename Functor>
class Functor1Invoke
{
typename Functor::first_argument_type a1;
public:
typedef typename Functor::first_argument_type first_argument_type;
typedef typename Functor::result_type result_type;
Functor1Invoke(first_argument_type a1) : a1(a1)
{
}
inline result_type operator()(Functor functor)
{
return functor(a1);
}
};
template<typename Functor>
class Functor2Invoke
{
typename Functor::first_argument_type a1;
typename Functor::second_argument_type a2;
public:
typedef typename Functor::first_argument_type first_argument_type;
typedef typename Functor::second_argument_type second_argument_type;
typedef typename Functor::result_type result_type;
Functor2Invoke(first_argument_type a1, second_argument_type a2)
: a1(a1), a2(a2)
{
}
inline result_type operator()(Functor functor)
{
return functor(a1, a2);
}
};
template<typename Functor>
class Functor3Invoke
{
typename Functor::first_argument_type a1;
typename Functor::second_argument_type a2;
typename Functor::third_argument_type a3;
public:
typedef typename Functor::first_argument_type first_argument_type;
typedef typename Functor::second_argument_type second_argument_type;
typedef typename Functor::third_argument_type third_argument_type;
typedef typename Functor::result_type result_type;
Functor3Invoke(first_argument_type a1, second_argument_type a2, third_argument_type a3)
: a1(a1), a2(a2), a3(a3)
{
}
inline result_type operator()(Functor functor)
{
return functor(a1, a2, a3);
}
};
template<typename Other, typename True, typename False, typename Type>
class TypeEqual
{
public:
typedef False type;
};
template<typename Other, typename True, typename False>
class TypeEqual<Other, True, False, Other>
{
public:
typedef True type;
};
#endif