From 0aa1042fd79488aa8f51bb80492b246b199cb481 Mon Sep 17 00:00:00 2001 From: scrawl Date: Sun, 18 May 2014 15:59:45 +0200 Subject: [PATCH] Optimized dialogue merging with a lookup map --- components/esm/loaddial.cpp | 51 ++++++++++++++++++++++--------------- components/esm/loaddial.hpp | 6 +++++ 2 files changed, 36 insertions(+), 21 deletions(-) diff --git a/components/esm/loaddial.cpp b/components/esm/loaddial.cpp index 4a2f17e26..5adf409bb 100644 --- a/components/esm/loaddial.cpp +++ b/components/esm/loaddial.cpp @@ -47,37 +47,46 @@ void Dialogue::save(ESMWriter &esm) const void Dialogue::addInfo(const ESM::DialInfo& info, bool merge) { - // TODO: use std::move if (!merge || mInfo.empty() || info.mNext.empty()) { - mInfo.push_back(info); + mLookup[info.mId] = mInfo.insert(mInfo.end(), info); return; } if (info.mPrev.empty()) { - mInfo.push_front(info); + mLookup[info.mId] = mInfo.insert(mInfo.begin(), info); return; } - int i=0; - for (ESM::Dialogue::InfoContainer::iterator it = mInfo.begin(); it != mInfo.end(); ++it) + + ESM::Dialogue::InfoContainer::iterator it = mInfo.end(); + + std::map::iterator lookup; + lookup = mLookup.find(info.mPrev); + if (lookup != mLookup.end()) { - if (info.mPrev == it->mId) - { - mInfo.insert(++it, info); - return; - } - if (info.mNext == it->mId) - { - mInfo.insert(it, info); - return; - } - if (info.mId == it->mId) - { - *it = info; - return; - } - ++i; + it = lookup->second; + + mLookup[info.mId] = mInfo.insert(++it, info); + return; } + + lookup = mLookup.find(info.mNext); + if (lookup != mLookup.end()) + { + it = lookup->second; + + mLookup[info.mId] = mInfo.insert(it, info); + return; + } + + lookup = mLookup.find(info.mId); + if (lookup != mLookup.end()) + { + it = lookup->second; + *it = info; + return; + } + std::cerr << "Failed to insert info " << info.mId << std::endl; } diff --git a/components/esm/loaddial.hpp b/components/esm/loaddial.hpp index 612c4fee6..6ec5527f9 100644 --- a/components/esm/loaddial.hpp +++ b/components/esm/loaddial.hpp @@ -3,6 +3,7 @@ #include #include +#include #include "loadinfo.hpp" @@ -36,8 +37,13 @@ struct Dialogue typedef std::list InfoContainer; + typedef std::map LookupMap; + InfoContainer mInfo; + // This is only used during the loading phase to speed up DialInfo merging. + LookupMap mLookup; + void load(ESMReader &esm); void save(ESMWriter &esm) const;