From 38bc3120042a61e0a15a5e02a82f489af71b25df Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Tue, 13 Feb 2018 11:25:34 -0800 Subject: [PATCH] faster and const EntityTree::findByID() --- libraries/entities/src/EntityTree.cpp | 21 ++++++++++++++------- libraries/entities/src/EntityTree.h | 6 +++--- libraries/shared/src/SpatialParentFinder.h | 2 +- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index bf29f3bec9..60bcc85575 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -913,18 +913,25 @@ void EntityTree::findEntities(RecurseOctreeOperation& elementFilter, recurseTreeWithOperation(elementFilter, nullptr); } -EntityItemPointer EntityTree::findEntityByID(const QUuid& id) { +EntityItemPointer EntityTree::findEntityByID(const QUuid& id) const { EntityItemID entityID(id); return findEntityByEntityItemID(entityID); } -EntityItemPointer EntityTree::findEntityByEntityItemID(const EntityItemID& entityID) /*const*/ { - EntityItemPointer foundEntity = NULL; - EntityTreeElementPointer containingElement = getContainingElement(entityID); - if (containingElement) { - foundEntity = containingElement->getEntityWithEntityItemID(entityID); +EntityItemPointer EntityTree::findEntityByEntityItemID(const EntityItemID& entityID) const { + EntityItemPointer foundEntity = nullptr; + { + QReadLocker locker(&_entityMapLock); + foundEntity = _entityMap.value(entityID); + } + if (foundEntity && !foundEntity->getElement()) { + // special case to maintain legacy behavior: + // if the entity is in the map but not in the tree + // then pretend the entity doesn't exist + return EntityItemPointer(nullptr); + } else { + return foundEntity; } - return foundEntity; } void EntityTree::fixupTerseEditLogging(EntityItemProperties& properties, QList& changedProperties) { diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index 8cb89d6493..90fe342f57 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -132,9 +132,9 @@ public: /// \param position point of query in world-frame (meters) /// \param targetRadius radius of query (meters) EntityItemPointer findClosestEntity(const glm::vec3& position, float targetRadius); - EntityItemPointer findEntityByID(const QUuid& id); - EntityItemPointer findEntityByEntityItemID(const EntityItemID& entityID); - virtual SpatiallyNestablePointer findByID(const QUuid& id) override { return findEntityByID(id); } + EntityItemPointer findEntityByID(const QUuid& id) const; + EntityItemPointer findEntityByEntityItemID(const EntityItemID& entityID) const; + virtual SpatiallyNestablePointer findByID(const QUuid& id) const override { return findEntityByID(id); } EntityItemID assignEntityID(const EntityItemID& entityItemID); /// Assigns a known ID for a creator token ID diff --git a/libraries/shared/src/SpatialParentFinder.h b/libraries/shared/src/SpatialParentFinder.h index aae7d9f040..c19babbc7f 100644 --- a/libraries/shared/src/SpatialParentFinder.h +++ b/libraries/shared/src/SpatialParentFinder.h @@ -21,7 +21,7 @@ using SpatiallyNestableWeakPointer = std::weak_ptr; using SpatiallyNestablePointer = std::shared_ptr; class SpatialParentTree { public: - virtual SpatiallyNestablePointer findByID(const QUuid& id) { return nullptr; } + virtual SpatiallyNestablePointer findByID(const QUuid& id) const { return nullptr; } }; class SpatialParentFinder : public Dependency {