From a1b695a8d5692ac79f6919c9746a19be5366c877 Mon Sep 17 00:00:00 2001 From: Mads Buvik Sandvei Date: Fri, 31 May 2024 23:10:54 +0200 Subject: [PATCH] De-duplicate ManualRef constructor --- apps/openmw/mwworld/manualref.cpp | 243 +++++++++++------------------- 1 file changed, 88 insertions(+), 155 deletions(-) diff --git a/apps/openmw/mwworld/manualref.cpp b/apps/openmw/mwworld/manualref.cpp index d4979eb494..fce66d2919 100644 --- a/apps/openmw/mwworld/manualref.cpp +++ b/apps/openmw/mwworld/manualref.cpp @@ -27,171 +27,104 @@ namespace refValue = *static_cast*>(template_.getBase()); ptrValue = MWWorld::Ptr(&std::any_cast&>(refValue), nullptr); } + + template + void createGeneric(F func, const MWWorld::ESMStore& store, ESM::RefId name) + { + switch (store.find(name)) + { + case ESM::REC_ACTI: + func(store.get()); + break; + case ESM::REC_ALCH: + func(store.get()); + break; + case ESM::REC_APPA: + func(store.get()); + break; + case ESM::REC_ARMO: + func(store.get()); + break; + case ESM::REC_BOOK: + func(store.get()); + break; + case ESM::REC_CLOT: + func(store.get()); + break; + case ESM::REC_CONT: + func(store.get()); + break; + case ESM::REC_CREA: + func(store.get()); + break; + case ESM::REC_DOOR: + func(store.get()); + break; + case ESM::REC_INGR: + func(store.get()); + break; + case ESM::REC_LEVC: + func(store.get()); + break; + case ESM::REC_LEVI: + func(store.get()); + break; + case ESM::REC_LIGH: + func(store.get()); + break; + case ESM::REC_LOCK: + func(store.get()); + break; + case ESM::REC_MISC: + func(store.get()); + break; + case ESM::REC_NPC_: + func(store.get()); + break; + case ESM::REC_PROB: + func(store.get()); + break; + case ESM::REC_REPA: + func(store.get()); + break; + case ESM::REC_STAT: + func(store.get()); + break; + case ESM::REC_WEAP: + func(store.get()); + break; + case ESM::REC_BODY: + func(store.get()); + break; + case ESM::REC_STAT4: + func(store.get()); + break; + case ESM::REC_TERM4: + func(store.get()); + break; + case 0: + throw std::logic_error( + "failed to create manual cell ref for " + name.toDebugString() + " (unknown ID)"); + + default: + throw std::logic_error( + "failed to create manual cell ref for " + name.toDebugString() + " (unknown type)"); + } + } } MWWorld::ManualRef::ManualRef(const MWWorld::ESMStore& store, const ESM::RefId& name, const int count) { - switch (store.find(name)) - { - case ESM::REC_ACTI: - create(store.get(), name, mRef, mPtr); - break; - case ESM::REC_ALCH: - create(store.get(), name, mRef, mPtr); - break; - case ESM::REC_APPA: - create(store.get(), name, mRef, mPtr); - break; - case ESM::REC_ARMO: - create(store.get(), name, mRef, mPtr); - break; - case ESM::REC_BOOK: - create(store.get(), name, mRef, mPtr); - break; - case ESM::REC_CLOT: - create(store.get(), name, mRef, mPtr); - break; - case ESM::REC_CONT: - create(store.get(), name, mRef, mPtr); - break; - case ESM::REC_CREA: - create(store.get(), name, mRef, mPtr); - break; - case ESM::REC_DOOR: - create(store.get(), name, mRef, mPtr); - break; - case ESM::REC_INGR: - create(store.get(), name, mRef, mPtr); - break; - case ESM::REC_LEVC: - create(store.get(), name, mRef, mPtr); - break; - case ESM::REC_LEVI: - create(store.get(), name, mRef, mPtr); - break; - case ESM::REC_LIGH: - create(store.get(), name, mRef, mPtr); - break; - case ESM::REC_LOCK: - create(store.get(), name, mRef, mPtr); - break; - case ESM::REC_MISC: - create(store.get(), name, mRef, mPtr); - break; - case ESM::REC_NPC_: - create(store.get(), name, mRef, mPtr); - break; - case ESM::REC_PROB: - create(store.get(), name, mRef, mPtr); - break; - case ESM::REC_REPA: - create(store.get(), name, mRef, mPtr); - break; - case ESM::REC_STAT: - create(store.get(), name, mRef, mPtr); - break; - case ESM::REC_WEAP: - create(store.get(), name, mRef, mPtr); - break; - case ESM::REC_BODY: - create(store.get(), name, mRef, mPtr); - break; - case ESM::REC_STAT4: - create(store.get(), name, mRef, mPtr); - break; - case ESM::REC_TERM4: - create(store.get(), name, mRef, mPtr); - break; - case 0: - throw std::logic_error("failed to create manual cell ref for " + name.toDebugString() + " (unknown ID)"); - - default: - throw std::logic_error("failed to create manual cell ref for " + name.toDebugString() + " (unknown type)"); - } + auto cb = [&](const auto& store) { create(store, name, mRef, mPtr); }; + createGeneric(cb, store, name); mPtr.getCellRef().setCount(count); } MWWorld::ManualRef::ManualRef(const ESMStore& store, const Ptr& template_, const int count) { - ESM::RefId name = template_.getCellRef().getRefId(); - switch (store.find(name)) - { - case ESM::REC_ACTI: - create(store.get(), template_, mRef, mPtr); - break; - case ESM::REC_ALCH: - create(store.get(), template_, mRef, mPtr); - break; - case ESM::REC_APPA: - create(store.get(), template_, mRef, mPtr); - break; - case ESM::REC_ARMO: - create(store.get(), template_, mRef, mPtr); - break; - case ESM::REC_BOOK: - create(store.get(), template_, mRef, mPtr); - break; - case ESM::REC_CLOT: - create(store.get(), template_, mRef, mPtr); - break; - case ESM::REC_CONT: - create(store.get(), template_, mRef, mPtr); - break; - case ESM::REC_CREA: - create(store.get(), template_, mRef, mPtr); - break; - case ESM::REC_DOOR: - create(store.get(), template_, mRef, mPtr); - break; - case ESM::REC_INGR: - create(store.get(), template_, mRef, mPtr); - break; - case ESM::REC_LEVC: - create(store.get(), template_, mRef, mPtr); - break; - case ESM::REC_LEVI: - create(store.get(), template_, mRef, mPtr); - break; - case ESM::REC_LIGH: - create(store.get(), template_, mRef, mPtr); - break; - case ESM::REC_LOCK: - create(store.get(), template_, mRef, mPtr); - break; - case ESM::REC_MISC: - create(store.get(), template_, mRef, mPtr); - break; - case ESM::REC_NPC_: - create(store.get(), template_, mRef, mPtr); - break; - case ESM::REC_PROB: - create(store.get(), template_, mRef, mPtr); - break; - case ESM::REC_REPA: - create(store.get(), template_, mRef, mPtr); - break; - case ESM::REC_STAT: - create(store.get(), template_, mRef, mPtr); - break; - case ESM::REC_WEAP: - create(store.get(), template_, mRef, mPtr); - break; - case ESM::REC_BODY: - create(store.get(), template_, mRef, mPtr); - break; - case ESM::REC_STAT4: - create(store.get(), template_, mRef, mPtr); - break; - case ESM::REC_TERM4: - create(store.get(), template_, mRef, mPtr); - break; - case 0: - throw std::logic_error("failed to create manual cell ref for " + name.toDebugString() + " (unknown ID)"); - - default: - throw std::logic_error("failed to create manual cell ref for " + name.toDebugString() + " (unknown type)"); - } + auto cb = [&](const auto& store) { create(store, template_, mRef, mPtr); }; + createGeneric(cb, store, template_.getCellRef().getRefId()); mPtr.getCellRef().setCount(count); mPtr.getCellRef().unsetRefNum();