#pragma once #include "Task.h" #include #include #include #include #include namespace XCEngine { namespace Threading { class TaskGroup { public: using Callback = std::function; TaskGroup(); ~TaskGroup(); uint64_t AddTask(std::unique_ptr task); uint64_t AddTask(Callback&& func, TaskPriority priority = TaskPriority::Normal); void AddDependency(uint64_t taskId, uint64_t dependsOn); void Wait(); bool WaitFor(std::chrono::milliseconds timeout); void SetCompleteCallback(Callback&& callback); bool IsComplete() const; float GetProgress() const; void Cancel(); private: struct TaskNode { ITask* task = nullptr; std::vector dependencies; int pendingDepCount = 0; bool completed = false; }; std::vector m_tasks; std::atomic m_pendingCount{0}; std::atomic m_completedCount{0}; Callback m_completeCallback; mutable std::mutex m_mutex; std::condition_variable m_condition; std::atomic m_canceled{false}; }; } // namespace Threading } // namespace XCEngine