diff options
author | Shauren <shauren.trinity@gmail.com> | 2015-10-25 13:35:45 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2015-10-31 20:26:40 +0100 |
commit | 14d382f185ada74f3b60b3d323b0eb1f98ea9181 (patch) | |
tree | b39be4342e06cc508c0895178c6107f77a8dbe36 | |
parent | cba122ad94af5081fa748c5d77842dd5205e7b67 (diff) |
Core/Conditions: Optimizations part 3 changed ConditionStore to a simple array
(cherry picked from commit db0c48c17fdf61b8816cc229dcfec907354326cd)
-rw-r--r-- | src/server/game/Conditions/ConditionMgr.cpp | 33 | ||||
-rw-r--r-- | src/server/game/Conditions/ConditionMgr.h | 5 |
2 files changed, 16 insertions, 22 deletions
diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index a6af028098b..3675d43a3b4 100644 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -802,15 +802,11 @@ bool ConditionMgr::IsObjectMeetingNotGroupedConditions(ConditionSourceType sourc { if (sourceType > CONDITION_SOURCE_TYPE_NONE && sourceType < CONDITION_SOURCE_TYPE_MAX) { - ConditionEntriesByTypeMap::const_iterator itr = ConditionStore.find(sourceType); - if (itr != ConditionStore.end()) + ConditionsByEntryMap::const_iterator i = ConditionStore[sourceType].find(entry); + if (i != ConditionStore[sourceType].end()) { - ConditionsByEntryMap::const_iterator i = itr->second.find(entry); - if (i != itr->second.end()) - { - TC_LOG_DEBUG("condition", "GetConditionsForNotGroupedEntry: found conditions for type %u and entry %u", uint32(sourceType), entry); - return IsObjectMeetToConditions(sourceInfo, i->second); - } + TC_LOG_DEBUG("condition", "GetConditionsForNotGroupedEntry: found conditions for type %u and entry %u", uint32(sourceType), entry); + return IsObjectMeetToConditions(sourceInfo, i->second); } } @@ -826,12 +822,9 @@ bool ConditionMgr::IsObjectMeetingNotGroupedConditions(ConditionSourceType sourc bool ConditionMgr::HasConditionsForNotGroupedEntry(ConditionSourceType sourceType, uint32 entry) const { if (sourceType > CONDITION_SOURCE_TYPE_NONE && sourceType < CONDITION_SOURCE_TYPE_MAX) - { - ConditionEntriesByTypeMap::const_iterator itr = ConditionStore.find(sourceType); - if (itr != ConditionStore.end()) - if (itr->second.find(entry) != itr->second.end()) - return true; - } + if (ConditionStore[sourceType].find(entry) != ConditionStore[sourceType].end()) + return true; + return false; } @@ -2122,12 +2115,14 @@ void ConditionMgr::Clean() ConditionReferenceStore.clear(); - for (ConditionEntriesByTypeMap::iterator itr = ConditionStore.begin(); itr != ConditionStore.end(); ++itr) - for (ConditionsByEntryMap::iterator it = itr->second.begin(); it != itr->second.end(); ++it) - for (ConditionContainer::const_iterator i = it->second.begin(); i != it->second.end(); ++i) - delete *i; + for (uint32 i = 0; i < CONDITION_SOURCE_TYPE_MAX; ++i) + { + for (ConditionsByEntryMap::iterator it = ConditionStore[i].begin(); it != ConditionStore[i].end(); ++it) + for (ConditionContainer::const_iterator itr = it->second.begin(); itr != it->second.end(); ++itr) + delete *itr; - ConditionStore.clear(); + ConditionStore[i].clear(); + } for (ConditionEntriesByCreatureIdMap::iterator itr = VehicleSpellConditionStore.begin(); itr != VehicleSpellConditionStore.end(); ++itr) for (ConditionsByEntryMap::iterator it = itr->second.begin(); it != itr->second.end(); ++it) diff --git a/src/server/game/Conditions/ConditionMgr.h b/src/server/game/Conditions/ConditionMgr.h index 0f60f2e3c48..81fe379f0db 100644 --- a/src/server/game/Conditions/ConditionMgr.h +++ b/src/server/game/Conditions/ConditionMgr.h @@ -216,10 +216,9 @@ struct Condition typedef std::vector<Condition*> ConditionContainer; typedef std::unordered_map<uint32 /*SourceEntry*/, ConditionContainer> ConditionsByEntryMap; -typedef std::unordered_map<ConditionSourceType /*SourceType*/, ConditionsByEntryMap> ConditionEntriesByTypeMap; +typedef std::array<ConditionsByEntryMap, CONDITION_SOURCE_TYPE_MAX> ConditionEntriesByTypeArray; typedef std::unordered_map<uint32, ConditionsByEntryMap> ConditionEntriesByCreatureIdMap; typedef std::unordered_map<std::pair<int32, uint32 /*SAI source_type*/>, ConditionsByEntryMap> SmartEventConditionContainer; - typedef std::unordered_map<uint32, ConditionContainer> ConditionReferenceContainer;//only used for references class ConditionMgr @@ -276,7 +275,7 @@ class ConditionMgr void Clean(); // free up resources std::vector<Condition*> AllocatedMemoryStore; // some garbage collection :) - ConditionEntriesByTypeMap ConditionStore; + ConditionEntriesByTypeArray ConditionStore; ConditionReferenceContainer ConditionReferenceStore; ConditionEntriesByCreatureIdMap VehicleSpellConditionStore; ConditionEntriesByCreatureIdMap SpellClickEventConditionStore; |