diff --git a/apps/openmw/mwworld/esmstore.cpp b/apps/openmw/mwworld/esmstore.cpp index ba88dfdd7d..dc24d857a6 100644 --- a/apps/openmw/mwworld/esmstore.cpp +++ b/apps/openmw/mwworld/esmstore.cpp @@ -192,7 +192,8 @@ namespace MWWorld Store mSkills; Store mAttributes; - std::map mESM3RecordToRecordId; + std::map mESM3RecordToStore; + std::unordered_map mStoreToEsm3Record; template @@ -211,11 +212,11 @@ namespace MWWorld record.mId = id; T *ptr = store.insert(record); - auto esm3RecordType_find = stores.mStoreImp->mESM3RecordToRecordId.find(SRecordType::sRecordId); + auto esm3RecordType_find = stores.mStoreImp->mStoreToEsm3Record.find(&stores.get()); - if (esm3RecordType_find != stores.mStoreImp->mESM3RecordToRecordId.end()) + if (esm3RecordType_find != stores.mStoreImp->mStoreToEsm3Record.end()) { - stores.mIds[ptr->mId] = esm3RecordType_find->first; + stores.mIds[ptr->mId] = esm3RecordType_find->second; } return ptr; } @@ -225,10 +226,10 @@ namespace MWWorld Store &store = stores.getWritable(); T *ptr = store.insert(x); - auto esm3RecordType_find = stores.mStoreImp->mESM3RecordToRecordId.find(SRecordType::sRecordId); - if (esm3RecordType_find != stores.mStoreImp->mESM3RecordToRecordId.end()) + auto esm3RecordType_find = stores.mStoreImp->mStoreToEsm3Record.find(&stores.get()); + if (esm3RecordType_find != stores.mStoreImp->mStoreToEsm3Record.end()) { - stores.mIds[ptr->mId] = esm3RecordType_find->first; + stores.mIds[ptr->mId] = esm3RecordType_find->second; } return ptr; } @@ -247,55 +248,61 @@ namespace MWWorld T record = x; T *ptr = store.insertStatic(record); - auto esm3RecordType_find = stores.mStoreImp->mESM3RecordToRecordId.find(SRecordType::sRecordId); - if (esm3RecordType_find != stores.mStoreImp->mESM3RecordToRecordId.end()) + auto esm3RecordType_find = stores.mStoreImp->mStoreToEsm3Record.find(&stores.get()); + if (esm3RecordType_find != stores.mStoreImp->mStoreToEsm3Record.end()) { - stores.mIds[ptr->mId] = esm3RecordType_find->first; + stores.mIds[ptr->mId] = esm3RecordType_find->second; } return ptr; } - ESMStoreImp() + ESMStoreImp(ESMStore& store) { - mESM3RecordToRecordId[ESM::REC_ACTI] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_ALCH] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_APPA] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_ARMO] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_BODY] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_BOOK] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_BSGN] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_CELL] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_CLAS] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_CLOT] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_CONT] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_CREA] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_DIAL] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_DOOR] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_ENCH] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_FACT] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_GLOB] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_GMST] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_INGR] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_LAND] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_LEVC] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_LEVI] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_LIGH] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_LOCK] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_LTEX] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_MISC] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_NPC_] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_PGRD] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_PROB] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_RACE] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_REGN] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_REPA] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_SCPT] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_SNDG] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_SOUN] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_SPEL] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_SSCR] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_STAT] = SRecordType::sRecordId; - mESM3RecordToRecordId[ESM::REC_WEAP] = SRecordType::sRecordId; + mESM3RecordToStore[ESM::REC_ACTI] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_ALCH] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_APPA] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_ARMO] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_BODY] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_BOOK] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_BSGN] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_CELL] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_CLAS] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_CLOT] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_CONT] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_CREA] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_DIAL] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_DOOR] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_ENCH] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_FACT] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_GLOB] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_GMST] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_INGR] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_LAND] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_LEVC] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_LEVI] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_LIGH] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_LOCK] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_LTEX] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_MISC] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_NPC_] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_PGRD] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_PROB] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_RACE] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_REGN] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_REPA] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_SCPT] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_SNDG] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_SOUN] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_SPEL] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_SSCR] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_STAT] = &store.getWritable(); + mESM3RecordToStore[ESM::REC_WEAP] = &store.getWritable(); + + for (const auto& recordStorePair : mESM3RecordToStore) + { + const StoreBase* storePtr = recordStorePair.second; + mStoreToEsm3Record[storePtr] = recordStorePair.first; + } } template @@ -350,7 +357,7 @@ namespace MWWorld ESMStoreImp::createStore(*this); ESMStoreImp::createStore(*this); - mStoreImp = std::make_unique(); + mStoreImp = std::make_unique(*this); mDynamicCount = 0; getWritable().setCells(getWritable()); @@ -404,10 +411,11 @@ void ESMStore::load(ESM::ESMReader &esm, Loading::Listener* listener, ESM::Dialo } // Look up the record type. - std::map::iterator it = mStoreImp->mESM3RecordToRecordId.find(n.toInt()); + ESM::RecNameInts recName = static_cast(n.toInt()); + const auto& it = mStoreImp->mESM3RecordToStore.find(recName); - if (it == mStoreImp->mESM3RecordToRecordId.end()) { - if (n.toInt() == ESM::REC_INFO) { + if (it == mStoreImp->mESM3RecordToStore.end()) { + if (recName == ESM::REC_INFO) { if (dialogue) { dialogue->readInfo(esm, esm.getIndex() != 0); @@ -438,10 +446,10 @@ void ESMStore::load(ESM::ESMReader &esm, Loading::Listener* listener, ESM::Dialo throw std::runtime_error("Unknown record: " + n.toString()); } } else { - RecordId id = mStores[ it->second]->load(esm); + RecordId id = it->second->load(esm); if (id.mIsDeleted) { - mStores[ it->second]->eraseStatic(id.mId); + it->second->eraseStatic(id.mId); continue; } @@ -486,14 +494,14 @@ void ESMStore::setUp() { mIds.clear(); - std::map::iterator storeIt = mStoreImp->mESM3RecordToRecordId.begin(); - for (; storeIt != mStoreImp->mESM3RecordToRecordId.end(); ++storeIt) { - mStores[storeIt->second]->setUp(); + std::map::iterator storeIt = mStoreImp->mESM3RecordToStore.begin(); + for (; storeIt != mStoreImp->mESM3RecordToStore.end(); ++storeIt) { + storeIt->second->setUp(); if (isCacheableRecord(storeIt->first)) { std::vector identifiers; - mStores[storeIt->second]->listIdentifier(identifiers); + storeIt->second->listIdentifier(identifiers); for (std::vector::const_iterator record = identifiers.begin(); record != identifiers.end(); ++record) mIds[*record] = storeIt->first; @@ -716,8 +724,9 @@ void ESMStore::removeMissingObjects(Store& store) get().write (writer, progress); } - bool ESMStore::readRecord (ESM::ESMReader& reader, uint32_t type) + bool ESMStore::readRecord (ESM::ESMReader& reader, uint32_t type_id) { + ESM::RecNameInts type = (ESM::RecNameInts)type_id; switch (type) { case ESM::REC_ALCH: @@ -730,12 +739,12 @@ void ESMStore::removeMissingObjects(Store& store) case ESM::REC_WEAP: case ESM::REC_LEVI: case ESM::REC_LEVC: - mStores[mStoreImp->mESM3RecordToRecordId[type] ]->read (reader); + mStoreImp->mESM3RecordToStore[type]->read (reader); return true; case ESM::REC_NPC_: case ESM::REC_CREA: case ESM::REC_CONT: - mStores[mStoreImp->mESM3RecordToRecordId[type]]->read (reader, true); + mStoreImp->mESM3RecordToStore[type]->read (reader, true); return true; case ESM::REC_DYNA: