From fc187fff9a6613091a309bb44751fc245900d2f6 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sun, 1 Dec 2024 19:05:26 +0100 Subject: Core/Misc: Port std::ranges::contains from c++23 (cherry picked from commit 3e2abd2535d3995e051a9c5bc52c2e671d70d843) --- src/common/Utilities/advstd.h | 28 ++++++++++++++++++++++++++++ src/server/game/Loot/LootMgr.cpp | 2 +- src/server/shared/Realm/RealmList.cpp | 3 ++- 3 files changed, 31 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/common/Utilities/advstd.h b/src/common/Utilities/advstd.h index 5bdfb52b533..68ddf6a0c10 100644 --- a/src/common/Utilities/advstd.h +++ b/src/common/Utilities/advstd.h @@ -52,4 +52,32 @@ template // for std::ranges::equal_to, std::identity +#include // for std::input_iterator, std::sentinel_for, std::projected + +namespace advstd::ranges +{ +struct Contains +{ + template S, class T, class Proj = std::identity> + requires std::indirect_binary_predicate, T const*> + [[nodiscard]] inline constexpr bool operator()(I first, S last, T const& value, Proj proj = {}) const + { + return std::ranges::find(std::move(first), last, value, proj) != last; + } + + template + requires std::indirect_binary_predicate, Proj>, T const*> + [[nodiscard]] inline constexpr bool operator()(R&& r, T const& value, Proj proj = {}) const + { + auto first = std::ranges::begin(r); + auto last = std::ranges::end(r); + return std::ranges::find(std::move(first), last, value, proj) != last; + } +} inline constexpr contains; +} +#endif + #endif diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp index 2104cc0c5ab..02fc7b7762e 100644 --- a/src/server/game/Loot/LootMgr.cpp +++ b/src/server/game/Loot/LootMgr.cpp @@ -709,7 +709,7 @@ void LootTemplate::ProcessPersonalLoot(std::unordered_map #include @@ -129,7 +130,7 @@ void RealmList::UpdateRealms() for (boost::asio::ip::tcp::endpoint const& endpoint : _resolver->ResolveAll(fields[2 + i].GetStringView(), "")) { boost::asio::ip::address address = endpoint.address(); - if (std::ranges::find(addresses, address) != addresses.end()) + if (advstd::ranges::contains(addresses, address)) continue; addresses.push_back(std::move(address)); -- cgit v1.2.3