// ============================================================== // This file is part of Glest Shared Library (www.glest.org) // // Copyright (C) 2001-2008 MartiƱo Figueroa // // You can redistribute this code and/or modify it under // the terms of the GNU General Public License as published // by the Free Software Foundation; either version 2 of the // License, or (at your option) any later version // ============================================================== #ifndef _SHARED_UTIL_FACTORY_ #define _SHARED_UTIL_FACTORY_ #include #include #include #include "platform_util.h" #include "leak_dumper.h" using std::map; using std::string; using std::pair; using std::runtime_error; namespace Shared{ namespace Util{ // ===================================================== // class SingleFactoryBase // ===================================================== class SingleFactoryBase{ public: virtual ~SingleFactoryBase(){} virtual void *newInstance()= 0; }; // ===================================================== // class SingleFactory // ===================================================== template class SingleFactory: public SingleFactoryBase{ public: virtual void *newInstance() {return new T();} }; // ===================================================== // class MultiFactory // ===================================================== template class MultiFactory{ private: typedef map Factories; typedef pair FactoryPair; private: Factories factories; public: virtual ~MultiFactory(){ for(Factories::iterator it= factories.begin(); it!=factories.end(); ++it){ delete it->second; } factories.clear(); } template void registerClass(string classId){ factories.insert(FactoryPair(classId, new SingleFactory())); } T *newInstance(string classId){ Factories::iterator it= factories.find(classId); if(it == factories.end()){ throw megaglest_runtime_error("Unknown class identifier: " + classId); } return static_cast(it->second->newInstance()); } bool isClassId(string classId){ return factories.find(classId)!=factories.end(); } }; }}//end namespace #endif