// This file is part of Glest // // Copyright (C) 2018 The Glest team // // Glest is a fork of MegaGlest // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see #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 game_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