From ef6b994e662f9a4bbe29d66cea68d9afc6d177d1 Mon Sep 17 00:00:00 2001 From: Horror Proton <107091537+horror-proton@users.noreply.github.com> Date: Thu, 4 Aug 2022 22:20:24 +0800 Subject: [PATCH] feat: add C++ ranges library alternatives --- src/MeoAssistant/Assistant.cpp | 4 +- src/MeoAssistant/AsstConf.h | 8 ++++ src/MeoAssistant/AsstRanges.hpp | 29 ++++++++++++++ src/MeoAssistant/AutoRecruitTask.cpp | 38 +++++++++---------- src/MeoAssistant/BattleDataConfiger.cpp | 4 +- src/MeoAssistant/BattleFormationTask.cpp | 4 +- src/MeoAssistant/BattleImageAnalyzer.cpp | 9 +++-- src/MeoAssistant/BattleProcessTask.cpp | 6 +-- src/MeoAssistant/CreditShopImageAnalyzer.cpp | 10 ++--- src/MeoAssistant/DepotImageAnalyzer.cpp | 2 +- .../InfrastFacilityImageAnalyzer.cpp | 2 +- src/MeoAssistant/InfrastOfficeTask.cpp | 4 +- src/MeoAssistant/InfrastOperImageAnalyzer.cpp | 10 ++--- src/MeoAssistant/InfrastPowerTask.cpp | 4 +- src/MeoAssistant/InfrastProductionTask.cpp | 27 ++++++++----- src/MeoAssistant/InfrastReceptionTask.cpp | 4 +- src/MeoAssistant/ItemConfiger.cpp | 6 +-- src/MeoAssistant/MultiMatchImageAnalyzer.cpp | 8 ++-- src/MeoAssistant/OcrImageAnalyzer.cpp | 12 +++--- src/MeoAssistant/RecruitConfiger.cpp | 2 +- src/MeoAssistant/RecruitConfiger.h | 13 ++++--- src/MeoAssistant/RecruitImageAnalyzer.cpp | 2 +- .../RoguelikeBattleTaskPlugin.cpp | 6 +-- .../RoguelikeFormationTaskPlugin.cpp | 4 +- .../RoguelikeRecruitImageAnalyzer.cpp | 6 +-- .../RoguelikeRecruitTaskPlugin.cpp | 2 +- .../RoguelikeShoppingTaskPlugin.cpp | 4 +- src/MeoAssistant/StageDropsImageAnalyzer.cpp | 8 ++-- src/MeoAssistant/StageDropsTaskPlugin.cpp | 2 +- src/MeoAssistant/TaskData.cpp | 5 ++- src/MeoAssistant/TaskData.h | 2 +- 31 files changed, 150 insertions(+), 97 deletions(-) create mode 100644 src/MeoAssistant/AsstRanges.hpp diff --git a/src/MeoAssistant/Assistant.cpp b/src/MeoAssistant/Assistant.cpp index b83e2e14f2..140ae4bbac 100644 --- a/src/MeoAssistant/Assistant.cpp +++ b/src/MeoAssistant/Assistant.cpp @@ -1,7 +1,7 @@ #include "Assistant.h" #include -#include +#include "AsstRanges.hpp" #include @@ -180,7 +180,7 @@ std::vector asst::Assistant::get_tasks_list() const { std::vector result; std::unique_lock lock(m_mutex); - for (const auto& id : m_tasks_list | std::views::keys) { + for (const auto& id : m_tasks_list | views::keys) { result.emplace_back(id); } return result; diff --git a/src/MeoAssistant/AsstConf.h b/src/MeoAssistant/AsstConf.h index 01b6af04a9..94f041e492 100644 --- a/src/MeoAssistant/AsstConf.h +++ b/src/MeoAssistant/AsstConf.h @@ -1,5 +1,13 @@ #pragma once +#if !defined(ASST_USE_RANGES_STL) && !defined(ASST_USE_RANGES_RANGE_V3) +#ifdef __clang__ +#define ASST_USE_RANGES_RANGE_V3 +#else +#define ASST_USE_RANGES_STL +#endif +#endif + #ifdef _MSC_VER #define ASST_DO_PRAGMA(x) __pragma(x) #elif defined(__GNUC__) diff --git a/src/MeoAssistant/AsstRanges.hpp b/src/MeoAssistant/AsstRanges.hpp new file mode 100644 index 0000000000..2d4557f566 --- /dev/null +++ b/src/MeoAssistant/AsstRanges.hpp @@ -0,0 +1,29 @@ +#pragma once + +#include "AsstConf.h" + +#ifdef ASST_USE_RANGES_RANGE_V3 + +#include + +namespace asst +{ + namespace ranges = ::ranges; + namespace views = ::ranges::views; +} + +#elif defined(ASST_USE_RANGES_STL) + +#include + +namespace asst +{ + namespace ranges = std::ranges; + namespace views = std::views; +} + +#else + +#error + +#endif \ No newline at end of file diff --git a/src/MeoAssistant/AutoRecruitTask.cpp b/src/MeoAssistant/AutoRecruitTask.cpp index 5bec0bcbbd..7c6e24fecf 100644 --- a/src/MeoAssistant/AutoRecruitTask.cpp +++ b/src/MeoAssistant/AutoRecruitTask.cpp @@ -9,7 +9,7 @@ #include "Logger.hpp" #include -#include +#include "AsstRanges.hpp" namespace asst::recruit_calc { @@ -20,7 +20,7 @@ namespace asst::recruit_calc { rcs_with_single_tag.reserve(tags.size()); - std::ranges::transform(tags, std::back_inserter(rcs_with_single_tag), [](const std::string& t) { + ranges::transform(tags, std::back_inserter(rcs_with_single_tag), [](const std::string& t) { RecruitCombs result; result.tags = { t }; result.min_level = 6; @@ -42,8 +42,8 @@ namespace asst::recruit_calc for (auto& rc : rcs_with_single_tag) { rc.avg_level /= static_cast(rc.opers.size()); // intersection and union are based on sorted container - std::ranges::sort(rc.tags); - std::ranges::sort(rc.opers); + ranges::sort(rc.tags); + ranges::sort(rc.opers); } } @@ -75,13 +75,13 @@ namespace asst::recruit_calc static constexpr std::string_view SeniorOper = "高级资深干员"; for (auto comb_iter = result.begin(); comb_iter != result.end();) { - if (std::ranges::find(comb_iter->tags, SeniorOper) != comb_iter->tags.end()) { + if (ranges::find(comb_iter->tags, SeniorOper) != comb_iter->tags.end()) { ++comb_iter; continue; } // no senior tag, remove 6-star operators // assuming sorted by level - auto iter = std::ranges::find_if(comb_iter->opers, [](const RecruitOperInfo& op) { return op.level >= 6; }); + auto iter = ranges::find_if(comb_iter->opers, [](const RecruitOperInfo& op) { return op.level >= 6; }); if (iter == comb_iter->opers.end()) { ++comb_iter; continue; @@ -188,7 +188,7 @@ std::optional asst::AutoRecruitTask::try_get_start_button(const cv:: if (!start_analyzer.analyze()) return std::nullopt; start_analyzer.sort_result_horizontal(); auto iter = - std::ranges::find_if(std::as_const(start_analyzer.get_result()), + ranges::find_if(std::as_const(start_analyzer.get_result()), [&](const TextRect& r) -> bool { return !m_force_skipped.contains(slot_index_from_rect(r.rect)); }); @@ -278,7 +278,7 @@ asst::AutoRecruitTask::calc_task_result_type asst::AutoRecruitTask::recruit_calc bool has_refresh = !image_analyzer.get_refresh_rect().empty(); std::vector tag_names; - std::ranges::transform(tags, std::back_inserter(tag_names), std::mem_fn(&TextRect::text)); + ranges::transform(tags, std::back_inserter(tag_names), std::mem_fn(&TextRect::text)); bool has_special_tag = false; bool has_robot_tag = false; @@ -287,7 +287,7 @@ asst::AutoRecruitTask::calc_task_result_type asst::AutoRecruitTask::recruit_calc { json::value info = basic_info(); std::vector tag_json_vector; - std::ranges::transform(tags, std::back_inserter(tag_json_vector), std::mem_fn(&TextRect::text)); + ranges::transform(tags, std::back_inserter(tag_json_vector), std::mem_fn(&TextRect::text)); info["what"] = "RecruitTagsDetected"; info["details"] = json::object{ { "tags", json::array(tag_json_vector) } }; @@ -296,7 +296,7 @@ asst::AutoRecruitTask::calc_task_result_type asst::AutoRecruitTask::recruit_calc // special tags const std::vector SpecialTags = { "高级资深干员", "资深干员" }; - auto special_iter = std::ranges::find_first_of(SpecialTags, tag_names); + auto special_iter = ranges::find_first_of(SpecialTags, tag_names); if (special_iter != SpecialTags.cend()) [[unlikely]] { json::value info = basic_info(); info["what"] = "RecruitSpecialTag"; @@ -307,7 +307,7 @@ asst::AutoRecruitTask::calc_task_result_type asst::AutoRecruitTask::recruit_calc // robot tags const std::vector RobotTags = { "支援机械" }; - auto robot_iter = std::ranges::find_first_of(RobotTags, tag_names); + auto robot_iter = ranges::find_first_of(RobotTags, tag_names); if (robot_iter != RobotTags.cend()) [[unlikely]] { json::value info = basic_info(); info["what"] = "RecruitRobotTag"; @@ -323,20 +323,20 @@ asst::AutoRecruitTask::calc_task_result_type asst::AutoRecruitTask::recruit_calc for (RecruitCombs& rc : result_vec) { if (rc.min_level < 3) { // find another min level (assuming operator list sorted in increment order by level) - auto sec = std::ranges::find_if(rc.opers, [](const RecruitOperInfo& op) { return op.level >= 3; }); + auto sec = ranges::find_if(rc.opers, [](const RecruitOperInfo& op) { return op.level >= 3; }); if (sec != rc.opers.cend()) { rc.min_level = sec->level; } } } - std::ranges::sort(result_vec, + ranges::sort(result_vec, [&](const RecruitCombs& lhs, const RecruitCombs& rhs) -> bool { // prefer the one with special tag // workaround for https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues/1336 if (has_special_tag) { bool l_has = - std::ranges::find_first_of(lhs.tags, SpecialTags) != lhs.tags.cend(); + ranges::find_first_of(lhs.tags, SpecialTags) != lhs.tags.cend(); bool r_has = - std::ranges::find_first_of(rhs.tags, SpecialTags) != rhs.tags.cend(); + ranges::find_first_of(rhs.tags, SpecialTags) != rhs.tags.cend(); if (l_has != r_has) return l_has > r_has; } @@ -374,7 +374,7 @@ asst::AutoRecruitTask::calc_task_result_type asst::AutoRecruitTask::recruit_calc comb_json["tags"] = json::array(std::move(tags_json_vector)); std::vector opers_json_vector; - for (const RecruitOperInfo& oper_info : std::ranges::reverse_view(comb.opers)) { // print reversely + for (const RecruitOperInfo& oper_info : ranges::reverse_view(comb.opers)) { // print reversely json::value oper_json; oper_json["name"] = oper_info.name; oper_json["level"] = oper_info.level; @@ -433,7 +433,7 @@ asst::AutoRecruitTask::calc_task_result_type asst::AutoRecruitTask::recruit_calc if (!is_calc_only_task()) { // do not confirm, force skip - if (std::ranges::none_of(m_confirm_level, [&](const auto& i) { return i == final_combination.min_level; })) { + if (ranges::none_of(m_confirm_level, [&](const auto& i) { return i == final_combination.min_level; })) { calc_task_result_type result; result.success = true; result.force_skip = true; @@ -456,7 +456,7 @@ asst::AutoRecruitTask::calc_task_result_type asst::AutoRecruitTask::recruit_calc } // nothing to select, leave the selection empty - if (std::ranges::none_of(m_select_level, [&](const auto& i) { return i == final_combination.min_level; })) { + if (ranges::none_of(m_select_level, [&](const auto& i) { return i == final_combination.min_level; })) { calc_task_result_type result; result.success = true; result.force_skip = false; @@ -467,7 +467,7 @@ asst::AutoRecruitTask::calc_task_result_type asst::AutoRecruitTask::recruit_calc // select tags for (const std::string& final_tag_name : final_combination.tags) { auto tag_rect_iter = - std::ranges::find_if(tags, [&](const TextRect& r) { return r.text == final_tag_name; }); + ranges::find_if(tags, [&](const TextRect& r) { return r.text == final_tag_name; }); if (tag_rect_iter != tags.cend()) { m_ctrler->click(tag_rect_iter->rect); } diff --git a/src/MeoAssistant/BattleDataConfiger.cpp b/src/MeoAssistant/BattleDataConfiger.cpp index 3a22d9d2d0..a132cfbbfa 100644 --- a/src/MeoAssistant/BattleDataConfiger.cpp +++ b/src/MeoAssistant/BattleDataConfiger.cpp @@ -1,11 +1,11 @@ #include "BattleDataConfiger.h" -#include +#include "AsstRanges.hpp" #include bool asst::BattleDataConfiger::parse(const json::value& json) { - for (const auto& char_data_json : json.at("chars").as_object() | std::views::values) { + for (const auto& char_data_json : json.at("chars").as_object() | views::values) { BattleCharData data; std::string name = char_data_json.at("name").as_string(); data.name = name; diff --git a/src/MeoAssistant/BattleFormationTask.cpp b/src/MeoAssistant/BattleFormationTask.cpp index 3646378160..47fff0b812 100644 --- a/src/MeoAssistant/BattleFormationTask.cpp +++ b/src/MeoAssistant/BattleFormationTask.cpp @@ -1,6 +1,6 @@ #include "BattleFormationTask.h" -#include +#include "AsstRanges.hpp" #include "Resource.h" #include "Controller.h" @@ -31,7 +31,7 @@ bool asst::BattleFormationTask::_run() json::value info = basic_info_with_what("BattleFormation"); auto& details = info["details"]; auto& formation = details["formation"]; - for (const auto& name : m_groups | std::views::keys) { + for (const auto& name : m_groups | views::keys) { formation.array_emplace(name); } callback(AsstMsg::SubTaskExtraInfo, info); diff --git a/src/MeoAssistant/BattleImageAnalyzer.cpp b/src/MeoAssistant/BattleImageAnalyzer.cpp index 17cdbc0e86..da107cd1e2 100644 --- a/src/MeoAssistant/BattleImageAnalyzer.cpp +++ b/src/MeoAssistant/BattleImageAnalyzer.cpp @@ -1,6 +1,7 @@ #include "BattleImageAnalyzer.h" #include +#include "AsstRanges.hpp" #include "NoWarningCV.h" @@ -116,7 +117,7 @@ void asst::BattleImageAnalyzer::clear() noexcept void asst::BattleImageAnalyzer::sort_opers_by_cost() { // 本来游戏就是按费用排的,这里倒序一下就行了 - std::ranges::reverse(m_opers); + ranges::reverse(m_opers); } bool asst::BattleImageAnalyzer::opers_analyze() @@ -500,7 +501,7 @@ bool asst::BattleImageAnalyzer::kills_analyze() // 例子中的"0" std::string kills_count = kills_text.substr(0, pos); if (kills_count.empty() || - !std::ranges::all_of(kills_count, + !ranges::all_of(kills_count, [](char c) -> bool {return std::isdigit(c);})) { return false; } @@ -511,7 +512,7 @@ bool asst::BattleImageAnalyzer::kills_analyze() std::string total_kills = kills_text.substr(pos + 1, std::string::npos); int cur_total_kills = 0; if (total_kills.empty() || - !std::ranges::all_of(total_kills, + !ranges::all_of(total_kills, [](char c) -> bool {return std::isdigit(c);})) { Log.warn("total kills recognition failed, set to", m_pre_total_kills); cur_total_kills = m_pre_total_kills; @@ -539,7 +540,7 @@ bool asst::BattleImageAnalyzer::cost_analyze() std::string cost_str = cost_analyzer.get_result().front().text; if (cost_str.empty() || - !std::ranges::all_of(cost_str, + !ranges::all_of(cost_str, [](const char& c) -> bool {return std::isdigit(c);})) { return false; } diff --git a/src/MeoAssistant/BattleProcessTask.cpp b/src/MeoAssistant/BattleProcessTask.cpp index a3bbb535ef..898befcb14 100644 --- a/src/MeoAssistant/BattleProcessTask.cpp +++ b/src/MeoAssistant/BattleProcessTask.cpp @@ -3,7 +3,7 @@ #include #include #include -#include +#include "AsstRanges.hpp" #include "NoWarningCV.h" @@ -180,7 +180,7 @@ bool asst::BattleProcessTask::analyze_opers_preview() bool not_found = true; // 找出这个干员是哪个组里的,以及他的技能用法等 for (const auto& [group_name, deploy_opers] : m_copilot_data.groups) { - auto iter = std::ranges::find_if(deploy_opers, + auto iter = ranges::find_if(deploy_opers, [&](const BattleDeployOper& deploy) -> bool { return deploy.name == oper_name; }); @@ -596,7 +596,7 @@ bool asst::BattleProcessTask::try_possible_skill(const cv::Mat& image) MatchImageAnalyzer analyzer(image); analyzer.set_task_info(task_ptr); bool used = false; - for (auto& info : m_used_opers | std::views::values) { + for (auto& info : m_used_opers | views::values) { if (info.info.skill_usage != BattleSkillUsage::Possibly && info.info.skill_usage != BattleSkillUsage::Once) { continue; diff --git a/src/MeoAssistant/CreditShopImageAnalyzer.cpp b/src/MeoAssistant/CreditShopImageAnalyzer.cpp index 65ec777454..d1af89c947 100644 --- a/src/MeoAssistant/CreditShopImageAnalyzer.cpp +++ b/src/MeoAssistant/CreditShopImageAnalyzer.cpp @@ -1,6 +1,6 @@ #include "CreditShopImageAnalyzer.h" -#include +#include "AsstRanges.hpp" #include "NoWarningCV.h" @@ -91,9 +91,9 @@ bool asst::CreditShopImageAnalyzer::whether_to_buy_analyze() } if (m_is_white_list) { - std::ranges::sort(m_need_to_buy, [&](const auto& lhs, const auto& rhs) -> bool { - return std::ranges::find(m_shopping_list, lhs.second) - < std::ranges::find(m_shopping_list, rhs.second); + ranges::sort(m_need_to_buy, [&](const auto& lhs, const auto& rhs) -> bool { + return ranges::find(m_shopping_list, lhs.second) + < ranges::find(m_shopping_list, rhs.second); }); } @@ -106,7 +106,7 @@ bool asst::CreditShopImageAnalyzer::sold_out_analyze() MatchImageAnalyzer sold_out_analyzer(m_image); sold_out_analyzer.set_task_info("CreditShop-SoldOut"); - for (const auto& commodity : m_need_to_buy | std::views::keys) { + for (const auto& commodity : m_need_to_buy | views::keys) { sold_out_analyzer.set_roi(commodity); if (sold_out_analyzer.analyze()) { #ifdef ASST_DEBUG diff --git a/src/MeoAssistant/DepotImageAnalyzer.cpp b/src/MeoAssistant/DepotImageAnalyzer.cpp index 2c7e7b631a..2dfffac05e 100644 --- a/src/MeoAssistant/DepotImageAnalyzer.cpp +++ b/src/MeoAssistant/DepotImageAnalyzer.cpp @@ -281,7 +281,7 @@ int asst::DepotImageAnalyzer::match_quantity(const Rect& roi) //} if (digit_str.empty() || - !std::ranges::all_of(digit_str, + !ranges::all_of(digit_str, [](const char& c) -> bool {return std::isdigit(c) || c == '.';})) { return 0; } diff --git a/src/MeoAssistant/InfrastFacilityImageAnalyzer.cpp b/src/MeoAssistant/InfrastFacilityImageAnalyzer.cpp index 01bf1f98bb..75bc9cde13 100644 --- a/src/MeoAssistant/InfrastFacilityImageAnalyzer.cpp +++ b/src/MeoAssistant/InfrastFacilityImageAnalyzer.cpp @@ -58,7 +58,7 @@ bool asst::InfrastFacilityImageAnalyzer::analyze() const auto& cur_res = mm_analyzer.get_result(); auto cur_max_iter = - std::ranges::max_element(cur_res, [](const MatchRect& lhs, const MatchRect& rhs) -> bool { + ranges::max_element(cur_res, [](const MatchRect& lhs, const MatchRect& rhs) -> bool { return lhs.score < rhs.score; }); if (cur_max_iter == cur_res.cend()) { diff --git a/src/MeoAssistant/InfrastOfficeTask.cpp b/src/MeoAssistant/InfrastOfficeTask.cpp index c2fa1f0535..d15d637946 100644 --- a/src/MeoAssistant/InfrastOfficeTask.cpp +++ b/src/MeoAssistant/InfrastOfficeTask.cpp @@ -2,6 +2,8 @@ #include "Controller.h" +#include "AsstRanges.hpp" + bool asst::InfrastOfficeTask::_run() { m_all_available_opers.clear(); @@ -22,7 +24,7 @@ bool asst::InfrastOfficeTask::_run() } swipe_to_the_left_of_operlist(); - auto find_iter = std::ranges::find_if(m_all_available_opers, + auto find_iter = ranges::find_if(m_all_available_opers, [&](const infrast::Oper& info) -> bool { return info.selected; }); diff --git a/src/MeoAssistant/InfrastOperImageAnalyzer.cpp b/src/MeoAssistant/InfrastOperImageAnalyzer.cpp index 7f5b9a824a..bf5a4b3d75 100644 --- a/src/MeoAssistant/InfrastOperImageAnalyzer.cpp +++ b/src/MeoAssistant/InfrastOperImageAnalyzer.cpp @@ -1,6 +1,6 @@ #include "InfrastOperImageAnalyzer.h" -#include +#include "AsstRanges.hpp" #include "NoWarningCV.h" @@ -45,7 +45,7 @@ void asst::InfrastOperImageAnalyzer::sort_by_loc() { LogTraceFunction; - std::ranges::sort(m_result, [](const infrast::Oper& lhs, const infrast::Oper& rhs) -> bool { + ranges::sort(m_result, [](const infrast::Oper& lhs, const infrast::Oper& rhs) -> bool { if (std::abs(lhs.rect.x - rhs.rect.x) < 5) { // x差距较小则理解为是同一排的,按y排序 return lhs.rect.y < rhs.rect.y; @@ -60,7 +60,7 @@ void asst::InfrastOperImageAnalyzer::sort_by_mood() { LogTraceFunction; - std::ranges::sort(m_result, [](const infrast::Oper& lhs, const infrast::Oper& rhs) -> bool { + ranges::sort(m_result, [](const infrast::Oper& lhs, const infrast::Oper& rhs) -> bool { // 先按心情排序,心情低的放前面 if (std::fabs(lhs.mood_ratio - rhs.mood_ratio) > DoubleDiff) { return lhs.mood_ratio < rhs.mood_ratio; @@ -271,7 +271,7 @@ void asst::InfrastOperImageAnalyzer::skill_analyze() std::vector> possible_skills; // 逐个该设施内所有可能的技能,取得分最高的 - for (const auto& skill : Resrc.infrast().get_skills(m_facility) | std::views::values) { + for (const auto& skill : Resrc.infrast().get_skills(m_facility) | views::values) { skill_analyzer.set_templ_name(skill.templ_name); if (!skill_analyzer.analyze()) { @@ -296,7 +296,7 @@ void asst::InfrastOperImageAnalyzer::skill_analyze() // 匹配得分最高的id作为基准,排除有识别错误,其他的技能混进来了的情况 // 即排除容器中,除了有同一个技能的不同等级,还有别的技能的情况 auto max_iter = - std::ranges::max_element(possible_skills, [](const auto& lhs, const auto& rhs) -> bool { + ranges::max_element(possible_skills, [](const auto& lhs, const auto& rhs) -> bool { return lhs.second.score < rhs.second.score; }); double base_score = max_iter->second.score; diff --git a/src/MeoAssistant/InfrastPowerTask.cpp b/src/MeoAssistant/InfrastPowerTask.cpp index ca2835dbb9..35cfce8d53 100644 --- a/src/MeoAssistant/InfrastPowerTask.cpp +++ b/src/MeoAssistant/InfrastPowerTask.cpp @@ -2,6 +2,8 @@ #include "Controller.h" +#include "AsstRanges.hpp" + bool asst::InfrastPowerTask::_run() { m_all_available_opers.clear(); @@ -34,7 +36,7 @@ bool asst::InfrastPowerTask::_run() opers_detect(); } - auto find_iter = std::ranges::find_if(m_all_available_opers, + auto find_iter = ranges::find_if(m_all_available_opers, [&](const infrast::Oper& info) -> bool { return info.selected; }); diff --git a/src/MeoAssistant/InfrastProductionTask.cpp b/src/MeoAssistant/InfrastProductionTask.cpp index 5c7cf63a99..ebdd3edee0 100644 --- a/src/MeoAssistant/InfrastProductionTask.cpp +++ b/src/MeoAssistant/InfrastProductionTask.cpp @@ -1,6 +1,7 @@ #include "InfrastProductionTask.h" #include +#include "AsstRanges.hpp" #include @@ -206,7 +207,7 @@ size_t asst::InfrastProductionTask::opers_detect() //--cur_available_num; continue; } - auto find_iter = std::ranges::find_if(m_all_available_opers, + auto find_iter = ranges::find_if(m_all_available_opers, [&](const infrast::Oper& oper) -> bool { if (oper.skills != cur_oper.skills) { return false; @@ -243,7 +244,7 @@ bool asst::InfrastProductionTask::optimal_calc() std::vector optimal_combs; optimal_combs.reserve(cur_max_num_of_opers); double max_efficient = 0; - std::ranges::sort(all_available_combs, + ranges::sort(all_available_combs, [&](const infrast::SkillsComb& lhs, const infrast::SkillsComb& rhs) -> bool { return lhs.efficient.at(m_product) > rhs.efficient.at(m_product); }); @@ -328,7 +329,7 @@ bool asst::InfrastProductionTask::optimal_calc() // necessary里的技能,一个都不能少 // TODO necessary暂时没做hash校验。因为没有需要比hash的necessary干员( for (const infrast::SkillsComb& nec_skills : group.necessary) { - auto find_iter = std::ranges::find_if(cur_available_opers, + auto find_iter = ranges::find_if(cur_available_opers, [&](const infrast::SkillsComb& arg) -> bool { return arg == nec_skills; }); @@ -358,7 +359,7 @@ bool asst::InfrastProductionTask::optimal_calc() } } - std::ranges::sort(optional, + ranges::sort(optional, [&](const infrast::SkillsComb& lhs, const infrast::SkillsComb& rhs) -> bool { return lhs.efficient.at(m_product) > rhs.efficient.at(m_product); @@ -387,7 +388,7 @@ bool asst::InfrastProductionTask::optimal_calc() continue; } std::string name = name_analyzer.get_result().front().text; - hash_matched = std::ranges::find(opt.name_filter, name) != opt.name_filter.cend(); + hash_matched = ranges::find(opt.name_filter, name) != opt.name_filter.cend(); } if (!hash_matched) { ++find_iter; @@ -492,15 +493,21 @@ bool asst::InfrastProductionTask::opers_choose() auto cur_all_opers = oper_analyzer.get_result(); Log.trace("before mood filter, opers size:", cur_all_opers.size()); // 小于心情阈值的干员则不可用 - auto remove_iter = std::ranges::remove_if(cur_all_opers, + auto remove_iter = ranges::remove_if(cur_all_opers, [&](const infrast::Oper& rhs) -> bool { return rhs.mood_ratio < m_mood_threshold; - }).begin(); + }); +#ifdef ASST_USE_RANGES_STL + cur_all_opers.erase(remove_iter.begin(), cur_all_opers.end()); +#elif defined(ASST_USE_RANGES_RANGE_V3) cur_all_opers.erase(remove_iter, cur_all_opers.end()); +#else +#error +#endif Log.trace("after mood filter, opers size:", cur_all_opers.size()); for (auto opt_iter = m_optimal_combs.begin(); opt_iter != m_optimal_combs.end();) { Log.trace("to find", opt_iter->skills.begin()->names.front()); - auto find_iter = std::ranges::find_if(cur_all_opers, + auto find_iter = ranges::find_if(cur_all_opers, [&](const infrast::Oper& lhs) -> bool { if (lhs.skills != opt_iter->skills) { return false; @@ -517,7 +524,7 @@ bool asst::InfrastProductionTask::opers_choose() return false; } std::string name = name_analyzer.get_result().front().text; - return std::ranges::find(std::as_const(opt_iter->name_filter), name) != opt_iter->name_filter.cend(); + return ranges::find(std::as_const(opt_iter->name_filter), name) != opt_iter->name_filter.cend(); } }); @@ -540,7 +547,7 @@ bool asst::InfrastProductionTask::opers_choose() m_ctrler->click(find_iter->rect); } { - auto avlb_iter = std::ranges::find_if(m_all_available_opers, + auto avlb_iter = ranges::find_if(m_all_available_opers, [&](const infrast::Oper& lhs) -> bool { int dist = HashImageAnalyzer::hamming(lhs.face_hash, find_iter->face_hash); Log.debug("opers_choose | face hash dist", dist); diff --git a/src/MeoAssistant/InfrastReceptionTask.cpp b/src/MeoAssistant/InfrastReceptionTask.cpp index 2fb6419601..410188bbf9 100644 --- a/src/MeoAssistant/InfrastReceptionTask.cpp +++ b/src/MeoAssistant/InfrastReceptionTask.cpp @@ -1,6 +1,6 @@ #include "InfrastReceptionTask.h" -#include +#include "AsstRanges.hpp" #include "Controller.h" #include "InfrastClueImageAnalyzer.h" @@ -72,7 +72,7 @@ bool asst::InfrastReceptionTask::use_clue() if (!vacancy_analyzer.analyze()) { } const auto& vacancy = vacancy_analyzer.get_vacancy(); - for (const auto& id : vacancy | std::views::keys) { + for (const auto& id : vacancy | views::keys) { Log.trace("InfrastReceptionTask | Vacancy", id); } diff --git a/src/MeoAssistant/ItemConfiger.cpp b/src/MeoAssistant/ItemConfiger.cpp index bc5419d32b..14c3f03141 100644 --- a/src/MeoAssistant/ItemConfiger.cpp +++ b/src/MeoAssistant/ItemConfiger.cpp @@ -1,6 +1,6 @@ #include "ItemConfiger.h" -#include +#include "AsstRanges.hpp" #include #include "Logger.hpp" @@ -21,10 +21,10 @@ bool asst::ItemConfiger::parse(const json::value& json) m_ordered_material_item_id.clear(); m_ordered_material_item_id.reserve(material_sortid.size()); - for (const auto& item_id : material_sortid | std::views::keys) { + for (const auto& item_id : material_sortid | views::keys) { m_ordered_material_item_id.emplace_back(item_id); } - std::ranges::sort(m_ordered_material_item_id, + ranges::sort(m_ordered_material_item_id, [&](const std::string& lhs, const std::string& rhs) -> bool { return material_sortid[lhs] < material_sortid[rhs]; }); diff --git a/src/MeoAssistant/MultiMatchImageAnalyzer.cpp b/src/MeoAssistant/MultiMatchImageAnalyzer.cpp index b442bbe7b5..b468a6d9ad 100644 --- a/src/MeoAssistant/MultiMatchImageAnalyzer.cpp +++ b/src/MeoAssistant/MultiMatchImageAnalyzer.cpp @@ -1,6 +1,6 @@ #include "MultiMatchImageAnalyzer.h" -#include +#include "AsstRanges.hpp" #include #include "NoWarningCV.h" @@ -32,7 +32,7 @@ bool asst::MultiMatchImageAnalyzer::analyze() void asst::MultiMatchImageAnalyzer::sort_result_horizontal() { // 按位置排个序 - std::ranges::sort(m_result, + ranges::sort(m_result, [](const MatchRect& lhs, const MatchRect& rhs) -> bool { if (std::abs(lhs.rect.y - rhs.rect.y) < 5) { // y差距较小则理解为是同一排的,按x排序 return lhs.rect.x < rhs.rect.x; @@ -46,7 +46,7 @@ void asst::MultiMatchImageAnalyzer::sort_result_horizontal() void asst::MultiMatchImageAnalyzer::sort_result_vertical() { // 按位置排个序 - std::ranges::sort(m_result, + ranges::sort(m_result, [](const MatchRect& lhs, const MatchRect& rhs) -> bool { if (std::abs(lhs.rect.x - rhs.rect.x) < 5) { // x差距较小则理解为是同一排的,按y排序 return lhs.rect.y < rhs.rect.y; @@ -132,7 +132,7 @@ bool asst::MultiMatchImageAnalyzer::multi_match_templ(const cv::Mat templ) bool need_push = true; // 如果有两个点离得太近,只取里面得分高的那个 // 一般相邻的都是刚刚push进去的,这里倒序快一点 - for (auto& iter : std::ranges::reverse_view(m_result)) { + for (auto& iter : ranges::reverse_view(m_result)) { if (std::abs(j + m_roi.x - iter.rect.x) < mini_distance && std::abs(i + m_roi.y - iter.rect.y) < mini_distance) { if (iter.score < value) { iter.rect = rect; diff --git a/src/MeoAssistant/OcrImageAnalyzer.cpp b/src/MeoAssistant/OcrImageAnalyzer.cpp index db06081f42..4bba8672c7 100644 --- a/src/MeoAssistant/OcrImageAnalyzer.cpp +++ b/src/MeoAssistant/OcrImageAnalyzer.cpp @@ -27,7 +27,7 @@ bool asst::OcrImageAnalyzer::analyze() if (!m_required.empty()) { if (m_full_match) { TextRectProc required_match = [&](TextRect& tr) -> bool { - return std::ranges::find(m_required, tr.text) != m_required.cend(); + return ranges::find(m_required, tr.text) != m_required.cend(); }; preds_vec.emplace_back(required_match); } @@ -40,7 +40,7 @@ bool asst::OcrImageAnalyzer::analyze() tr.text = str; return true; }; - return std::ranges::find_if(m_required, is_sub) != m_required.cend(); + return ranges::find_if(m_required, is_sub) != m_required.cend(); }; preds_vec.emplace_back(required_search); } @@ -161,7 +161,7 @@ const std::vector& asst::OcrImageAnalyzer::get_result() const no void asst::OcrImageAnalyzer::sort_result_horizontal() { // 按位置排个序 - std::ranges::sort(get_result(), + ranges::sort(get_result(), [](const TextRect& lhs, const TextRect& rhs) -> bool { if (std::abs(lhs.rect.y - rhs.rect.y) < 5) { // y差距较小则理解为是同一排的,按x排序 return lhs.rect.x < rhs.rect.x; @@ -180,7 +180,7 @@ void asst::OcrImageAnalyzer::sort_result_vertical() // |1 3| // |2 4| // +---+ - std::ranges::sort(get_result(), + ranges::sort(get_result(), [](const TextRect& lhs, const TextRect& rhs) -> bool { if (std::abs(lhs.rect.x - rhs.rect.x) < 5) { // x差距较小则理解为是同一排的,按y排序 return lhs.rect.y < rhs.rect.y; @@ -194,7 +194,7 @@ void asst::OcrImageAnalyzer::sort_result_vertical() void asst::OcrImageAnalyzer::sort_result_by_score() { - std::ranges::sort(get_result(), + ranges::sort(get_result(), [](const TextRect& lhs, const TextRect& rhs) -> bool { return lhs.score > rhs.score; } @@ -214,7 +214,7 @@ void asst::OcrImageAnalyzer::sort_result_by_required() auto& result = get_result(); // 不在 m_required 中的将被排在最后 - std::ranges::sort(result, + ranges::sort(result, [&req_cache](const auto& lhs, const auto& rhs) -> bool { size_t lvalue = req_cache[lhs.text]; size_t rvalue = req_cache[rhs.text]; diff --git a/src/MeoAssistant/RecruitConfiger.cpp b/src/MeoAssistant/RecruitConfiger.cpp index 08ff76c0e8..d259c284d0 100644 --- a/src/MeoAssistant/RecruitConfiger.cpp +++ b/src/MeoAssistant/RecruitConfiger.cpp @@ -35,7 +35,7 @@ bool asst::RecruitConfiger::parse(const json::value& json) } // 按干员等级排个序 - std::ranges::sort(m_all_opers, [](const auto& lhs, const auto& rhs) -> bool { + ranges::sort(m_all_opers, [](const auto& lhs, const auto& rhs) -> bool { return lhs.level > rhs.level; }); diff --git a/src/MeoAssistant/RecruitConfiger.h b/src/MeoAssistant/RecruitConfiger.h index 34baf78bad..81d3e605a0 100644 --- a/src/MeoAssistant/RecruitConfiger.h +++ b/src/MeoAssistant/RecruitConfiger.h @@ -7,6 +7,7 @@ #include #include #include +#include "AsstRanges.hpp" #include "AsstTypes.h" @@ -71,16 +72,16 @@ namespace asst // intersection of two recruit combs friend RecruitCombs operator*(RecruitCombs& lhs, RecruitCombs& rhs) { - std::ranges::sort(lhs.tags); - std::ranges::sort(lhs.opers); - std::ranges::sort(rhs.tags); - std::ranges::sort(rhs.opers); + ranges::sort(lhs.tags); + ranges::sort(lhs.opers); + ranges::sort(rhs.tags); + ranges::sort(rhs.opers); RecruitCombs result; - std::ranges::set_union(lhs.tags, rhs.tags, std::back_inserter(result.tags)); + ranges::set_union(lhs.tags, rhs.tags, std::back_inserter(result.tags)); - std::ranges::set_intersection(lhs.opers, rhs.opers, std::back_inserter(result.opers)); + ranges::set_intersection(lhs.opers, rhs.opers, std::back_inserter(result.opers)); result.update_attributes(); diff --git a/src/MeoAssistant/RecruitImageAnalyzer.cpp b/src/MeoAssistant/RecruitImageAnalyzer.cpp index 37441a73e9..6cd0c24da3 100644 --- a/src/MeoAssistant/RecruitImageAnalyzer.cpp +++ b/src/MeoAssistant/RecruitImageAnalyzer.cpp @@ -27,7 +27,7 @@ bool asst::RecruitImageAnalyzer::tags_analyze() std::vector all_tags_vec; all_tags_vec.assign(all_tags_set.begin(), all_tags_set.end()); // 把因为“资深干员”是“高级资深干员”的子串,把“高级资深干员”放到最前面,免得先被“资深干员”匹配上了 - auto ssr_iter = std::ranges::find(all_tags_vec, "高级资深干员"); + auto ssr_iter = ranges::find(all_tags_vec, "高级资深干员"); if (ssr_iter != all_tags_vec.end()) { std::swap(*ssr_iter, all_tags_vec.front()); } diff --git a/src/MeoAssistant/RoguelikeBattleTaskPlugin.cpp b/src/MeoAssistant/RoguelikeBattleTaskPlugin.cpp index 2871be8b57..7da060c9f3 100644 --- a/src/MeoAssistant/RoguelikeBattleTaskPlugin.cpp +++ b/src/MeoAssistant/RoguelikeBattleTaskPlugin.cpp @@ -2,7 +2,7 @@ #include #include -#include +#include "AsstRanges.hpp" #include "NoWarningCV.h" @@ -383,7 +383,7 @@ bool asst::RoguelikeBattleTaskPlugin::abandon() void asst::RoguelikeBattleTaskPlugin::all_melee_retreat() { - for (const auto& loc : m_used_tiles | std::views::keys) { + for (const auto& loc : m_used_tiles | views::keys) { auto& tile_info = m_normal_tile_info[loc]; auto& type = tile_info.buildable; if (type == Loc::Melee || type == Loc::All) { @@ -621,7 +621,7 @@ asst::RoguelikeBattleTaskPlugin::DeployInfo asst::RoguelikeBattleTaskPlugin::cal return calc_best_plan(oper); } - std::ranges::sort(available_locations, comp_dist); + ranges::sort(available_locations, comp_dist); // 取距离最近的N个点,计算分数。然后使用得分最高的点 constexpr int CalcPointCount = 4; diff --git a/src/MeoAssistant/RoguelikeFormationTaskPlugin.cpp b/src/MeoAssistant/RoguelikeFormationTaskPlugin.cpp index 92c46a8883..fffe90e714 100644 --- a/src/MeoAssistant/RoguelikeFormationTaskPlugin.cpp +++ b/src/MeoAssistant/RoguelikeFormationTaskPlugin.cpp @@ -1,5 +1,7 @@ #include "RoguelikeFormationTaskPlugin.h" +#include "AsstRanges.hpp" + #include "RoguelikeFormationImageAnalyzer.h" #include "Controller.h" #include "TaskData.h" @@ -58,7 +60,7 @@ bool asst::RoguelikeFormationTaskPlugin::_run() } auto& new_result = formation_analyzer.get_result(); - size_t new_selected_count = std::ranges::count_if(new_result, + size_t new_selected_count = ranges::count_if(new_result, [](const auto& oper) { return oper.selected; }); // 说明 select_count 计数没生效,即都没点上 if (new_selected_count == pre_selected) { diff --git a/src/MeoAssistant/RoguelikeRecruitImageAnalyzer.cpp b/src/MeoAssistant/RoguelikeRecruitImageAnalyzer.cpp index 1e8fc58a1d..e5e584d004 100644 --- a/src/MeoAssistant/RoguelikeRecruitImageAnalyzer.cpp +++ b/src/MeoAssistant/RoguelikeRecruitImageAnalyzer.cpp @@ -32,13 +32,13 @@ bool asst::RoguelikeRecruitImageAnalyzer::analyze() info.name = name; info.elite = elite; info.level = level; - info.required = std::ranges::find(order, name) != order.cend(); + info.required = ranges::find(order, name) != order.cend(); Log.info(__FUNCTION__, name, elite, level, rect.to_string()); m_result.emplace_back(std::move(info)); } - auto first_un_req = std::ranges::find_if(m_result, + auto first_un_req = ranges::find_if(m_result, [&](const auto& info) -> bool { return info.required == false; }); @@ -100,7 +100,7 @@ int asst::RoguelikeRecruitImageAnalyzer::match_level(const Rect& raw_roi) } const std::string& level = analyzer.get_result().front().text; - if (level.empty() || !std::ranges::all_of(level, + if (level.empty() || !ranges::all_of(level, [](char c) -> bool {return std::isdigit(c);})) { return 0; } diff --git a/src/MeoAssistant/RoguelikeRecruitTaskPlugin.cpp b/src/MeoAssistant/RoguelikeRecruitTaskPlugin.cpp index e2f9964d65..41fdfafa57 100644 --- a/src/MeoAssistant/RoguelikeRecruitTaskPlugin.cpp +++ b/src/MeoAssistant/RoguelikeRecruitTaskPlugin.cpp @@ -130,7 +130,7 @@ bool asst::RoguelikeRecruitTaskPlugin::check_core_char() break; } const auto& chars = analyzer.get_result(); - auto it = std::ranges::find_if(chars, + auto it = ranges::find_if(chars, [&](const BattleRecruitOperInfo& oper) -> bool { return oper.name == core_opt.value(); }); diff --git a/src/MeoAssistant/RoguelikeShoppingTaskPlugin.cpp b/src/MeoAssistant/RoguelikeShoppingTaskPlugin.cpp index 16d361120c..c29086df6a 100644 --- a/src/MeoAssistant/RoguelikeShoppingTaskPlugin.cpp +++ b/src/MeoAssistant/RoguelikeShoppingTaskPlugin.cpp @@ -101,7 +101,7 @@ bool asst::RoguelikeShoppingTaskPlugin::_run() continue; } - auto find_it = std::ranges::find_if(result, + auto find_it = ranges::find_if(result, [&](const TextRect& tr) -> bool { return tr.text.find(goods.name) != std::string::npos || goods.name.find(tr.text) != std::string::npos; @@ -147,7 +147,7 @@ bool asst::RoguelikeShoppingTaskPlugin::_run() } if (!goods.chars.empty()) { - if (std::ranges::find_first_of(chars_list, goods.chars) == chars_list.cend()) { + if (ranges::find_first_of(chars_list, goods.chars) == chars_list.cend()) { Log.trace("Ready to buy", goods.name, ", but there is no such character, skip"); continue; diff --git a/src/MeoAssistant/StageDropsImageAnalyzer.cpp b/src/MeoAssistant/StageDropsImageAnalyzer.cpp index 1ebebdd26f..4f3758e650 100644 --- a/src/MeoAssistant/StageDropsImageAnalyzer.cpp +++ b/src/MeoAssistant/StageDropsImageAnalyzer.cpp @@ -1,6 +1,6 @@ #include "StageDropsImageAnalyzer.h" -#include +#include "AsstRanges.hpp" #include "NoWarningCV.h" @@ -57,7 +57,7 @@ bool asst::StageDropsImageAnalyzer::analyze_stage_code() const auto& stages = Resrc.drops().get_all_stage_code(); std::vector stages_req(stages.cbegin(), stages.cend()); // 名字长的放前面 - std::ranges::sort(stages_req, + ranges::sort(stages_req, [](const std::string& lhs, const std::string& rhs) -> bool { return lhs.size() > rhs.size(); }); @@ -336,7 +336,7 @@ bool asst::StageDropsImageAnalyzer::analyze_baseline() } Log.trace(__FUNCTION__, "baseline size", m_baseline.size()); - for (const auto& key : m_baseline | std::views::keys) { + for (const auto& key : m_baseline | views::keys) { Log.trace(__FUNCTION__, "baseline", key.to_string()); } @@ -559,7 +559,7 @@ int asst::StageDropsImageAnalyzer::match_quantity(const Rect& roi) //} if (digit_str.empty() || - !std::ranges::all_of(digit_str, + !ranges::all_of(digit_str, [](const char& c) -> bool {return std::isdigit(c) || c == '.';})) { return 0; } diff --git a/src/MeoAssistant/StageDropsTaskPlugin.cpp b/src/MeoAssistant/StageDropsTaskPlugin.cpp index 962a66b425..b6c338f7fd 100644 --- a/src/MeoAssistant/StageDropsTaskPlugin.cpp +++ b/src/MeoAssistant/StageDropsTaskPlugin.cpp @@ -233,7 +233,7 @@ void asst::StageDropsTaskPlugin::upload_to_penguin() for (const auto& drop : m_cur_info_json["drops"].as_array()) { static const std::vector filter = { "NORMAL_DROP", "EXTRA_DROP" , "FURNITURE", "SPECIAL_DROP" }; std::string drop_type = drop.at("dropType").as_string(); - if (std::ranges::find(filter, drop_type) == filter.cend()) { + if (ranges::find(filter, drop_type) == filter.cend()) { continue; } if (drop.at("itemId").as_string().empty()) { diff --git a/src/MeoAssistant/TaskData.cpp b/src/MeoAssistant/TaskData.cpp index 68b5c45d73..23918740d9 100644 --- a/src/MeoAssistant/TaskData.cpp +++ b/src/MeoAssistant/TaskData.cpp @@ -1,6 +1,7 @@ #include "TaskData.h" #include +#include "AsstRanges.hpp" #include @@ -23,7 +24,7 @@ bool asst::TaskData::parse(const json::value& json) }; for (const auto& [name, task_json] : json.as_object()) { std::string algorithm_str = task_json.get("algorithm", "matchtemplate"); - std::ranges::transform(algorithm_str, algorithm_str.begin(), to_lower); + ranges::transform(algorithm_str, algorithm_str.begin(), to_lower); auto algorithm = AlgorithmType::Invalid; if (algorithm_str == "matchtemplate") { algorithm = AlgorithmType::MatchTemplate; @@ -97,7 +98,7 @@ bool asst::TaskData::parse(const json::value& json) task_info_ptr->algorithm = algorithm; task_info_ptr->name = name; std::string action = task_json.get("action", "donothing"); - std::ranges::transform(action, action.begin(), to_lower); + ranges::transform(action, action.begin(), to_lower); if (action == "clickself") { task_info_ptr->action = ProcessTaskAction::ClickSelf; } diff --git a/src/MeoAssistant/TaskData.h b/src/MeoAssistant/TaskData.h index 4c27f07194..c7f79bee11 100644 --- a/src/MeoAssistant/TaskData.h +++ b/src/MeoAssistant/TaskData.h @@ -27,7 +27,7 @@ namespace asst template requires std::derived_from - && !std::same_as // Parameter must be a TaskInfo and not same as TaskInfo + && (!std::same_as) // Parameter must be a TaskInfo and not same as TaskInfo std::shared_ptr get(const std::string& name) { auto it = m_all_tasks_info.find(name);