1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-02-07 00:15:34 +00:00

simplified some big switch/case

This commit is contained in:
florent.teppe 2022-09-09 18:28:48 +02:00
parent bcc004ecf5
commit 65bd007baa
2 changed files with 44 additions and 61 deletions

View file

@ -36,6 +36,7 @@
namespace namespace
{ {
template<typename T> template<typename T>
MWWorld::Ptr searchInContainerList(MWWorld::CellRefList<T>& containerList, std::string_view id) MWWorld::Ptr searchInContainerList(MWWorld::CellRefList<T>& containerList, std::string_view id)
{ {
@ -244,17 +245,18 @@ namespace MWWorld
if (stores.mCellRefLists.size() <= storeIndex) if (stores.mCellRefLists.size() <= storeIndex)
stores.mCellRefLists.resize(storeIndex + 1); stores.mCellRefLists.resize(storeIndex + 1);
assert(&store == &std::get<Store<T>>(stores.mCellStoreImp->mRefLists)); assert(&refList == &std::get<CellRefList<T>>(stores.mCellStoreImp->mRefLists));
stores.mCellRefLists[storeIndex] = &refList; stores.mCellRefLists[storeIndex] = &refList;
} }
template<typename RecordKind, typename RecordType> //this function allows us to link a CellRefList<T> to the associated recNameInt, and apply a function
static void ReadReferenceSwitcher(CellRefList<RecordType>& collection, ESM::ESMReader& reader,const ESM::CellRef& cref, const std::map<int, int>& contentFileMap, MWWorld::CellStore* cellstore, ESM::RecNameInts recnNameInt) template<typename RecordType, typename Callable>
static void recNameSwitcher(CellRefList<RecordType>& store, Callable&& f, ESM::RecNameInts recnNameInt)
{ {
if (RecordType::sRecordId == recnNameInt) if (RecordType::sRecordId == recnNameInt)
{ {
readReferenceCollection<RecordKind>(reader, collection, cref, contentFileMap, cellstore); f(store);
} }
} }
}; };
@ -421,8 +423,8 @@ namespace MWWorld
, mState(State_Unloaded) , mState(State_Unloaded)
, mHasState(false) , mHasState(false)
, mLastRespawn(0, 0) , mLastRespawn(0, 0)
, mRechargingItemsUpToDate(false)
, mCellStoreImp(std::make_unique<CellStoreImp>()) , mCellStoreImp(std::make_unique<CellStoreImp>())
, mRechargingItemsUpToDate(false)
{ {
std::apply([this](auto& ...x) {(CellStoreImp::assignStoreToIndex(*this, x), ...); }, mCellStoreImp->mRefLists); std::apply([this](auto& ...x) {(CellStoreImp::assignStoreToIndex(*this, x), ...); }, mCellStoreImp->mRefLists);
mWaterLevel = cell->mWater; mWaterLevel = cell->mWater;
@ -739,64 +741,35 @@ namespace MWWorld
if (it->second != ref.mRefID) if (it->second != ref.mRefID)
{ {
// refID was modified, make sure we don't end up with duplicated refs // refID was modified, make sure we don't end up with duplicated refs
switch (store.find(it->second)) ESM::RecNameInts foundType = (ESM::RecNameInts)store.find(it->second);
{ Misc::tupleForEach(this->mCellStoreImp->mRefLists, [&ref, foundType](auto& x) {CellStoreImp::recNameSwitcher(x, [&ref](auto& storeIn)
case ESM::REC_ACTI: get<ESM::Activator>().remove(ref.mRefNum); break; {
case ESM::REC_ALCH: get<ESM::Potion>().remove(ref.mRefNum); break; storeIn.remove(ref.mRefNum);
case ESM::REC_APPA: get<ESM::Apparatus>().remove(ref.mRefNum); break; }, foundType);
case ESM::REC_ARMO: get<ESM::Armor>().remove(ref.mRefNum); break; });
case ESM::REC_BOOK: get<ESM::Book>().remove(ref.mRefNum); break;
case ESM::REC_CLOT: get<ESM::Clothing>().remove(ref.mRefNum); break;
case ESM::REC_CONT: get<ESM::Container>().remove(ref.mRefNum); break;
case ESM::REC_CREA: get<ESM::Creature>().remove(ref.mRefNum); break;
case ESM::REC_DOOR: get<ESM::Door>().remove(ref.mRefNum); break;
case ESM::REC_INGR: get<ESM::Ingredient>().remove(ref.mRefNum); break;
case ESM::REC_LEVC: get<ESM::CreatureLevList>().remove(ref.mRefNum); break;
case ESM::REC_LEVI: get<ESM::ItemLevList>().remove(ref.mRefNum); break;
case ESM::REC_LIGH: get<ESM::Light>().remove(ref.mRefNum); break;
case ESM::REC_LOCK: get<ESM::Lockpick>().remove(ref.mRefNum); break;
case ESM::REC_MISC: get<ESM::Miscellaneous>().remove(ref.mRefNum); break;
case ESM::REC_NPC_: get<ESM::NPC>().remove(ref.mRefNum); break;
case ESM::REC_PROB: get<ESM::Probe>().remove(ref.mRefNum); break;
case ESM::REC_REPA: get<ESM::Repair>().remove(ref.mRefNum); break;
case ESM::REC_STAT: get<ESM::Static>().remove(ref.mRefNum); break;
case ESM::REC_WEAP: get<ESM::Weapon>().remove(ref.mRefNum); break;
case ESM::REC_BODY: get<ESM::BodyPart>().remove(ref.mRefNum); break;
default:
break;
}
} }
} }
switch (store.find (ref.mRefID)) ESM::RecNameInts foundType = (ESM::RecNameInts)store.find(ref.mRefID);
bool handledType = false;
if (foundType != 0)
{ {
case ESM::REC_ACTI: get<ESM::Activator>().load(ref, deleted, store); break; Misc::tupleForEach(this->mCellStoreImp->mRefLists, [&ref, &deleted, &store, foundType, &handledType](auto& x) {CellStoreImp::recNameSwitcher(x, [&ref, &deleted, &store, &handledType](auto& storeIn)
case ESM::REC_ALCH: get<ESM::Potion>().load(ref, deleted,store); break; {
case ESM::REC_APPA: get<ESM::Apparatus>().load(ref, deleted, store); break; handledType = true;
case ESM::REC_ARMO: get<ESM::Armor>().load(ref, deleted, store); break; storeIn.load(ref, deleted, store);
case ESM::REC_BOOK: get<ESM::Book>().load(ref, deleted, store); break; }, foundType);
case ESM::REC_CLOT: get<ESM::Clothing>().load(ref, deleted, store); break; });
case ESM::REC_CONT: get<ESM::Container>().load(ref, deleted, store); break; }
case ESM::REC_CREA: get<ESM::Creature>().load(ref, deleted, store); break; else
case ESM::REC_DOOR: get<ESM::Door>().load(ref, deleted, store); break; {
case ESM::REC_INGR: get<ESM::Ingredient>().load(ref, deleted, store); break; Log(Debug::Error) << "Cell reference '" + ref.mRefID + "' not found!"; return;
case ESM::REC_LEVC: get<ESM::CreatureLevList>().load(ref, deleted, store); break; }
case ESM::REC_LEVI: get<ESM::ItemLevList>().load(ref, deleted, store); break;
case ESM::REC_LIGH: get<ESM::Light>().load(ref, deleted, store); break;
case ESM::REC_LOCK: get<ESM::Lockpick>().load(ref, deleted, store); break;
case ESM::REC_MISC: get<ESM::Miscellaneous>().load(ref, deleted, store); break;
case ESM::REC_NPC_: get<ESM::NPC>().load(ref, deleted, store); break;
case ESM::REC_PROB: get<ESM::Probe>().load(ref, deleted, store); break;
case ESM::REC_REPA: get<ESM::Repair>().load(ref, deleted, store); break;
case ESM::REC_STAT: get<ESM::Static>().load(ref, deleted, store); break;
case ESM::REC_WEAP: get<ESM::Weapon>().load(ref, deleted, store); break;
case ESM::REC_BODY: get<ESM::BodyPart>().load(ref, deleted, store); break;
case 0: Log(Debug::Error) << "Cell reference '" + ref.mRefID + "' not found!"; return; if (!handledType)
{
default: Log(Debug::Error) << "Error: Ignoring reference '" << ref.mRefID << "' of unhandled type";
Log(Debug::Error) << "Error: Ignoring reference '" << ref.mRefID << "' of unhandled type"; return;
return;
} }
refNumToID[ref.mRefNum] = ref.mRefID; refNumToID[ref.mRefNum] = ref.mRefID;
@ -915,9 +888,13 @@ namespace MWWorld
case ESM::REC_STAT: case ESM::REC_STAT:
case ESM::REC_WEAP: case ESM::REC_WEAP:
case ESM::REC_BODY: case ESM::REC_BODY:
std::apply([&reader, this, &cref, &contentFileMap, type](auto& ...x){ Misc::tupleForEach(this->mCellStoreImp->mRefLists, [&reader, this, &cref, &contentFileMap, type](auto&& x) {
(CellStoreImp::ReadReferenceSwitcher<ESM::ObjectState>(x, reader, cref, contentFileMap, this, (ESM::RecNameInts)type),... ); CellStoreImp::recNameSwitcher(
}, this->mCellStoreImp->mRefLists); x,
[&reader, this, &cref, &contentFileMap](
auto& store) { readReferenceCollection<ESM::ObjectState>(reader, store, cref, contentFileMap, this); },
(ESM::RecNameInts)type);
});
break; break;
case ESM::REC_CONT: case ESM::REC_CONT:
readReferenceCollection<ESM::ContainerState> (reader, get<ESM::Container>(), cref, contentFileMap, this); readReferenceCollection<ESM::ContainerState> (reader, get<ESM::Container>(), cref, contentFileMap, this);

View file

@ -30,6 +30,12 @@ namespace Misc
{ {
static constexpr std::size_t value = 1 + TupleTypeIndex<T, std::tuple<Types...>>::value; static constexpr std::size_t value = 1 + TupleTypeIndex<T, std::tuple<Types...>>::value;
}; };
template<typename TupleType, typename Callable>
void tupleForEach(TupleType& tuple, Callable&& f)
{
std::apply([&f](auto& ...x) {(f(x), ...); }, tuple);
}
} }
#endif #endif