#pragma once
#include "TaskQueue.h"
#include <trantor/net/EventLoopThread.h>
#include <trantor/exports.h>
#include <string>
#include <queue>
#include <mutex>
#include <atomic>
namespace trantor
{
class TRANTOR_EXPORT SerialTaskQueue : public TaskQueue
{
  public:
    virtual void runTaskInQueue(const std::function<void()> &task);
    virtual void runTaskInQueue(std::function<void()> &&task);
    virtual std::string getName() const
    {
        return queueName_;
    };
    void waitAllTasksFinished();
    SerialTaskQueue() = delete;
    explicit SerialTaskQueue(const std::string &name);
    virtual ~SerialTaskQueue();
    [[deprecated("Use isRunningTask instead")]]
    bool isRuningTask()
    {
        return isRunningTask();
    }
    bool isRunningTask()
    {
        return loopThread_.getLoop()
                   ? loopThread_.getLoop()->isCallingFunctions()
                   : false;
    }
    size_t getTaskCount();
    void stop();
  protected:
    std::string queueName_;
    EventLoopThread loopThread_;
    bool stop_{false};
};
}  