00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef _FACTORYTEMPLATE_
00019 #define _FACTORYTEMPLATE_
00020
00021 #include <map>
00022
00023 template<class IdType, class BaseClass, class IdHasher>
00024 class FactoryTemplate
00025 {
00026 public:
00027 typedef BaseClass* (*CreateFunc)();
00028 private:
00029 std::map<IdType, CreateFunc, IdHasher> m_creators;
00030 public:
00031 FactoryTemplate()
00032 {
00033 }
00034
00035 void RegisterType(const IdType& id, CreateFunc& creator)
00036 {
00037 if(!IsTypeRegistered(id))
00038 m_creators[id] = creator;
00039 }
00040
00041 void UnregisterType(const IdType& id)
00042 {
00043 if(IsTypeRegistered(id))
00044 m_creators.erase(id);
00045 }
00046
00047 template<class Class>
00048 Class* CreateObject(const IdType& id)
00049 {
00050 if(IsTypeRegistered(id))
00051 {
00052 CreateFunc& creator = m_creators[id];
00053 return (Class*)creator();
00054 }
00055
00056 return 0;
00057 }
00058
00059 bool IsTypeRegistered(const IdType& id)
00060 {
00061 return m_creators.find(id) != m_creators.end();
00062 }
00063 };
00064
00065 #endif