21 #ifndef ATSCPPAPI_ASYNC_H_
22 #define ATSCPPAPI_ASYNC_H_
37 class AsyncDispatchControllerBase : noncopyable {
44 virtual bool dispatch() = 0;
45 virtual ~AsyncDispatchControllerBase() { }
64 virtual void run(shared_ptr<AsyncDispatchControllerBase> dispatch_controller) = 0;
74 template<
typename AsyncEventReceiverType,
typename AsyncProv
iderType>
75 class AsyncDispatchController :
public AsyncDispatchControllerBase {
80 if (event_receiver_) {
81 event_receiver_->handleAsyncComplete(static_cast<AsyncProviderType &>(*provider_));
94 AsyncDispatchController(AsyncEventReceiverType *event_receiver, AsyncProviderType *provider, shared_ptr<Mutex> mutex) :
95 event_receiver_(event_receiver), dispatch_mutex_(mutex), provider_(provider) {
98 virtual ~AsyncDispatchController() { }
100 AsyncEventReceiverType *event_receiver_;
101 shared_ptr<Mutex> dispatch_mutex_;
103 AsyncProviderType *provider_;
113 template<
typename AsyncEventReceiverType,
typename AsyncProv
iderType>
114 class AsyncReceiverPromise : noncopyable {
116 AsyncReceiverPromise(shared_ptr<AsyncDispatchController<AsyncEventReceiverType, AsyncProviderType> > dispatch_controller) :
117 dispatch_controller_(dispatch_controller) { }
119 ~AsyncReceiverPromise() {
120 ScopedSharedMutexLock scopedLock(dispatch_controller_->dispatch_mutex_);
121 dispatch_controller_->event_receiver_ = NULL;
124 shared_ptr<AsyncDispatchController<AsyncEventReceiverType, AsyncProviderType> > dispatch_controller_;
131 template<
typename AsyncProv
iderType>
147 mutable std::list<shared_ptr<AsyncReceiverPromise<AsyncReceiver<AsyncProviderType>, AsyncProviderType> > > receiver_promises_;
166 template<
typename AsyncProv
iderType>
171 shared_ptr<AsyncDispatchController<AsyncReceiver<AsyncProviderType>, AsyncProviderType > > dispatcher(
173 shared_ptr<AsyncReceiverPromise<AsyncReceiver<AsyncProviderType>, AsyncProviderType > > receiver_promise(
175 event_receiver->receiver_promises_.push_back(receiver_promise);
176 provider->run(dispatcher);