From 725d689e8aa95c245ef625d36011afb9a95de509 Mon Sep 17 00:00:00 2001 From: cc9cii Date: Fri, 23 Jul 2021 23:17:16 +1000 Subject: [PATCH] Call push_back() if inserting to the end of the vector. It seems MSVC may be generating different code compared to insert(). (copied the changes from commit SHA-1: 257126ed69a5f6f964ba771766de061e81f87433) --- apps/opencs/model/world/collection.hpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/apps/opencs/model/world/collection.hpp b/apps/opencs/model/world/collection.hpp index 89430f1c58..9d9c69a5da 100644 --- a/apps/opencs/model/world/collection.hpp +++ b/apps/opencs/model/world/collection.hpp @@ -543,20 +543,25 @@ namespace CSMWorld void Collection::insertRecord (std::unique_ptr record, int index, UniversalId::Type type) { - if (index<0 || index>static_cast (mRecords.size())) + int size = static_cast(mRecords.size()); + if (index < 0 || index > size) throw std::runtime_error ("index out of range"); std::unique_ptr > record2(static_cast*>(record.release())); std::string lowerId = Misc::StringUtils::lowerCase(IdAccessorT().getId(record2->get())); - mRecords.insert (mRecords.begin()+index, std::move(record2)); + if (index == size) + mRecords.push_back (std::move(record2)); + else + mRecords.insert (mRecords.begin()+index, std::move(record2)); - if (index (mRecords.size())-1) + if (index < size-1) { - for (std::map::iterator iter (mIndex.begin()); iter!=mIndex.end(); - ++iter) - if (iter->second>=index) - ++(iter->second); + for (std::map::iterator iter (mIndex.begin()); iter!=mIndex.end(); ++iter) + { + if (iter->second >= index) + ++(iter->second); + } } mIndex.insert (std::make_pair (lowerId, index));