/* * MessageCallbackFactory.h * * Created on: 28/07/2010 * Author: victor */ #ifndef MESSAGECALLBACKFACTORY_H_ #define MESSAGECALLBACKFACTORY_H_ #include "engine/engine.h" namespace server { namespace zone { template class ObjectCreatorMap : public HashTable { int hash(const TypeId& k) { return (int)k; } public: ObjectCreatorMap() { HashTable::setNullValue(NULL); } }; template class MessageCallbackFactory; template BaseClassType CreateObject(Param1Type param1) { return new ClassType(param1); } template class MessageCallbackFactory { protected: typedef BaseClassType (*CreateObjectFunc)(Param1Type); public: BaseClassType createObject(UniqueIdType uniqueID, Param1Type param1) { if (!objectCreator.containsKey(uniqueID)) return NULL; return objectCreator.get(uniqueID)(param1); } template bool registerObject(UniqueIdType uniqueID) { if (objectCreator.containsKey(uniqueID)) return false; objectCreator.put(uniqueID, &CreateObject); return true; } bool unregisterObject(UniqueIdType uniqueID) { return objectCreator.drop(uniqueID); } bool containsObject(UniqueIdType uniqueID) { return objectCreator.containsKey(uniqueID); } protected: ObjectCreatorMap objectCreator; }; template BaseClassType CreateObject(Param1Type param1, Param2Type param2) { return new ClassType(param1, param2); } template class MessageCallbackFactory { protected: typedef BaseClassType (*CreateObjectFunc)(Param1Type, Param2Type); public: BaseClassType createObject(UniqueIdType uniqueID, Param1Type param1, Param2Type param2) { CreateObjectFunc func = objectCreator.get(uniqueID); if (func != NULL) return func(param1, param2); else return NULL; } template bool registerObject(UniqueIdType uniqueID) { objectCreator.put(uniqueID, &CreateObject); return true; } bool unregisterObject(UniqueIdType uniqueID) { return objectCreator.drop(uniqueID); } bool containsObject(UniqueIdType uniqueID) { return objectCreator.containsKey(uniqueID); } protected: ObjectCreatorMap objectCreator; }; } } using namespace server::zone; #endif /* MESSAGECALLBACKFACTORY_H_ */