1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-02-21 11:09:43 +00:00

Simplify WorldModel::getAll

There is no need to have generic forEach template function.
This commit is contained in:
elsid 2023-05-28 17:37:40 +02:00
parent c368c188f2
commit 02adb91859
No known key found for this signature in database
GPG key ID: 4DE04C198CBA7625

View file

@ -17,50 +17,6 @@
#include "cellstore.hpp"
#include "esmstore.hpp"
namespace
{
template <class Visitor, class Key, class Comp>
bool forEachInStore(
const ESM::RefId& id, Visitor&& visitor, std::unordered_map<Key, MWWorld::CellStore, Comp>& cellStore)
{
for (auto& cell : cellStore)
{
if (cell.second.getState() == MWWorld::CellStore::State_Unloaded)
cell.second.preload();
if (cell.second.getState() == MWWorld::CellStore::State_Preloaded)
{
if (cell.second.hasId(id))
{
cell.second.load();
}
else
continue;
}
bool cont = cell.second.forEach([&](MWWorld::Ptr ptr) {
if (ptr.getCellRef().getRefId() == id)
{
return visitor(ptr);
}
return true;
});
if (!cont)
return false;
}
return true;
}
struct PtrCollector
{
std::vector<MWWorld::Ptr> mPtrs;
bool operator()(MWWorld::Ptr ptr)
{
mPtrs.emplace_back(ptr);
return true;
}
};
}
MWWorld::CellStore& MWWorld::WorldModel::getOrInsertCellStore(const ESM::Cell& cell)
{
const auto it = mCells.find(cell.mId);
@ -369,9 +325,24 @@ void MWWorld::WorldModel::getExteriorPtrs(const ESM::RefId& name, std::vector<MW
std::vector<MWWorld::Ptr> MWWorld::WorldModel::getAll(const ESM::RefId& id)
{
PtrCollector visitor;
forEachInStore(id, visitor, mCells);
return visitor.mPtrs;
std::vector<Ptr> result;
for (auto& [cellId, cellStore] : mCells)
{
if (cellStore.getState() == CellStore::State_Unloaded)
cellStore.preload();
if (cellStore.getState() == CellStore::State_Preloaded)
{
if (!cellStore.hasId(id))
continue;
cellStore.load();
}
cellStore.forEach([&](const Ptr& ptr) {
if (ptr.getCellRef().getRefId() == id)
result.push_back(ptr);
return true;
});
}
return result;
}
int MWWorld::WorldModel::countSavedGameRecords() const