Performance: Cache the uiCapability to costly dynamic_cast

This commit is contained in:
Magne Sjaastad
2023-10-13 14:57:37 +02:00
parent 57aa033809
commit f1823da6d7
3 changed files with 18 additions and 9 deletions

View File

@@ -13,8 +13,9 @@ namespace caf
//--------------------------------------------------------------------------------------------------
PdmObjectHandle::PdmObjectHandle()
{
m_parentField = nullptr;
m_isDeletable = false;
m_parentField = nullptr;
m_isDeletable = false;
m_uiCapability = nullptr;
m_isInsideInitAfterRead = false;
}
@@ -146,7 +147,8 @@ void PdmObjectHandle::removeReferencingPtrField( PdmFieldHandle* fieldReferringT
//--------------------------------------------------------------------------------------------------
void PdmObjectHandle::prepareForDelete()
{
m_parentField = nullptr;
m_parentField = nullptr;
m_uiCapability = nullptr;
for ( size_t i = 0; i < m_capabilities.size(); ++i )
{

View File

@@ -164,6 +164,8 @@ private:
// Use friend class to avoid public noise
friend class PdmXmlObjectHandle;
bool m_isInsideInitAfterRead;
mutable PdmUiObjectHandle* m_uiCapability;
};
} // namespace caf

View File

@@ -24,9 +24,8 @@ PdmUiObjectHandle::PdmUiObjectHandle( PdmObjectHandle* owner, bool giveOwnership
PdmUiObjectHandle* uiObj( const PdmObjectHandle* obj )
{
if ( !obj ) return nullptr;
PdmUiObjectHandle* uiObject = obj->capability<PdmUiObjectHandle>();
CAF_ASSERT( uiObject );
return uiObject;
return obj->uiCapability();
}
//--------------------------------------------------------------------------------------------------
@@ -232,10 +231,16 @@ void PdmUiObjectHandle::updateUiIconFromToggleField()
//--------------------------------------------------------------------------------------------------
PdmUiObjectHandle* PdmObjectHandle::uiCapability() const
{
PdmUiObjectHandle* uiField = capability<PdmUiObjectHandle>();
CAF_ASSERT( uiField );
if ( !m_uiCapability )
{
// Cache the ui capability for performance reasons
auto uiField = capability<PdmUiObjectHandle>();
CAF_ASSERT( uiField );
return uiField;
m_uiCapability = uiField;
}
return m_uiCapability;
}
} // End namespace caf