📄 factory.cpp
字号:
#include "factory.h"
Factory::Factory()
: _opt_desc( "Class Types in Factory" )
{
}
Factory::~Factory()
{
for( vector<ClassInterface*>::iterator itor= _classes.begin(); itor!=_classes.end(); ++itor ){
delete (*itor);
}
for( list<DynamicFactory*>::iterator itor= _factories.begin(); itor!=_factories.end(); ++itor ){
delete (*itor);
}
}
void* Factory::newInstance( const string& __name ){ recursive_mutex::scoped_lock lock( _mutex ); ClassNameFindOp op( __name ); vector<ClassInterface*>::iterator itor= find_if( _classes.begin(), _classes.end(), op ); if( itor!=_classes.end() ){//we found it! assert( *itor ); return (*itor)->newInstance(); }else{ void* obj= NULL; for( list<DynamicFactory*>::iterator itor= _factories.begin(); itor!=_factories.end(); ++itor ){ assert( *itor ); obj= (*itor)->newInstance( __name ); if( obj ){ return obj; } } } return NULL;}void* Factory::newInstance( const int __type ){ if( __type==0 ){ return NULL; } recursive_mutex::scoped_lock lock( _mutex ); ClassTypeFindOp op( __type ); vector<ClassInterface*>::iterator itor= find_if( _classes.begin(), _classes.end(), op ); if( itor!=_classes.end() ){//we found it! assert( *itor ); return (*itor)->newInstance(); }else{ void* obj= NULL; for( list<DynamicFactory*>::iterator itor= _factories.begin(); itor!=_factories.end(); ++itor ){ assert( *itor ); obj= (*itor)->newInstance( __type ); if( obj ){ return obj; } } } return NULL;}void Factory::addClass( ClassInterface* __class )
{
recursive_mutex::scoped_lock lock( _mutex );
_classes.push_back( __class ); __class->register_type( _opt_desc );}
void Factory::parse_types( string& __typetab_filename )
{
try{
recursive_mutex::scoped_lock lock( _mutex );
ifstream typetab( __typetab_filename.c_str(), ios::in );
variables_map options;
if( typetab.good() ){ store( parse_config_file(typetab, _opt_desc), options );
notify( options ); }else{ cerr<< "Can't open type table file: " << __typetab_filename << endl; }
}catch( exception& e ){
cerr << "type table parsing error: " << e.what() << endl;
}catch( ... ){ cerr << "type table parsing error: " << "Unknown exception" << endl; }
for( list<DynamicFactory*>::iterator itor= _factories.begin(); itor!=_factories.end(); ++itor ){ assert( *itor ); (*itor)->parse_types( __typetab_filename ); }
}
void Factory::removeClass( const string& __name )
{
recursive_mutex::scoped_lock lock( _mutex );
ClassNameFindOp op( __name ); vector<ClassInterface*>::iterator itor= find_if( _classes.begin(), _classes.end(), op ); if( itor!=_classes.end() ){//we found it!
delete (*itor);
_classes.erase( itor );
}
}
bool Factory::loadFactory( const string& __filename, const string& __getFactory_func_name ){ DynamicFactory* factory= NULL; try{ factory= new DynamicFactory( __filename, __getFactory_func_name ); }catch( exception& e ){ cerr << "Load factory failed: " << __filename << " with " << __getFactory_func_name << "\t(" << e.what() << ")" << endl; }catch( ... ){ cerr << "Load factory failed: " << __filename << " with " << __getFactory_func_name << "\t(" << "Unknown exception" << ")" << endl; return false; } bool ret= factory->load(); if( ret ){ recursive_mutex::scoped_lock lock( _mutex ); _factories.push_back( factory ); }else{ cerr << "Load factory failed: " << __filename << " with " << __getFactory_func_name << endl; delete factory; } return ret;}void Factory::unloadFactory( const string& __filename ){ recursive_mutex::scoped_lock lock( _mutex ); FactoryFindOp op( __filename ); list<DynamicFactory*>::iterator itor= find_if( _factories.begin(), _factories.end(), op ); if( itor!=_factories.end() ){//we found it! delete (*itor); _factories.erase( itor ); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -