00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00024
00025 namespace priv
00026 {
00027
00028 struct ThreadFunc
00029 {
00030 virtual ~ThreadFunc() {}
00031 virtual void Run() = 0;
00032 };
00033
00034
00035 template <typename T>
00036 struct ThreadFunctor : ThreadFunc
00037 {
00038 ThreadFunctor(T functor) : myFunctor(functor) {}
00039 virtual void Run() {myFunctor();}
00040 T myFunctor;
00041 };
00042
00043
00044 template <typename F, typename A>
00045 struct ThreadFunctorWithArg : ThreadFunc
00046 {
00047 ThreadFunctorWithArg(F function, A arg) : myFunction(function), myArg(arg) {}
00048 virtual void Run() {myFunction(myArg);}
00049 F myFunction;
00050 A myArg;
00051 };
00052
00053
00054 template <typename C>
00055 struct ThreadMemberFunc : ThreadFunc
00056 {
00057 ThreadMemberFunc(void(C::*function)(), C* object) : myFunction(function), myObject(object) {}
00058 virtual void Run() {(myObject->*myFunction)();}
00059 void(C::*myFunction)();
00060 C* myObject;
00061 };
00062
00063 }
00064
00065
00067 template <typename F>
00068 Thread::Thread(F functor) :
00069 myImpl (NULL),
00070 myFunction(new priv::ThreadFunctor<F>(functor))
00071 {
00072 }
00073
00074
00076 template <typename F, typename A>
00077 Thread::Thread(F function, A argument) :
00078 myImpl (NULL),
00079 myFunction(new priv::ThreadFunctorWithArg<F, A>(function, argument))
00080 {
00081 }
00082
00083
00085 template <typename C>
00086 Thread::Thread(void(C::*function)(), C* object) :
00087 myImpl (NULL),
00088 myFunction(new priv::ThreadMemberFunc<C>(function, object))
00089 {
00090 }