#pragma once
#include "Worker.hpp"
NAMESPACE_SOUP
{
class Task : public Worker
{
public:
explicit Task() noexcept;
protected:
virtual void onTick() = 0;
public:
void tick();
[[nodiscard]] bool tickUntilDone();
void run();
protected:
[[nodiscard]] Capture& taskCapture() noexcept { return holdup_callback.cap; }
[[nodiscard]] const Capture& taskCapture() const noexcept { return holdup_callback.cap; }
public:
[[nodiscard]] virtual int getSchedulingDisposition() const noexcept
{
return NEUTRAL;
}
[[nodiscard]] virtual std::string toString() const SOUP_EXCAL;
};
template <typename T>
struct PromiseTask : public Task
{
T result;
using Task::Task;
[[nodiscard]] T&& await()
{
run();
return std::move(result);
}
void fulfil(T&& res) noexcept
{
result = std::move(res);
setWorkDone();
}
};
}