logplus/OSGDataModel/include/ObjectGenralFactory.h

84 lines
1.9 KiB
C
Raw Permalink Normal View History

2025-10-29 17:23:30 +08:00
/**
* @file ObjectGenralFactory.h
* @brief key,value为创建任意基类的函数指针
* @date 2014-5-28
* @author: liyonggang
*/
#ifndef PAI_FRAME_OSGGENERALFACTORY_H
#define PAI_FRAME_OSGGENERALFACTORY_H
#pragma warning( push ,0)
#include <map>
#include "OSGDataModel.h"
#pragma warning( pop )
BEGIN_OSGDATAMODEL_NAMESPACE;
template <typename keyClassName,typename baseclassname>
class CObjectGenralFactory
{
public:
typedef baseclassname* (*pCreateObjectFunction)();
void Rigister( keyClassName key,pCreateObjectFunction func )
{
m_map[key] = func;
}
baseclassname* CreateObject(keyClassName key)
{
typename std::map< keyClassName,pCreateObjectFunction >::iterator it = m_map.find( key );
if ( it != m_map.end() )
{
return (it->second)();
}
return NULL;
}
bool IsSupport( keyClassName s )
{
return m_map.find( s ) != m_map.end();
}
std::map< keyClassName,pCreateObjectFunction > m_map;
};
template <typename keyClassName,typename baseclassname>
class CObjectGenralFactoryAuto
{
public:
typedef baseclassname* (*pCreateObjectFunction)();
CObjectGenralFactoryAuto( keyClassName* keyArr,pCreateObjectFunction func )
{
keyClassName defaultKey;
for( long i = 0;;i++)
{
if( keyArr[i] != defaultKey )
{
baseclassname::GetFatory().Rigister( keyArr[i],func );
}else
{
break;
}
}
}
};
#define BEGIN_REGISTER(keyClassName,baseclassname,className)\
baseclassname *Create##className()\
{\
return new className() ;\
}\
keyClassName g_##className##RegPairs[]={\
#define END_REGISTER(keyClassName,baseclassname,className)\
,keyClassName() };\
datamodel::CObjectGenralFactoryAuto<keyClassName,baseclassname> g_##className##GeneralRegister(g_##className##RegPairs,Create##className);
OSGDATAMODEL_EXPORT QStringList LoadAllPlugin(const QString &PluginTypeName);
END_OSGDATAMODEL_NAMESPACE
#endif