#include <mutex>
#include <vector>
#include <functional>
struct dispatcher {
using queue_type = std::vector<std::function<void()>>;
using guard_type = std::lock_guard<std::mutex>;
queue_type work;
std::mutex mutex;
template<typename Functor>
void push(Functor&& functor)
{
guard_type guard(mutex);
work.emplace_back(std::forward<Functor>(functor));
}
void operator()()
{
queue_type to_process;
{
guard_type guard(mutex);
to_process = std::move(work);
}
for(auto&& task: to_process) {
task();
}
}
};
int main()
{
}
I2luY2x1ZGUgPG11dGV4PgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnN0cnVjdCBkaXNwYXRjaGVyIHsKICAgIHVzaW5nIHF1ZXVlX3R5cGUgPSBzdGQ6OnZlY3RvcjxzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4+OwogICAgdXNpbmcgZ3VhcmRfdHlwZSA9IHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PjsKICAgIHF1ZXVlX3R5cGUgd29yazsKICAgIHN0ZDo6bXV0ZXggbXV0ZXg7CiAgICAKICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+CiAgICB2b2lkIHB1c2goRnVuY3RvciYmIGZ1bmN0b3IpCiAgICB7CiAgICAgICAgZ3VhcmRfdHlwZSBndWFyZChtdXRleCk7CiAgICAgICAgd29yay5lbXBsYWNlX2JhY2soc3RkOjpmb3J3YXJkPEZ1bmN0b3I+KGZ1bmN0b3IpKTsKICAgIH0KICAgIAogICAgdm9pZCBvcGVyYXRvcigpKCkKICAgIHsKICAgICAgICBxdWV1ZV90eXBlIHRvX3Byb2Nlc3M7CiAgICAgICAgewogICAgICAgICAgICBndWFyZF90eXBlIGd1YXJkKG11dGV4KTsKICAgICAgICAgICAgdG9fcHJvY2VzcyA9IHN0ZDo6bW92ZSh3b3JrKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZm9yKGF1dG8mJiB0YXNrOiB0b19wcm9jZXNzKSB7CiAgICAgICAgICAgIHRhc2soKTsKICAgICAgICB9CiAgICB9Cn07CgppbnQgbWFpbigpCnsKfQ==