Files
MaaAssistantArknights/src/MaaCore/Config/TaskData/TaskDataSymbol.cpp
zzyyyl 6b5b0d5ec2 refactor: 优化与 TaskData 的 get_raw 和 get 相关部分
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 增加了别名;
2023-11-27 14:59:12 +08:00

56 lines
2.3 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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" };
}