Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members

BasicClassRegistry.h

Go to the documentation of this file.
00001 /*******************************************************************\ 00002 00003 Copyright (C) 2003 Joseph Coffland 00004 00005 This program is free software; you can redistribute it and/or 00006 modify it under the terms of the GNU General Public License 00007 as published by the Free Software Foundation; either version 2 00008 of the License, or (at your option) any later version. 00009 00010 This program is distributed in the hope that it will be useful, 00011 but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00013 GNU General Public License for more details. 00014 00015 You should have received a copy of the GNU General Public License 00016 along with this program; if not, write to the Free Software 00017 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 00018 02111-1307, USA. 00019 00020 For information regarding this software email 00021 jcofflan@users.sourceforge.net 00022 00023 \*******************************************************************/ 00024 00025 #ifndef BASICCLASSREGISTRY_H 00026 #define BASICCLASSREGISTRY_H 00027 00028 #include "BasicException.h" 00029 #include "BasicClassFactoryBase.h" 00030 #include "BasicSmartPointer.h" 00031 00032 #include <string> 00033 #include <map> 00034 00035 template <class T> 00036 class BasicClassRegistry { 00037 typedef std::map<std::string, BasicClassFactoryBase<T> *> factoryMap_t; 00038 factoryMap_t factoryMap; 00039 00040 public: 00041 BasicClassRegistry() {} 00042 00043 ~BasicClassRegistry() { 00044 typename factoryMap_t::iterator it; 00045 for (it = factoryMap.begin(); it != factoryMap.end(); it++) 00046 delete it->second; 00047 } 00048 00049 BasicClassFactoryBase<T> *unregisterFactory(const std::string id) { 00050 BasicClassFactoryBase<T> *factory = factoryMap[id]; 00051 factoryMap.erase(id); 00052 return factory; 00053 } 00054 00055 void registerFactory(BasicClassFactoryBase<T> *factory, 00056 const std::string id) { 00057 ASSERT_OR_THROW(std::string("registerFactory() Factory with id '") + 00058 id + "' already registered", 00059 factoryMap.find(id) == factoryMap.end()); 00060 00061 factoryMap[id] = factory; 00062 } 00063 00064 BasicSmartPointer<T> create(const std::string id) { 00065 BasicClassFactoryBase<T> *factory = factoryMap[id]; 00066 ASSERT_OR_THROW(std::string("create() Factory '") + id + "' not found!", 00067 factory); 00068 00069 return BasicSmartPointer<T>(factory->create()); 00070 } 00071 }; 00072 00073 #endif

Generated on Thu Sep 16 16:17:17 2004 for nostdinc by doxygen 1.3.8