aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-08-17 12:40:27 +0200
committerShauren <shauren.trinity@gmail.com>2024-08-17 12:40:27 +0200
commitedb20999a3b414ebe1b89410f08f2434e8da1cdb (patch)
treeb12ed325f926bd7a98bd6a4e819c1a5ba6ae933b /src
parent1f952893fc82bc677058737f77de710c426c60ee (diff)
Core/Utils: Unwrap non-copyable pointers (unique_ptr) from Trinity::Containers::MapGetValuePtr
Diffstat (limited to 'src')
-rw-r--r--src/common/Containers/Utilities/MapUtils.h19
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp4
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp4
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp41
-rw-r--r--src/server/game/Loot/Loot.cpp10
5 files changed, 43 insertions, 35 deletions
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 <memory> // std::to_address, std::addressof
#include <type_traits>
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<class M>
-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<typename M::mapped_type>)
- return itr != map.end() ? itr->second : nullptr;
+ if constexpr (std::is_pointer_v<mapped_type>)
+ 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<mapped_type>)
+ 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 K, class V, template<class, class, class...> class M, class... Rest>
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index 205b4440041..652ee520ecb 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -1396,8 +1396,8 @@ Loot* Creature::GetLootForPlayer(Player const* player) const
if (m_personalLoot.empty())
return m_loot.get();
- if (std::unique_ptr<Loot> const* loot = Trinity::Containers::MapGetValuePtr(m_personalLoot, player->GetGUID()))
- return loot->get();
+ if (Loot* loot = Trinity::Containers::MapGetValuePtr(m_personalLoot, player->GetGUID()))
+ return loot;
return nullptr;
}
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index 6fffcbe2b8c..9e615d997c7 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -3974,8 +3974,8 @@ Loot* GameObject::GetLootForPlayer(Player const* player) const
if (m_personalLoot.empty())
return m_loot.get();
- if (std::unique_ptr<Loot> const* loot = Trinity::Containers::MapGetValuePtr(m_personalLoot, player->GetGUID()))
- return loot->get();
+ if (Loot* loot = Trinity::Containers::MapGetValuePtr(m_personalLoot, player->GetGUID()))
+ return loot;
return nullptr;
}
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 673a1678fe0..4ad5aabf6d9 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -3706,18 +3706,18 @@ PetLevelInfo const* ObjectMgr::GetPetLevelInfo(uint32 creature_id, uint8 level)
void ObjectMgr::PlayerCreateInfoAddItemHelper(uint32 race_, uint32 class_, uint32 itemId, int32 count)
{
- std::unique_ptr<PlayerInfo>* playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(race_), Classes(class_) });
+ PlayerInfo* playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(race_), Classes(class_) });
if (!playerInfo)
return;
if (count > 0)
- playerInfo->get()->item.emplace_back(itemId, count);
+ playerInfo->item.emplace_back(itemId, count);
else
{
if (count < -1)
TC_LOG_ERROR("sql.sql", "Invalid count {} specified on item {} be removed from original player create info (use -1)!", count, itemId);
- PlayerCreateInfoItems& items = playerInfo->get()->item;
+ PlayerCreateInfoItems& items = playerInfo->item;
auto erased = std::remove_if(items.begin(), items.end(), [itemId](PlayerCreateInfoItem const& item) { return item.item_id == itemId; });
if (erased == items.end())
@@ -3886,7 +3886,7 @@ void ObjectMgr::LoadPlayerInfo()
if (auto const& playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(raceIndex), Classes(characterLoadout->ChrClassID) }))
{
- playerInfo->get()->itemContext = ItemContext(characterLoadout->ItemContext);
+ playerInfo->itemContext = ItemContext(characterLoadout->ItemContext);
for (ItemTemplate const* itemTemplate : *items)
{
@@ -3912,7 +3912,7 @@ void ObjectMgr::LoadPlayerInfo()
count = itemTemplate->GetMaxStackSize();
}
- playerInfo->get()->item.emplace_back(itemTemplate->GetId(), count);
+ playerInfo->item.emplace_back(itemTemplate->GetId(), count);
}
}
}
@@ -4000,7 +4000,7 @@ void ObjectMgr::LoadPlayerInfo()
for (uint32 classIndex = CLASS_WARRIOR; classIndex < MAX_CLASSES; ++classIndex)
if (rcInfo->ClassMask == -1 || rcInfo->ClassMask == 0 || ((1 << (classIndex - 1)) & rcInfo->ClassMask))
if (auto const& playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(raceIndex), Classes(classIndex) }))
- playerInfo->get()->skills.push_back(rcInfo);
+ playerInfo->skills.push_back(rcInfo);
TC_LOG_INFO("server.loading", ">> Loaded player create skills in {} ms", GetMSTimeDiffToNow(oldMSTime));
}
@@ -4049,7 +4049,7 @@ void ObjectMgr::LoadPlayerInfo()
{
if (auto const& playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(raceIndex), Classes(classIndex) }))
{
- playerInfo->get()->customSpells.push_back(spellId);
+ playerInfo->customSpells.push_back(spellId);
++count;
}
// We need something better here, the check is not accounting for spells used by multiple races/classes but not all of them.
@@ -4116,7 +4116,7 @@ void ObjectMgr::LoadPlayerInfo()
{
if (auto const& playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(raceIndex), Classes(classIndex) }))
{
- playerInfo->get()->castSpells[playerCreateMode].push_back(spellId);
+ playerInfo->castSpells[playerCreateMode].push_back(spellId);
++count;
}
}
@@ -4164,7 +4164,7 @@ void ObjectMgr::LoadPlayerInfo()
}
if (auto const& playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(current_race), Classes(current_class) }))
- playerInfo->get()->action.push_back(PlayerCreateInfoAction(fields[2].GetUInt16(), fields[3].GetUInt32(), fields[4].GetUInt16()));
+ playerInfo->action.push_back(PlayerCreateInfoAction(fields[2].GetUInt16(), fields[3].GetUInt32(), fields[4].GetUInt16()));
++count;
}
@@ -4247,10 +4247,10 @@ void ObjectMgr::LoadPlayerInfo()
{
if (auto const& playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(race), Classes(current_class) }))
{
- if (!playerInfo->get()->levelInfo)
- playerInfo->get()->levelInfo = std::make_unique<PlayerLevelInfo[]>(sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL));
+ if (!playerInfo->levelInfo)
+ playerInfo->levelInfo = std::make_unique<PlayerLevelInfo[]>(sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL));
- PlayerLevelInfo& levelInfo = playerInfo->get()->levelInfo[current_level - 1];
+ PlayerLevelInfo& levelInfo = playerInfo->levelInfo[current_level - 1];
for (uint8 i = 0; i < MAX_STATS; ++i)
levelInfo.stats[i] = fields[i + 2].GetUInt16() + raceStatModifiers[race].StatModifier[i];
}
@@ -4299,7 +4299,7 @@ void ObjectMgr::LoadPlayerInfo()
continue;
// fatal error if no level 1 data
- if (!playerInfo->get()->levelInfo || playerInfo->get()->levelInfo[0].stats[0] == 0)
+ if (!playerInfo->levelInfo || playerInfo->levelInfo[0].stats[0] == 0)
{
TC_LOG_ERROR("sql.sql", "Race {} Class {} Level 1 does not have stats data!", race, class_);
ABORT();
@@ -4308,10 +4308,10 @@ void ObjectMgr::LoadPlayerInfo()
// fill level gaps
for (uint8 level = 1; level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); ++level)
{
- if (playerInfo->get()->levelInfo[level].stats[0] == 0)
+ if (playerInfo->levelInfo[level].stats[0] == 0)
{
TC_LOG_ERROR("sql.sql", "Race {} Class {} Level {} does not have stats data. Using stats data of level {}.", race, class_, level + 1, level);
- playerInfo->get()->levelInfo[level] = playerInfo->get()->levelInfo[level - 1];
+ playerInfo->levelInfo[level] = playerInfo->levelInfo[level - 1];
}
}
}
@@ -4400,12 +4400,12 @@ void ObjectMgr::GetPlayerLevelInfo(uint32 race, uint32 class_, uint8 level, Play
if (level < 1 || race >= MAX_RACES || class_ >= MAX_CLASSES)
return;
- auto const& pInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(race), Classes(class_) });
+ PlayerInfo const* pInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, {Races(race), Classes(class_)});
if (!pInfo)
return;
if (level <= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
- *info = pInfo->get()->levelInfo[level - 1];
+ *info = pInfo->levelInfo[level - 1];
else
BuildPlayerLevelInfo(race, class_, level, info);
}
@@ -4413,7 +4413,7 @@ void ObjectMgr::GetPlayerLevelInfo(uint32 race, uint32 class_, uint8 level, Play
void ObjectMgr::BuildPlayerLevelInfo(uint8 race, uint8 _class, uint8 level, PlayerLevelInfo* info) const
{
// base data (last known level)
- *info = ASSERT_NOTNULL(Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(race), Classes(_class) }))->get()->levelInfo[sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) - 1];
+ *info = ASSERT_NOTNULL(Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(race), Classes(_class) }))->levelInfo[sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) - 1];
// if conversion from uint32 to uint8 causes unexpected behaviour, change lvl to uint32
for (uint8 lvl = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) - 1; lvl < level; ++lvl)
@@ -10620,10 +10620,7 @@ PlayerInfo const* ObjectMgr::GetPlayerInfo(uint32 race, uint32 class_) const
return nullptr;
if (class_ >= MAX_CLASSES)
return nullptr;
- auto const& info = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(race), Classes(class_) });
- if (!info)
- return nullptr;
- return info->get();
+ return Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(race), Classes(class_) });
}
void ObjectMgr::LoadRaceAndClassExpansionRequirements()
diff --git a/src/server/game/Loot/Loot.cpp b/src/server/game/Loot/Loot.cpp
index 050f205eb8c..d1ab49f662e 100644
--- a/src/server/game/Loot/Loot.cpp
+++ b/src/server/game/Loot/Loot.cpp
@@ -148,13 +148,13 @@ Optional<LootSlotType> LootItem::GetUiTypeForPlayer(Player const* player, Loot c
if (freeforall)
{
- if (std::unique_ptr<NotNormalLootItemList> const* ffaItems = Trinity::Containers::MapGetValuePtr(loot.GetPlayerFFAItems(), player->GetGUID()))
+ if (NotNormalLootItemList const* ffaItems = Trinity::Containers::MapGetValuePtr(loot.GetPlayerFFAItems(), player->GetGUID()))
{
- auto ffaItemItr = std::find_if(ffaItems->get()->begin(), ffaItems->get()->end(), [&](NotNormalLootItem const& ffaItem)
+ auto ffaItemItr = std::ranges::find_if(*ffaItems, [&](NotNormalLootItem const& ffaItem)
{
return ffaItem.LootListId == LootListId;
});
- if (ffaItemItr != ffaItems->get()->end() && !ffaItemItr->is_looted)
+ if (ffaItemItr != ffaItems->end() && !ffaItemItr->is_looted)
return loot.GetLootMethod() == FREE_FOR_ALL ? LOOT_SLOT_TYPE_OWNER : LOOT_SLOT_TYPE_ALLOW_LOOT;
}
return {};
@@ -969,9 +969,9 @@ bool Loot::hasItemFor(Player const* player) const
if (!lootItem.is_looted && !lootItem.follow_loot_rules && lootItem.GetAllowedLooters().find(player->GetGUID()) != lootItem.GetAllowedLooters().end())
return true;
- if (std::unique_ptr<NotNormalLootItemList> const* ffaItems = Trinity::Containers::MapGetValuePtr(GetPlayerFFAItems(), player->GetGUID()))
+ if (NotNormalLootItemList const* ffaItems = Trinity::Containers::MapGetValuePtr(GetPlayerFFAItems(), player->GetGUID()))
{
- bool hasFfaItem = std::any_of(ffaItems->get()->begin(), ffaItems->get()->end(), [&](NotNormalLootItem const& ffaItem)
+ bool hasFfaItem = std::ranges::any_of(*ffaItems, [&](NotNormalLootItem const& ffaItem)
{
return !ffaItem.is_looted;
});