diff options
author | Shauren <shauren.trinity@gmail.com> | 2024-12-01 19:05:26 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2024-12-01 19:05:26 +0100 |
commit | 3e2abd2535d3995e051a9c5bc52c2e671d70d843 (patch) | |
tree | febb90220cb7be45237f57641d138691ee6c1480 | |
parent | 711fe685dd975b11f4b09fbcde81ddc42e609271 (diff) |
Core/Misc: Port std::ranges::contains from c++23
-rw-r--r-- | src/common/Utilities/advstd.h | 28 | ||||
-rw-r--r-- | src/server/game/Loot/LootMgr.cpp | 2 | ||||
-rw-r--r-- | src/server/shared/Realm/RealmList.cpp | 3 |
3 files changed, 31 insertions, 2 deletions
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 <typename To, typename From, #endif } +// std::ranges::contains +#ifndef __cpp_lib_ranges_contains +#include <functional> // for std::ranges::equal_to, std::identity +#include <iterator> // for std::input_iterator, std::sentinel_for, std::projected + +namespace advstd::ranges +{ +struct Contains +{ + template<std::input_iterator I, std::sentinel_for<I> S, class T, class Proj = std::identity> + requires std::indirect_binary_predicate<std::ranges::equal_to, std::projected<I, Proj>, 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<std::ranges::input_range R, class T, class Proj = std::identity> + requires std::indirect_binary_predicate<std::ranges::equal_to, std::projected<std::ranges::iterator_t<R>, 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 dc17eeaa479..b974c7dd8d9 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<Player*, std::unique_p auto newEnd = std::remove_if(lootersForItem.begin(), lootersForItem.end(), [&](Player const* looter) { - return std::ranges::find(gotLoot, looter) != gotLoot.end(); + return advstd::ranges::contains(gotLoot, looter); }); if (lootersForItem.begin() == newEnd) diff --git a/src/server/shared/Realm/RealmList.cpp b/src/server/shared/Realm/RealmList.cpp index 9fe48277353..8c5bb6751cf 100644 --- a/src/server/shared/Realm/RealmList.cpp +++ b/src/server/shared/Realm/RealmList.cpp @@ -27,6 +27,7 @@ #include "Util.h" #include "game_utilities_service.pb.h" #include "RealmList.pb.h" +#include "advstd.h" #include <boost/asio/ip/tcp.hpp> #include <zlib.h> @@ -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)); |