Skip to content

Commit

Permalink
Core/Misc: std::ranges-ify algorithms used in TraitMgr
Browse files Browse the repository at this point in the history
  • Loading branch information
Shauren committed Jul 25, 2024
1 parent 76ab45e commit ee301cf
Showing 1 changed file with 17 additions and 25 deletions.
42 changes: 17 additions & 25 deletions src/server/game/Spells/TraitMgr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -252,10 +252,7 @@ void Load()
{
if (std::vector<TraitTreeLoadoutEntryEntry const*>* entries = Trinity::Containers::MapGetValuePtr(traitTreeLoadoutEntries, traitTreeLoadout->ID))
{
std::sort(entries->begin(), entries->end(), [](TraitTreeLoadoutEntryEntry const* left, TraitTreeLoadoutEntryEntry const* right)
{
return left->OrderIndex < right->OrderIndex;
});
std::ranges::sort(*entries, std::ranges::less(), &TraitTreeLoadoutEntryEntry::OrderIndex);
// there should be only one loadout per spec, we take last one encountered
_traitTreeLoadoutsByChrSpecialization[traitTreeLoadout->ChrSpecializationID] = std::move(*entries);
}
Expand Down Expand Up @@ -321,7 +318,7 @@ bool HasEnoughCurrency(WorldPackets::Traits::TraitEntry const& entry, std::map<i
if (getCurrencyCount(cost->TraitCurrencyID) < cost->Amount * entry.Rank)
return false;

auto nodeEntryItr = std::find_if(node->Entries.begin(), node->Entries.end(), [&entry](NodeEntry const& nodeEntry) { return int32(nodeEntry.Data->ID) == entry.TraitNodeEntryID; });
auto nodeEntryItr = std::ranges::find_if(node->Entries, [&entry](NodeEntry const& nodeEntry) { return int32(nodeEntry.Data->ID) == entry.TraitNodeEntryID; });
if (nodeEntryItr != node->Entries.end())
for (TraitCostEntry const* cost : nodeEntryItr->Costs)
if (getCurrencyCount(cost->TraitCurrencyID) < cost->Amount * entry.Rank)
Expand All @@ -346,7 +343,7 @@ void TakeCurrencyCost(WorldPackets::Traits::TraitEntry const& entry, std::map<in
for (TraitCostEntry const* cost : group->Costs)
currencies[cost->TraitCurrencyID] -= cost->Amount * entry.Rank;

auto nodeEntryItr = std::find_if(node->Entries.begin(), node->Entries.end(), [&entry](NodeEntry const& nodeEntry) { return int32(nodeEntry.Data->ID) == entry.TraitNodeEntryID; });
auto nodeEntryItr = std::ranges::find_if(node->Entries, [&entry](NodeEntry const& nodeEntry) { return int32(nodeEntry.Data->ID) == entry.TraitNodeEntryID; });
if (nodeEntryItr != node->Entries.end())
for (TraitCostEntry const* cost : nodeEntryItr->Costs)
currencies[cost->TraitCurrencyID] -= cost->Amount * entry.Rank;
Expand All @@ -367,7 +364,7 @@ void FillOwnedCurrenciesMap(WorldPackets::Traits::TraitConfig const& traitConfig

auto hasTraitNodeEntry = [&traitConfig](int32 traitNodeEntryId)
{
return std::find_if(traitConfig.Entries.begin(), traitConfig.Entries.end(), [traitNodeEntryId](WorldPackets::Traits::TraitEntry const& traitEntry)
return std::ranges::find_if(traitConfig.Entries, [traitNodeEntryId](WorldPackets::Traits::TraitEntry const& traitEntry)
{
return traitEntry.TraitNodeEntryID == traitNodeEntryId && (traitEntry.Rank > 0 || traitEntry.GrantedRanks > 0);
}) != traitConfig.Entries.end();
Expand Down Expand Up @@ -426,7 +423,7 @@ void FillSpentCurrenciesMap(WorldPackets::Traits::TraitEntry const& entry, std::
for (TraitCostEntry const* cost : group->Costs)
cachedCurrencies[cost->TraitCurrencyID] += cost->Amount * entry.Rank;

auto nodeEntryItr = std::find_if(node->Entries.begin(), node->Entries.end(), [&entry](NodeEntry const& nodeEntry) { return int32(nodeEntry.Data->ID) == entry.TraitNodeEntryID; });
auto nodeEntryItr = std::ranges::find_if(node->Entries, [&entry](NodeEntry const& nodeEntry) { return int32(nodeEntry.Data->ID) == entry.TraitNodeEntryID; });
if (nodeEntryItr != node->Entries.end())
for (TraitCostEntry const* cost : nodeEntryItr->Costs)
cachedCurrencies[cost->TraitCurrencyID] += cost->Amount * entry.Rank;
Expand Down Expand Up @@ -498,7 +495,7 @@ std::vector<UF::TraitEntry> GetGrantedTraitEntriesForConfig(WorldPackets::Traits

auto getOrCreateEntry = [&entries](int32 nodeId, int32 entryId)
{
auto itr = std::find_if(entries.begin(), entries.end(), [&](UF::TraitEntry const& traitEntry)
auto itr = std::ranges::find_if(entries, [&](UF::TraitEntry const& traitEntry)
{
return traitEntry.TraitNodeID == nodeId && traitEntry.TraitNodeEntryID == entryId;
});
Expand Down Expand Up @@ -546,7 +543,7 @@ bool IsValidEntry(WorldPackets::Traits::TraitEntry const& traitEntry)
if (!node)
return false;

auto entryItr = std::find_if(node->Entries.begin(), node->Entries.end(), [&](NodeEntry const& entry) { return entry.Data->ID == uint32(traitEntry.TraitNodeEntryID); });
auto entryItr = std::ranges::find_if(node->Entries, [&](NodeEntry const& entry) { return entry.Data->ID == uint32(traitEntry.TraitNodeEntryID); });
if (entryItr == node->Entries.end())
return false;

Expand All @@ -560,15 +557,12 @@ LearnResult ValidateConfig(WorldPackets::Traits::TraitConfig const& traitConfig,
{
auto getNodeEntryCount = [&](int32 traitNodeId)
{
return std::count_if(traitConfig.Entries.begin(), traitConfig.Entries.end(), [traitNodeId](WorldPackets::Traits::TraitEntry const& traitEntry)
{
return traitEntry.TraitNodeID == traitNodeId;
});
return std::ranges::count(traitConfig.Entries, traitNodeId, &WorldPackets::Traits::TraitEntry::TraitNodeID);
};

auto getNodeEntry = [&](int32 traitNodeId, int32 traitNodeEntryId)
{
auto entryItr = std::find_if(traitConfig.Entries.begin(), traitConfig.Entries.end(), [=](WorldPackets::Traits::TraitEntry const& traitEntry)
auto entryItr = std::ranges::find_if(traitConfig.Entries, [=](WorldPackets::Traits::TraitEntry const& traitEntry)
{
return traitEntry.TraitNodeID == traitNodeId && traitEntry.TraitNodeEntryID == traitNodeEntryId;
});
Expand All @@ -577,18 +571,16 @@ LearnResult ValidateConfig(WorldPackets::Traits::TraitConfig const& traitConfig,

auto isNodeFullyFilled = [&](Node const* node)
{
if (node->Data->GetType() == TraitNodeType::Selection)
return std::any_of(node->Entries.begin(), node->Entries.end(), [&](NodeEntry const& nodeEntry)
{
WorldPackets::Traits::TraitEntry const* traitEntry = getNodeEntry(node->Data->ID, nodeEntry.Data->ID);
return traitEntry && (traitEntry->Rank + traitEntry->GrantedRanks) == nodeEntry.Data->MaxRanks;
});

return std::all_of(node->Entries.begin(), node->Entries.end(), [&](NodeEntry const& nodeEntry)
auto nodeEntryMatches = [&](NodeEntry const& nodeEntry)
{
WorldPackets::Traits::TraitEntry const* traitEntry = getNodeEntry(node->Data->ID, nodeEntry.Data->ID);
return traitEntry && (traitEntry->Rank + traitEntry->GrantedRanks) == nodeEntry.Data->MaxRanks;
});
};

if (node->Data->GetType() == TraitNodeType::Selection)
return std::ranges::any_of(node->Entries, nodeEntryMatches);

return std::ranges::all_of(node->Entries, nodeEntryMatches);
};

Optional<std::map<int32, int32>> spentCurrencies;
Expand Down Expand Up @@ -712,7 +704,7 @@ void InitializeStarterBuildTraitConfig(WorldPackets::Traits::TraitConfig& traitC
{
auto findEntry = [](WorldPackets::Traits::TraitConfig& config, int32 traitNodeId, int32 traitNodeEntryId) -> WorldPackets::Traits::TraitEntry*
{
auto entryItr = std::find_if(config.Entries.begin(), config.Entries.end(), [=](WorldPackets::Traits::TraitEntry const& traitEntry)
auto entryItr = std::ranges::find_if(config.Entries, [=](WorldPackets::Traits::TraitEntry const& traitEntry)
{
return traitEntry.TraitNodeID == traitNodeId && traitEntry.TraitNodeEntryID == traitNodeEntryId;
});
Expand Down

0 comments on commit ee301cf

Please sign in to comment.