载入中...
搜索中...
未找到
PcgTaskQueue.cpp
浏览该文件的文档.
3#include <algorithm>
4#include <cmath>
5#include <simplesquirrel/simplesquirrel.hpp>
6namespace eve::procgen {
7namespace { }
9 if(!std::isfinite(wait)||wait<0) return Result<std::uint64_t>::failure(Diagnostic::error(
10 DiagnosticCode::InvalidArgument,"task wait time must be finite and non-negative",{}, {},"procgen.taskQueue"));
11 const auto id=nextId_++; tasks_.push_back({id,wait,wait});
14}
16 if(!std::isfinite(dt)||dt<0) return Result<PcgTaskQueueStatus>::failure(Diagnostic::error(
17 DiagnosticCode::InvalidArgument,"delta time must be finite and non-negative",{}, {},"procgen.taskQueue"));
19 DiagnosticCode::InvalidArgument,"ready task must be resolved before ticking",{}, {},"procgen.taskQueue"));
20 if(tasks_.empty()) { status_=PcgTaskQueueStatus::Idle; return Result<PcgTaskQueueStatus>::success(status_); }
21 cursor_%=tasks_.size(); auto& task=tasks_[cursor_]; task.remaining-=dt;
22 if(task.remaining<=1e-12) { readyId_=task.id; status_=PcgTaskQueueStatus::Ready; }
23 else status_=PcgTaskQueueStatus::Waiting;
25}
28 DiagnosticCode::InvalidArgument,"no task is ready",{}, {},"procgen.taskQueue"));
29 if(finished) tasks_.erase(tasks_.begin()+static_cast<std::ptrdiff_t>(cursor_));
30 else { tasks_[cursor_].remaining=tasks_[cursor_].wait; ++cursor_; }
31 readyId_=0;
32 if(tasks_.empty()) { cursor_=0; status_=PcgTaskQueueStatus::Idle; }
33 else { cursor_%=tasks_.size(); status_=PcgTaskQueueStatus::Waiting; }
35}
36PcgTaskQueueStatus PcgTaskQueue::cancelAll() noexcept { tasks_.clear(); cursor_=0; readyId_=0; return status_=PcgTaskQueueStatus::Idle; }
37void exposePcgTaskQueueBindings(ssq::Table& table) {
38 auto cls=table.addClass("PcgTaskQueue",ssq::Class::Ctor<PcgTaskQueue()>());
39 cls.addFunc("add",[vm=table.getHandle()](PcgTaskQueue* q,float wait){return eve::script::projectResult(vm,q->add(wait),[](std::uint64_t id){return eve::Value(static_cast<int64_t>(id));});});
40 cls.addFunc("tick",[vm=table.getHandle()](PcgTaskQueue* q,float dt){return eve::script::projectResult(vm,q->tick(dt),[](PcgTaskQueueStatus s){return eve::Value(static_cast<int>(s));});});
41 cls.addFunc("resolveReady",[vm=table.getHandle()](PcgTaskQueue* q,bool done){return eve::script::projectResult(vm,q->resolveReady(done),[](PcgTaskQueueStatus s){return eve::Value(static_cast<int>(s));});});
42 cls.addFunc("cancelAll",[](PcgTaskQueue* q){return static_cast<int>(q->cancelAll());});
43 cls.addFunc("getReadyTaskId",[](const PcgTaskQueue* q){return static_cast<int64_t>(q->readyTaskId());});
44 cls.addFunc("getQueueSize",[](const PcgTaskQueue* q){return q->queueSize();});
45 cls.addFunc("getStatus",[](const PcgTaskQueue* q){return static_cast<int>(q->status());});
46}
47} // namespace eve::procgen
const std::string & s
HSQUIRRELVM vm
Definition ECS.cpp:20
HSQOBJECT cls
Definition ECS.cpp:21
std::array< double, 10 > q
std::string id
Definition PlayHost.cpp:108
The single Squirrel projection for common Result, Status and Value.
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
Definition Diagnostic.h:125
Move-only operation result carrying either a value or Status.
Definition Result.h:155
static Result success(T value)
Construct a successful result owning value.
Definition Result.h:164
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
Deterministic, callback-free port of PcgTask's delayed task queue.
Result< std::uint64_t > add(double waitSeconds=0.25)
Append a task with Pcg's default 0.25-second delay unless overridden.
Result< PcgTaskQueueStatus > resolveReady(bool finished)
Resolve the ready task; finished tasks are removed, unfinished tasks await their next pass.
Result< PcgTaskQueueStatus > tick(double deltaSeconds)
Advance injected time and publish at most one due task.
PcgTaskQueueStatus cancelAll() noexcept
Cancel every queued task and return Idle.
PcgTaskQueueStatus
Observable state of Pcg's delayed task processor.
void exposePcgTaskQueueBindings(ssq::Table &table)
Register PcgTaskQueue Squirrel bindings.
ssq::Table projectResult(HSQUIRRELVM vm, Result< void > &&result)
Consume and project a void native Result using the common schema.