1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-02-05 14:45:37 +00:00

Merge pull request #2699 from elsid/get_items_owned_by_visitor

Avoid using temporary vector to get items owned by
This commit is contained in:
Alexei Dobrohotov 2020-02-12 11:38:56 +03:00 committed by GitHub
commit 36f1b632ec
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 7 additions and 20 deletions

View file

@ -269,7 +269,7 @@ namespace MWWorld
/// \attention This function also lists deleted (count 0) objects! /// \attention This function also lists deleted (count 0) objects!
/// \return Iteration completed? /// \return Iteration completed?
template<class Visitor> template<class Visitor>
bool forEach (Visitor& visitor) bool forEach (Visitor&& visitor)
{ {
if (mState != State_Loaded) if (mState != State_Loaded)
return false; return false;

View file

@ -330,7 +330,7 @@ namespace MWWorld
const auto navigator = MWBase::Environment::get().getWorld()->getNavigator(); const auto navigator = MWBase::Environment::get().getWorld()->getNavigator();
ListAndResetObjectsVisitor visitor; ListAndResetObjectsVisitor visitor;
(*iter)->forEach<ListAndResetObjectsVisitor>(visitor); (*iter)->forEach(visitor);
const auto world = MWBase::Environment::get().getWorld(); const auto world = MWBase::Environment::get().getWorld();
for (const auto& ptr : visitor.mObjects) for (const auto& ptr : visitor.mObjects)
{ {

View file

@ -2745,28 +2745,15 @@ namespace MWWorld
} }
} }
struct ListObjectsVisitor
{
std::vector<MWWorld::Ptr> mObjects;
bool operator() (Ptr ptr)
{
if (ptr.getRefData().getBaseNode())
mObjects.push_back(ptr);
return true;
}
};
void World::getItemsOwnedBy (const MWWorld::ConstPtr& npc, std::vector<MWWorld::Ptr>& out) void World::getItemsOwnedBy (const MWWorld::ConstPtr& npc, std::vector<MWWorld::Ptr>& out)
{ {
for (CellStore* cellstore : mWorldScene->getActiveCells()) for (CellStore* cellstore : mWorldScene->getActiveCells())
{ {
ListObjectsVisitor visitor; cellstore->forEach([&] (const auto& ptr) {
cellstore->forEach(visitor); if (ptr.getRefData().getBaseNode() && Misc::StringUtils::ciEqual(ptr.getCellRef().getOwner(), npc.getCellRef().getRefId()))
out.push_back(ptr);
for (const Ptr &object : visitor.mObjects) return true;
if (Misc::StringUtils::ciEqual(object.getCellRef().getOwner(), npc.getCellRef().getRefId())) });
out.push_back(object);
} }
} }