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 —