⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 factory.cpp

📁 网络游戏通用架构, 这是基于boost和libevent写的一个程序
💻 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 + -