#pragma once #include "Thread.hpp" #include #include #include #include #include #include namespace Chattr { class ThreadPool { public: ThreadPool(std::uint32_t numThreads); ~ThreadPool(); template requires ReturnsVoidPtr<_Callable, _Args...> && (!std::is_same_v, Thread>) int enqueueJob(_Callable&& __job, void* retVal, _Args&&... __args) { if (terminate_) { spdlog::error("Cannot run jobs on threads that terminating..."); return -1; } std::lock_guard lock(jobQueueMutex); auto boundFunc = std::bind(std::forward<_Callable>(__job), std::forward<_Args>(__args)...); std::function job(std::move(boundFunc)); jobs_.push(job, retVal); jobQueueCV_.notify_one(); } private: void* Worker(); std::condition_variable jobQueueCV_; std::mutex jobQueueMutex; std::queue, void*>> jobs_; std::vector workers_; bool terminate_ = false; }; }