class furrovineexport Dispatcher {
protected:
typedef std::unique_ptr<DispatchBase> TDispatch;
typedef std::list<TDispatch> TDispatchList;
TDispatchList work;
std::mutex thislock;
public:
Dispatcher () {
}
template <typename R> void Add ( std::function<R ( )> f ) {
thislock.lock();
work.push_back( TDispatch( new Dispatch0<R>( f ) ) );
thislock.unlock();
}
template <typename R, typename T1> void Add ( std::function<R (T1)> f, T1 t1 ) {
thislock.lock();
work.push_back( TDispatch( new Dispatch1<R, T1>( f, t1 ) ) );
thislock.unlock();
}
template <typename R, typename T1, typename T2> void Add ( std::function<R (T1)> f, T1 t1, T2 t2 ) {
thislock.lock();
work.push_back(
TDispatch( new Dispatch2<R, T1, T2>( f,
std::forward<T1>( t1 ),
std::forward<T2>( t2 ) ) ) );
thislock.unlock();
}
template <typename R, typename T1, typename T2, typename T3> void Add ( std::function<R (T1)> f, T1 t1, T2 t2, T3 t3 ) {
thislock.lock();
work.push_back( TDispatch(
new Dispatch3<R, T1, T2, T3>( f,
std::forward<T1>( t1 ),
std::forward<T2>( t2 ),
std::forward<T3>( t3 ) ) ) );
thislock.unlock();
}
template <typename R, typename T1, typename T2, typename T3, typename T4> void Add ( std::function<R (T1)> f, T1 t1, T2 t2, T3 t3 ) {
thislock.lock();
work.push_back( TDispatch(
new Dispatch3<R, T1, T2, T3>( f,
std::forward<T1>( t1 ),
std::forward<T2>( t2 ),
std::forward<T3>( t3 ),
std::forward<T4>( t4 ) ) ) );
thislock.unlock();
}
void Do () {
thislock.lock();
TDispatchList dispatchwork = std::move( work );
work.clear();
thislock.unlock();
auto d = dispatchwork.begin();
while ( d != dispatchwork.end( ) ) {
(*d)->Invoke( );
++d;
}
}
void operator () () {
Do();
}
};
Y2xhc3MgZnVycm92aW5lZXhwb3J0IERpc3BhdGNoZXIgewogICAgcHJvdGVjdGVkOgoJCXR5cGVkZWYgc3RkOjp1bmlxdWVfcHRyPERpc3BhdGNoQmFzZT4gVERpc3BhdGNoOwoJCXR5cGVkZWYgc3RkOjpsaXN0PFREaXNwYXRjaD4gVERpc3BhdGNoTGlzdDsKCQlURGlzcGF0Y2hMaXN0IHdvcms7CgkJc3RkOjptdXRleCB0aGlzbG9jazsKCglwdWJsaWM6CgkJRGlzcGF0Y2hlciAoKSB7CgkJCQoJCX0KCgkJdGVtcGxhdGUgPHR5cGVuYW1lIFI+IHZvaWQgQWRkICggc3RkOjpmdW5jdGlvbjxSICggKT4gZiApIHsKCQkJdGhpc2xvY2subG9jaygpOwoJCQl3b3JrLnB1c2hfYmFjayggVERpc3BhdGNoKCBuZXcgRGlzcGF0Y2gwPFI+KCBmICkgKSApOwoJCQl0aGlzbG9jay51bmxvY2soKTsKCQl9CgoJCXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBUMT4gdm9pZCBBZGQgKCBzdGQ6OmZ1bmN0aW9uPFIgKFQxKT4gZiwgVDEgdDEgICkgewoJCQl0aGlzbG9jay5sb2NrKCk7CgkJCXdvcmsucHVzaF9iYWNrKCBURGlzcGF0Y2goIG5ldyBEaXNwYXRjaDE8UiwgVDE+KCBmLCB0MSApICkgKTsKCQkJdGhpc2xvY2sudW5sb2NrKCk7CgkJfQoKCQl0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPiB2b2lkIEFkZCAoIHN0ZDo6ZnVuY3Rpb248UiAoVDEpPiBmLCBUMSB0MSwgVDIgdDIgKSB7CgkJCXRoaXNsb2NrLmxvY2soKTsKCQkJd29yay5wdXNoX2JhY2soIAoJCQkJVERpc3BhdGNoKCBuZXcgRGlzcGF0Y2gyPFIsIFQxLCBUMj4oIGYsIAoJCQkJc3RkOjpmb3J3YXJkPFQxPiggdDEgKSwgCgkJCQlzdGQ6OmZvcndhcmQ8VDI+KCB0MiApICkgKSApOwoJCQl0aGlzbG9jay51bmxvY2soKTsKCQl9CgoJCXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPiB2b2lkIEFkZCAoIHN0ZDo6ZnVuY3Rpb248UiAoVDEpPiBmLCBUMSB0MSwgVDIgdDIsIFQzIHQzICkgewoJCQl0aGlzbG9jay5sb2NrKCk7CgkJCXdvcmsucHVzaF9iYWNrKCBURGlzcGF0Y2goIAoJCQkJbmV3IERpc3BhdGNoMzxSLCBUMSwgVDIsIFQzPiggZiwgCgkJCQlzdGQ6OmZvcndhcmQ8VDE+KCB0MSApLCAKCQkJCXN0ZDo6Zm9yd2FyZDxUMj4oIHQyICksIAoJCQkJc3RkOjpmb3J3YXJkPFQzPiggdDMgKSApICkgKTsKCQkJdGhpc2xvY2sudW5sb2NrKCk7CgkJfQoKCQl0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+IHZvaWQgQWRkICggc3RkOjpmdW5jdGlvbjxSIChUMSk+IGYsIFQxIHQxLCBUMiB0MiwgVDMgdDMgKSB7CgkJCXRoaXNsb2NrLmxvY2soKTsKCQkJd29yay5wdXNoX2JhY2soIFREaXNwYXRjaCggCgkJCQluZXcgRGlzcGF0Y2gzPFIsIFQxLCBUMiwgVDM+KCBmLCAKCQkJCXN0ZDo6Zm9yd2FyZDxUMT4oIHQxICksIAoJCQkJc3RkOjpmb3J3YXJkPFQyPiggdDIgKSwgCgkJCQlzdGQ6OmZvcndhcmQ8VDM+KCB0MyApLCAKCQkJCXN0ZDo6Zm9yd2FyZDxUND4oIHQ0ICkgKSApICk7CgkJCXRoaXNsb2NrLnVubG9jaygpOwoJCX0KCgkJdm9pZCBEbyAoKSB7CgkJCXRoaXNsb2NrLmxvY2soKTsKCQkJVERpc3BhdGNoTGlzdCBkaXNwYXRjaHdvcmsgPSBzdGQ6Om1vdmUoIHdvcmsgKTsKCQkJd29yay5jbGVhcigpOwoJCQl0aGlzbG9jay51bmxvY2soKTsKCQkJYXV0byBkID0gZGlzcGF0Y2h3b3JrLmJlZ2luKCk7CgkJCXdoaWxlICggZCAhPSBkaXNwYXRjaHdvcmsuZW5kKCApICkgewoJCQkJKCpkKS0+SW52b2tlKCApOwoJCQkJKytkOwoJCQl9CgkJfQoKCQl2b2lkIG9wZXJhdG9yICgpICgpIHsKCQkJRG8oKTsKCQl9Cgl9Ow==