Listing 5
struct simple_call
{
virtual ~simple_call() {}
virtual bool invoke() = 0;
virtual bool is_completed() const = 0;
virtual void wait_completion() = 0;
virtual simple_call* make_clone() const = 0;
template<typename T> static T* clone(T* from)
{
if(0 == from)
return 0;
T* to = static_cast<T*>(from->make_clone());
assert(typeid(*to) == typeid(*from));
return to;
}
};
template<typename ret>
struct async_callback
{
typedef typename call_traits<ret>::const_reference cr_ret;
virtual ~async_callback() {}
virtual void accept_result(cr_ret retval) = 0;
};
template<typename ret>
class dispatcher : public simple_call
{
public:
dispatcher() : _ac(0) {}
virtual ~dispatcher() {}
typedef async_callback<ret>* ac_ptr;
void deliver_to(ac_ptr ac) { _ac = ac; }
virtual ret result() const = 0;
protected:
ac_ptr _ac;
};
template<typename ret, typename params>
class callable;
template<typename ret>
class callable<ret, mpl::void_>
: public dispatcher<ret>
{
public:
virtual void operator()() = 0;
};
template<typename ret, typename p1>
class callable<ret, mpl::vector<p1> >
: public dispatcher<ret>
{
public:
virtual void operator()(p1) = 0;
};
// repeat for 2 or more parameters