#ifndef WORKER_H #define WORKER_H #include class Work; #if __cpp_lib_semaphore # include # include # include # include # include # include # include class Worker { public: Worker(); ~Worker(); NO_COPY(Worker); NO_MOVE(Worker); using WorkPtr = std::unique_ptr; template void addWork(Params &&... params) requires std::is_base_of_v { addWork(std::make_unique(std::forward(params)...)); } void addWork(WorkPtr w); private: void worker(); using Threads = std::vector; using ToDo = std::deque; Threads threads; ToDo todo; std::counting_semaphore<16> todoLen; std::mutex todoMutex; }; #else class Worker { public: template void addWork(Params &&... params) requires std::is_base_of_v { T(std::forward(params)...).doWork(); } }; #endif #endif