aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-12-01 19:05:26 +0100
committerShauren <shauren.trinity@gmail.com>2024-12-01 19:05:26 +0100
commit3e2abd2535d3995e051a9c5bc52c2e671d70d843 (patch)
treefebb90220cb7be45237f57641d138691ee6c1480
parent711fe685dd975b11f4b09fbcde81ddc42e609271 (diff)
Core/Misc: Port std::ranges::contains from c++23
-rw-r--r--src/common/Utilities/advstd.h28
-rw-r--r--src/server/game/Loot/LootMgr.cpp2
-rw-r--r--src/server/shared/Realm/RealmList.cpp3
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));