mirror of
https://github.com/MaaAssistantArknights/MaaAssistantArknights.git
synced 2026-07-17 18:01:26 +08:00
fix: 使用 std::erase & std::erase_if, 避免使用具有不同定义的 ranges::remove & ranges::remove_if 现在 get_raw 只能获取任务的继承信息,其它详细信息会在 get 的时候解析。 另: - 增加 TaskDerivedType 表示任务的继承类型 - 增加 TaskPipelineInfo 表示任务的流程信息(name + 5个TaskList的任务列表) - 增加 TaskDerivedInfo 表示任务的继承信息,包含 base & prefix & TaskDerivedType - 给各个任务类型的 shared_ptr 增加了别名;
56 lines
2.3 KiB
C++
56 lines
2.3 KiB
C++
#include "TaskDataSymbol.h"
|
||
|
||
asst::TaskDataSymbol::SymbolsOrError asst::TaskDataSymbol::append_prefix(
|
||
const TaskDataSymbol& symbol, const TaskDataSymbol& prefix, std::string_view self_name,
|
||
std::function<TaskDerivedConstPtr(std::string_view)> get_raw,
|
||
std::function<SymbolsOrError(const TaskList&)> compile_tasklist)
|
||
{
|
||
// 注意:A@#self 是 A 而不是 A@self_name, #self@A 是 self_name@A 而不是 A
|
||
std::string_view prefix_name;
|
||
if (prefix == SharpSelf) {
|
||
prefix_name = self_name;
|
||
}
|
||
else if (prefix.is_name()) {
|
||
prefix_name = prefix.name();
|
||
}
|
||
else [[unlikely]] {
|
||
return { std::nullopt, "prefix " + prefix.name() + " is not name or self" };
|
||
}
|
||
if (prefix_name.empty()) {
|
||
return std::vector { symbol };
|
||
}
|
||
if (symbol == SharpNone) {
|
||
return std::vector { symbol };
|
||
}
|
||
if (symbol == SharpSelf) {
|
||
return std::vector { symbol };
|
||
}
|
||
if (symbol.is_name()) {
|
||
if (symbol.name().empty()) {
|
||
return { std::nullopt, "name is empty" };
|
||
}
|
||
return std::vector { TaskDataSymbol(std::string(prefix_name) + '@' + symbol.name()) };
|
||
}
|
||
if (symbol == SharpBack) {
|
||
return std::vector { TaskDataSymbol(prefix_name) };
|
||
}
|
||
auto other_task_info_ptr = get_raw(prefix_name);
|
||
#define ASST_TASKDATA_PERFORM_OP_IF_BRANCH(t, s, m) \
|
||
if (symbol == s) { \
|
||
if (auto opt = compile_tasklist(other_task_info_ptr->t)) { \
|
||
return opt.value(); \
|
||
} \
|
||
return { std::nullopt, "failed to compile tasklist" }; \
|
||
}
|
||
if (other_task_info_ptr == nullptr) [[unlikely]] {
|
||
return { std::nullopt, "task not found" };
|
||
}
|
||
ASST_TASKDATA_PERFORM_OP_IF_BRANCH(next, SharpNext, false)
|
||
ASST_TASKDATA_PERFORM_OP_IF_BRANCH(sub, SharpSub, true)
|
||
ASST_TASKDATA_PERFORM_OP_IF_BRANCH(on_error_next, SharpOnErrorNext, false)
|
||
ASST_TASKDATA_PERFORM_OP_IF_BRANCH(exceeded_next, SharpExceededNext, false)
|
||
ASST_TASKDATA_PERFORM_OP_IF_BRANCH(reduce_other_times, SharpReduceOtherTimes, true)
|
||
#undef ASST_TASKDATA_PERFORM_OP_IF_BRANCH
|
||
return { std::nullopt, "unknown symbol" };
|
||
}
|