Listing 6: Unary member functions
template <class C, class Arg1> struct MemFunPtr1 {
typedef void (C::*type) (Arg1);
};
template <class C, class Arg1> struct MemFunPtr1<const C, Arg1> {
typedef void (C::*type) (Arg1) const;
};
template <typename C, typename Arg1>
class MemFunWrapper1 {
struct Data : public FunData {
typedef typename MemFunPtr1<C,Arg1>::type FunPtr;
Data (FunPtr fun_ptr, C &c, Arg1 arg1)
: FunData (&Data::thread_entry_point),
c (c),
fun_ptr (fun_ptr),
arg1 (arg1) {};
private:
C &c;
FunPtr fun_ptr;
Arg1 arg1;
static void * thread_entry_point (void *arg);
};
public:
typedef typename MemFunPtr1<C,Arg1>::type FunPtr;
MemFunWrapper1 (C &c, FunPtr fun_ptr)
: c(c), fun_ptr(fun_ptr) {};
Thread operator() (Arg1 arg1) {
Data data(fun_ptr, c, arg1);
Thread t = do_spawn (data);
data.lock.acquire ();
return t;
};
private:
C &c;
FunPtr fun_ptr;
};
template <typename C, typename Arg1>
void *
MemFunWrapper1<C,Arg1>::Data::thread_entry_point (void *arg) {
const Data *fun_data = reinterpret_cast<const Data*> (arg);
FunPtr fun_ptr = fun_data->fun_ptr;
C &c = fun_data->c;
Arg1 arg1 = fun_data->arg1;
fun_data->lock.release ();
(c.*fun_ptr)(arg1);
return 0;
}
template <typename C, typename Arg1>
MemFunWrapper1<C,Arg1>
spawn (C &c, void (C::*fun_ptr)(Arg1)) {
return MemFunWrapper1<C,Arg1>(c,fun_ptr);
}
template <typename C, typename Arg1>
MemFunWrapper1<const C,Arg1>
spawn (const C &c, void (C::*fun_ptr)(Arg1) const) {
return MemFunWrapper1<const C,Arg1>(c,fun_ptr);
}
End of Listing