#pragma once #include #include #include #include #include #include #include #include #include #include #include "loggable.h" class TaskManager : public Loggable { public: using Error = std::optional; using Job = std::function; using Result = std::function; using Task = std::pair>; TaskManager(const std::shared_ptr& logger); ~TaskManager(); void start(); void stop(); void wait() const; void queue(const Job& job); void queue(const Job& job, const Result& result); bool busy() const; private: void loop(); void executeTask(const Task& task) const; private: bool running; bool stopping; uint32_t maxThreads; uint32_t activeThreads; std::queue tasks; mutable std::mutex mutex; mutable std::condition_variable loopConditional; mutable std::condition_variable waitConditional; std::vector threads; };