From 6051a553ebef51cf1c35b0531de43217d797ab93 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 17 Aug 2024 12:40:27 +0200 Subject: Core/Utils: Unwrap non-copyable pointers (unique_ptr) from Trinity::Containers::MapGetValuePtr (cherry picked from commit edb20999a3b414ebe1b89410f08f2434e8da1cdb) --- src/common/Containers/Utilities/MapUtils.h | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'src/common/Containers/Utilities/MapUtils.h') diff --git a/src/common/Containers/Utilities/MapUtils.h b/src/common/Containers/Utilities/MapUtils.h index 7cf07243b0a..910f16022a6 100644 --- a/src/common/Containers/Utilities/MapUtils.h +++ b/src/common/Containers/Utilities/MapUtils.h @@ -18,6 +18,7 @@ #ifndef TRINITYCORE_MAP_UTILS_H #define TRINITYCORE_MAP_UTILS_H +#include // std::to_address, std::addressof #include namespace Trinity::Containers @@ -26,13 +27,23 @@ namespace Trinity::Containers * Returns a pointer to mapped value (or the value itself if map stores pointers) */ template -auto MapGetValuePtr(M& map, typename M::key_type const& key) +inline auto MapGetValuePtr(M& map, typename M::key_type const& key) { + using mapped_type = typename M::mapped_type; + auto itr = map.find(key); - if constexpr (std::is_pointer_v) - return itr != map.end() ? itr->second : nullptr; + if constexpr (std::is_pointer_v) + return itr != map.end() ? std::to_address(itr->second) : nullptr; // raw pointer + else if constexpr (requires(mapped_type const& p) { p.operator->(); }) + { + // smart pointers + if constexpr (std::is_copy_constructible_v) + return itr != map.end() ? itr->second : nullptr; // copyable (like shared_ptr) + else + return itr != map.end() ? std::to_address(itr->second) : nullptr; // non-copyable unique_ptr like, unwrap it to raw pointer + } else - return itr != map.end() ? &itr->second : nullptr; + return itr != map.end() ? std::addressof(itr->second) : nullptr; // value } template class M, class... Rest> -- cgit v1.2.3