Files
ResInsight/Fwk/AppFwk/cafProjectDataModel/cafPdmXml/cafPdmDefaultObjectFactory.cpp
Magne Sjaastad 0e57cfe201 Memory Management : Adjustment and fixes
Add release of several static singleton objects
Fix several minor memory leaks
2022-03-03 14:39:41 +01:00

92 lines
3.0 KiB
C++

#include "cafPdmDefaultObjectFactory.h"
#include <set>
namespace caf
{
//--------------------------------------------------------------------------------------------------
/// PdmObjectFactory implementations
//--------------------------------------------------------------------------------------------------
PdmDefaultObjectFactory* PdmDefaultObjectFactory::sm_singleton = nullptr;
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
PdmDefaultObjectFactory::~PdmDefaultObjectFactory()
{
// Each keyword alias is connected to the one creator object, so it is not possible to traverse the map directly and
// delete the creator objects. Create a set of unique creator objects.
std::set<PdmObjectCreatorBase*> uniqueObjects;
for ( const auto& f : m_factoryMap )
{
uniqueObjects.insert( f.second );
}
for ( auto obj : uniqueObjects )
{
if ( obj ) delete obj;
}
m_factoryMap.clear();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
PdmDefaultObjectFactory* PdmDefaultObjectFactory::instance()
{
createSingleton();
return sm_singleton;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void PdmDefaultObjectFactory::createSingleton()
{
if ( !sm_singleton ) sm_singleton = new PdmDefaultObjectFactory;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void PdmDefaultObjectFactory::deleteSingleton()
{
if ( sm_singleton ) delete sm_singleton;
sm_singleton = nullptr;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
PdmObjectHandle* PdmDefaultObjectFactory::create( const QString& classNameKeyword )
{
std::map<QString, PdmObjectCreatorBase*>::iterator entryIt;
entryIt = m_factoryMap.find( classNameKeyword );
if ( entryIt != m_factoryMap.end() )
{
return entryIt->second->create();
}
return nullptr;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<QString> PdmDefaultObjectFactory::classKeywords() const
{
std::vector<QString> names;
for ( const auto& entry : m_factoryMap )
{
names.push_back( entry.first );
}
return names;
}
} // End of namespace caf